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


  當發現作業運行效率不理想時,需要對作業執行進行性能監測,以及對作業本身、集群平台進行優化。優化后的集群可能最大化利用硬件資源,從而提高作業的執行效率。本文記錄了在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所在節點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM