天天看點

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

本節書摘來異步社群《hadoop mapreduce性能優化》一書中的第2章,第2.1節,作者: 【法】khaled tannir 譯者: 範歡動 責編: 楊海玲,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

hadoop mapreduce性能優化

正如第1章中提到的那樣,有很多因素會對hadoop mapreduce性能産生影響。一般說來,與工作負載相關的hadoop性能優化需要關注以下3個主要方面:系統硬體、系統軟體,以及hadoop基礎設施元件的配置和調優/優化。

需要指出的是,hadoop被歸類為高擴充性解決方案,但卻不足以歸類為高性能叢集解決方案。系統管理者可以通過各種配置選項來配置和調優hadoop叢集。性能配置參數主要關注cpu使用率、記憶體占用情況、磁盤i/o和網絡流量。除了hadoop主要性能參數以外,其他系統參數,如機架間帶寬,也可能影響叢集的整體性能。

hadoop可以按照使用者需要進行配置和定制,可以通過對安裝完成後自動生成的配置檔案進行修改來滿足應用和叢集的特定需要。

配置檔案分為兩類,即隻讀預設配置檔案和站點特定配置檔案。

第一類包括core-default.xm、hdfs-default.xml和mapred-default.xml。

第二類包括core-site.xml、hdfs-site.xml和mapred-site.xml。

hadoop配置檔案中有大量變量,通過定義或者修改這些變量,可以滿足控制hadoop配置的需要。這些變量定義在配置檔案core-site.xml、hdfs-site.xml和mapred-site.xml中。其中一些變量用于指定系統中特定檔案的路徑,而其他變量則用于從不同角度調整hadoop架構,而且可以從不同粒度深入其内部。每個配置檔案都有多個用xml格式表示的名稱-值對(name-value pair),它們從不同角度定義hadoop的工作方式。

從系統硬體的角度看,要衡量合理的硬體配置,需要關注性能、可擴充性及成本要求。從軟體的角度看,選擇運作hadoop必需的作業系統、jvm(java虛拟機)、特定的hadoop版本以及其他軟體元件對于性能以及環境的穩定有着重要的意義。任何hadoop項目,如果要充分獲得hadoop軟硬體分布式解決方案帶來的好處,其設計、建構、配置以及調優階段都意義重大。

mapred-site.xml是提高hadoop mapreduce性能的關鍵配置檔案。這個配置檔案包含了與cpu、記憶體、磁盤i/o和網絡相關的參數。

1.與cpu相關的參數

表2-1所示的兩個參數與cpu使用率關聯最為密切。通過修改這些變量,可以指定由tasktracker節點并發運作的map/reduce任務的最大數量。這兩個參數預設值為2。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

理論上,上述預設值的增加有助于提高cpu使用率,進而提高性能,但這需要根據叢集資源精巧地設定,如cpu(是否考慮超線程因素)和可用記憶體;否則,就會有mapreduce作業和叢集性能整體降級的風險。

使用者經常會問的一個典型問題是:mapper/reducer數量設定為多少才能獲得最佳性能?要設定這個值,需要考慮tasktracker資源(如cpu、記憶體和磁盤i/o)使用率。而且,還要考慮運作的作業是否是cpu密集型的。

為了厘清這些參數設定,我們假設你擁有10個hadoop叢集節點,每個節點有1個四核cpu。這樣,全部守護程序應該不超過10(節點)× 4(cpu核)= 40個。考慮到需要分别為datanode守護程序和tasktracker守護程序各預留1個cpu核,是以留給map/reduce任務的cpu核還剩38個。

不必把mapper和reducer的數量設定為相同的值,因為該項設定依賴于每項任務的cpu使用率,也依賴mapper和reducer完成作業并得到最後結果的方式。你可以把cpu資源配置設定給mapper和reducer各50%,也可以配置設定三分之二給mapper,三分之一給reducer,或者其他能夠使叢集運作最優的配置設定方式。

如果把該值設為−1,hadoop将使用管理者為mapper和reducer任務配置設定的全部記憶體。如果将這個值設定為超過實際cpu核的數目,将會導緻密集的cpu上下文切換(參見第4章),這會造成叢集性能顯著降級。

2.與磁盤i/o相關的參數

為了優化磁盤i/o操作,你需要判斷是否需要使用資料壓縮,預設情況下這個開關項處于關閉狀态。可以通過修改控制壓縮的參數預設值來啟用資料壓縮。mapred.compress.map.output變量啟用map輸出壓縮,mapred.output.compress變量啟用作業輸出壓縮,mapred.map.output.compression.codec變量用于定義壓縮的編解碼方式,如表2-2所示。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

啟用map任務的輸出壓縮可以有效減少寫入存儲系統的中間資料量。是以,這會在shuffle階段和寫入階段加速磁盤寫操作,進而減少資料傳輸的總時間。用壓縮技術加速磁盤寫操作會在壓縮/解壓過程中帶來額外的cpu開銷。

實際經驗表明,隻有當輸入資料量很大而且容易拆分時(如文本檔案),才應該啟用壓縮;否則會造成叢集性能的降級。

要獲得磁盤i/o的平衡并大幅提升i/o性能,可以使用向多個位置寫入的功能,把資料寫到每個節點的所有磁盤上。與使用raid 0資料分條技術相比,使用多個實體裝置會帶來大約50%的性能提升。

表 2-3所示的兩個參數決定了hadoop中用來存儲資料的位置。可以使用mapred.local.dir指定中間map輸出資料的存儲位置,而使用dfs.data.dir指定hdfs資料的存儲位置。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

3.與記憶體相關的參數

記憶體資源非常重要,精确配置設定記憶體資源可以有效地避免記憶體交換,并優化hadoop作業的運作。可以使用與記憶體相關的參數來設定為mapreduce作業預留的實體記憶體的數量。表2-4列出了常用的與記憶體相關的參數。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

mapred.child.ulimit預設值未指定。如果為這個參數指定值,則該值要大于(至少等于)參數mapred.child.java.opts的–xmx值;否則,java虛拟機可能無法啟動。要正确設定此參數,其值應大于2×mapred.child.java.opts。

使用與記憶體相關的參數還可以優化合并與排序。有三個參數可以優化mapreduce的合并與排序的性能,如表2-5所示。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

增加io.sort.mb和io.sort.factor的值會為排序與合并操作配置設定更多的記憶體。這會減少對磁盤的流量沖擊,進而減少mapper和reducer任務的i/o時間。但是,上述變量的增加會導緻每一個map任務需要的記憶體增加,當為每一任務配置設定的記憶體不足時,會增加記憶體垃圾收集活動的開銷。

經驗表明,磁盤溢寫量很大時,以及sort/shuffle階段i/o時間很長時,io.sort.factor值需要相應加大。當map輸出很大,造成map端i/o很頻繁時,可以考慮增加io.sort.mb的值。為了避免出現“任務耗盡記憶體”這樣的錯誤,io.sort.mb的值應該大于0.25×mapred.child.java.opts且小于0.5×mapred.child.java.opts。

通過增加mapred.job.reduce.input.buffer.percent的值可以得到更多的記憶體緩沖區,進而在reduce階段減少本地磁盤i/o時間。不過,前面已經提過,如果配置設定更多記憶體,就會在釋放未用記憶體時增加垃圾收集的開銷。是以,如果map輸出很大,以及reduce排序階段本地磁盤i/o很頻繁,就應該配置設定更多的記憶體。

4.與網絡相關的參數

hadoop有一個叫做“機架感覺”(rack awareness)的概念。系統管理者可以為叢集中每一個datanode定義機架。hadoop機架感覺非常重要,因為它可以避免資料丢失,而一個好的機架感覺配置可以改善網絡性能。表2-6中給出的是使hadoop建立機架感覺的變量。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

增加mapred.reduce.parallel.copies的值會增加網絡流量,加速map輸出的複制過程,但需要消耗更多cpu。建議隻在mapper任務産生的輸出量非常大的時候才考慮增加這一參數的值。

hadoop機架感覺特性是通過core-site.xml檔案中的topology.script.<code></code>file.name參數配置的。該參數指向一個使用者定義的腳本檔案,用來決定機架到主機的映射(rack1: datanode1, datanode2……rack2:datanode6, datanode7……)。如果未配置topology.script.file.name參數,同一機架上所有節點的ip位址都傳遞為/default-rack。

hdfs-site.xml配置檔案包含許多與hdfs存儲系統相關的參數,通過修改這些參數可以達到對hadoop安裝定制并調優的目的。檔案系統塊大小的值是hdfs-site.xml檔案中最常用的調優hdfs的參數。這一參數控制着每個map任務将會處理的輸入分片的大小。輸入分片的大小通過三個主要變量來指定:dfs.block.size(在hdfs-site.xml中)、mapred.min.split.size和mapred.max.split.size(後兩個都在mapred-site.xml中)。

預設情況下,dfs.block.size設定為67108864位元組(64 mb)。增加此值會産生更大的輸入分片,因而減少存放在每個datanode上的塊的數量。

map任務的總數依賴于輸入資料的大小和總的輸入分片的大小。而map輸出的大小與hdfs塊的大小成正比,如果加大塊的大小的同時不對與資料溢流(spill)相關的屬性做調整,可能會導緻map側資料溢流。

為了最大化資料吞吐量,塊大小應該與輸入資料相适應。對于非常大的輸入檔案,最好用大資料塊(128mb甚至256mb),而對于小檔案,用小一些的資料塊更好。需要注意的是,通過調整dfs.block.size參數,在寫入檔案時,讓同一檔案系統上存在不同塊大小的檔案是可能的(要了解塊大小的影響參見第5章)。

表2-7列出的是hdfs-site.xml配置檔案中可以設定的主要參數。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

改變塊大小會對很多方面産生影響。多數情況下,采用更大的塊大小來拆分檔案會減少塊的數量,進而減少namenode上的中繼資料,這一點對非常大的檔案顯得非常重要。而且,這也為用戶端不經過與namenode互動而讀寫更多資料帶來可能。

塊減少,所需的存儲檔案的節點數也随之減少。這可能會使并行通路的總體吞吐量降低,還可能會使資料本地任務的排程更加困難。

并行吞吐量降低的同時可能意味着不能獲得最大程度的并行性,這會降低運作成本但叢集可能利用不夠充分。這會增加任務拖延的可能性,而且一個任務的失敗可能會導緻很多任務返工。

塊減少還意味着每個任務處理的資料量增大,進而産生額外的讀寫操作。

core-site.xml是hadoop的主要配置檔案之一,它包含了對整個hadoop通用的配置。它在每個叢集中的主機上都存在。

基本上,core-site.xml的變量可以改變或者定義分布式檔案系統的名字、臨時目錄以及其他與網絡配置相關的參數,如表2-8所示。

《Hadoop MapReduce性能優化》一2.1 研究Hadoop參數

對于小規模叢集,所有的伺服器通常都是通過一台交換機連接配接起來的。是以,本地性名額隻有兩個:on-machine(聯機)和off-machine(脫機)。從hdfs向namenode的本地驅動器加載資料時,namenode僅排程傳輸到本地datanode的一份副本,然後從叢集中随機挑選另外兩台機器存儲資料的複制件。

對于跨多個機架的大型hadoop叢集,就務必保證每個機架上都有資料的複制件。這樣,因為複制件的存在,是以在發生交換機故障時才不會造成資料塊不可用。

參數io.file.buffer.size用來設定i/o操作時hadoop使用的緩沖區的大小。這個參數的預設值為4096位元組(4 kb)。在現代系統上,為了獲得性能增益,這個參數可以增加至65536位元組(64 kb)或者131071位元組(128 kb)。