Hadoop平台常用配置及優化建議
2015-06-09 15:42
hduhans
閱讀(3960)
評論(0)
編輯
收藏
舉報
當發現作業運作效率不理想時,需要對作業執行進行性能監測,以及對作業本身、叢集平台進行優化。優化後的叢集可能最大化利用硬體資源,進而提高作業的執行效率。本文記錄了在hadoop叢集平台搭建以及作業運作過程中一些常用優化手段,在使用中會不斷補充,不斷翻閱。
一、對應用程式進行調優
1、避免輸入大量小檔案。大量的小檔案(不足一個block大小)作為輸入資料會産生很多的Map任務(預設一個分片對應一個Map任務),而每個Map任務實際工作量又非常小,系統要花更多的時間來将這些Map任務的輸出進行整合。如果将大量的小檔案進行預處理合并成一個或幾個大檔案,任務執行的效率可能會提升幾十倍。可手動将小檔案合并成大檔案,或通過Hadoop的SequenceFile、CombineFileInputFormat将多個檔案打包到一個輸入單元中,使得每個Map處理更多的資料,進而提高性能。
2、預判并過濾無用資料。可以使用一些過濾工具,在作業執行之前将資料中無用的資料進行過濾,可極大提高MapReduce執行效率。Bloom Filter是一種功能強大的過濾器,執行效率高,時間複雜度為O(1),缺點是存在一定的誤判可能,詳細參考《Bloom Filter概念和原理》。當将一個非常大的表和一個非常小的表進行表連接配接操作時,可以使用Bloom Filter将小表資料作為Bloom Filter的輸入資料,将大表的原始資料進行過濾(過濾不通過的資料一定是不可用的,過濾通過的資料可能有用可能無用),可提高程式執行的效率。
3、合理使用分布式緩存DistributedCache。DistributedCache可以将一些字典、jar包、配置檔案等緩存到需要執行map任務的節點中,避免map任務多次重複讀取這些資源,尤其在join操作時,使用DistributedCache緩存小表資料在map端進行join操作,可避免shuffle、reduce等操作,提高程式運作效率。
4、重用Writable類型。避免大量多次new這些Writable對象,這會花費java垃圾收集器大量的清理工作,建議在map函數外定義這些Writable對象,如下所示:
class MyMapper … {
Text wordText = new Text();
IntWritable one = new IntWritable(1);
public void map(...) {
for (String word: words) {
wordText.set(word);
context.write(wordText, one);
}
}
}
View Code
5、合理設定Combiner。Combine階段處于Map端操作的最後一步,設定Combine操作可大大提高MapReduce的執行效率,前提是增加Combine不能改變最終的結果值,換句話說,不是所有的MapReduce程式都能添加Combine,如求平均數的MapReduce程式就不适合設定Combine操作。通常Combine函數與Reduce函數一緻
二、對參數進行調優(基于hadoop2.6.0)
1、HDFS參數調優(hdfs-site.xml)
▶ dfs.namenode.handler.count:namenode用于處理RPC的線程數,預設值10,可根據NameNode所在節點機器配置适當調大,如32、64;
▶ dfs.datanode.handler.count:datanode上用于處理RPC的線程數,2.6版本預設值10,早期1.x版本預設值為3,可根據datanode節點的配置适當調整;
2、MapReduce參數調優(mapred-site.xml)
▶ mapreduce.tasktracker.map.tasks.maximum:每個nodemanager節點上可運作的最大map任務數,預設值2,可根據實際值調整為10~100;
▶ mapreduce.tasktracker.reduce.tasks.maximum:每個nodemanager節點上可運作的最大reduce任務數,預設值2,可根據實際值調整為10~100;
▶ mapreduce.output.fileoutputformat.compress:是否對map任務産生的結果進行壓縮,預設值false。對傳輸資料進行壓縮,既可以減少檔案的存儲空間,又可以加快資料在網絡不同節點之間的傳輸速度。
▶ mapreduce.output.fileoutputformat.compress.type:map産生任務資料的壓縮方式,預設值RECORD,可配置值有:NONE、RECORD、BLOCK
▶ mapreduce.task.io.sort.mb:map任務輸出結果的記憶體環形緩沖區大小,預設值100M,可根據map節點的機器進行配置,貌似不能超過值mapred.child.java.opts;
▶ mapreduce.map.sort.spill.percent:map任務輸出環形緩沖區大小溢寫觸發最大比例,預設值80%,這個值一般不建議修改;
▶ mapreduce.reduce.shuffle.parallelcopies:reduce節點通過http拷貝map輸出結果資料到本地的最大工作線程數,預設值5,可根據節點機器配置适當修改;
▶ mapreduce.reduce.shuffle.input.buffer.percent:reduce節點在shuffle階段拷貝map輸出結果資料到本地時,記憶體緩沖區大小所占JVM記憶體的比例,預設值0.7,一般不建議修改;
▶ mapreduce.reduce.shuffle.merge.percent:reduce節點shuffle記憶體緩沖區溢寫觸發最大比例,預設值0.66,一般不建議修改;
▶ mapred.child.java.opts:配置每個map或reduce使用的記憶體數量,預設值-Xmx200m,即200M。如果nodemanager所在節點
- 分類 hadoop相關