天天看點

Hadoop平台常用配置及優化建議 - hduhans

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相關
Hadoop平台常用配置及優化建議 - hduhans