上一篇:085-BigData-13MapReduce案例分析
續(xù)上
六、Hadoop企業(yè)優(yōu)化
1、MapReduce 跑的慢的原因
Mapreduce 程序效率的瓶頸在于兩點:
1)計算機性能
CPU、內存、磁盤健康、網(wǎng)絡
2)I/O 操作優(yōu)化
(1)數(shù)據(jù)傾斜
(2)map和reduce數(shù)設置不合理
(3)map運行時間太長,導致reduce等待過久
(4)小文件過多
(5)大量的不可分塊的超大文件
(6)spill次數(shù)過多
(7)merge次數(shù)過多等。
2、MapReduce優(yōu)化方法
MapReduce優(yōu)化方法主要從六個方面考慮:數(shù)據(jù)輸入、Map階段、Reduce階段、IO傳輸、數(shù)據(jù)傾斜問題和常用的調優(yōu)參數(shù)。
3、數(shù)據(jù)輸入
(1)合并小文件:在執(zhí)行mr任務前將小文件進行合并,大量的小文件會產(chǎn)生大量的map任務,增大map任務裝載次數(shù),而任務的裝載比較耗時,從而導致mr運行較慢。
(2)采用CombineTextInputFormat來作為輸入,解決輸入端大量小文件場景。
4、Map階段
1)減少溢寫(spill)次數(shù):通過調整io.sort.mb及sort.spill.percent參數(shù)值,增大觸發(fā)spill的內存上限,減少spill次數(shù),從而減少磁盤IO。
2)減少合并(merge)次數(shù):通過調整io.sort.factor參數(shù),增大merge的文件數(shù)目,減少merge的次數(shù),從而縮短mr處理時間。
3)在map之后,不影響業(yè)務邏輯前提下,先進行combine處理,減少 I/O。
5、Reduce階段
1)合理設置map和reduce數(shù):兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、reduce任務間競爭資源,造成處理超時等錯誤。
2)設置map、reduce共存:調整slowstart.completedmaps參數(shù),使map運行到一定程度后,reduce也開始運行,減少reduce的等待時間。
3)規(guī)避使用reduce:因為reduce在用于連接數(shù)據(jù)集的時候將會產(chǎn)生大量的網(wǎng)絡消耗。
4)合理設置reduce端的buffer:默認情況下,數(shù)據(jù)達到一個閾值的時候,buffer中的數(shù)據(jù)就會寫入磁盤,然后reduce會從磁盤中獲得所有的數(shù)據(jù)。也就是說,buffer和reduce是沒有直接關聯(lián)的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那么就可以通過參數(shù)來配置,使得buffer中的一部分數(shù)據(jù)可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認為0.0。當值大于0的時候,會保留指定比例的內存讀buffer中的數(shù)據(jù)直接拿給reduce使用。這樣一來,設置buffer需要內存,讀取數(shù)據(jù)需要內存,reduce計算也要內存,所以要根據(jù)作業(yè)的運行情況進行調整。
6、 IO傳輸
1)采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡IO的的時間。安裝使用Snappy和LZO壓縮編碼器。
2)使用SequenceFile二進制文件。
7、數(shù)據(jù)傾斜問題
1)數(shù)據(jù)傾斜現(xiàn)象
數(shù)據(jù)頻率傾斜——某一個區(qū)域的數(shù)據(jù)量要遠遠大于其他區(qū)域。
數(shù)據(jù)大小傾斜——部分記錄的大小遠遠大于平均值。
2)如何收集傾斜數(shù)據(jù)
在reduce方法中加入記錄map輸出鍵的詳細情況的功能。
public static final String MAX_VALUES = "skew.maxvalues";
private int maxValueThreshold;
@Override
public void configure(JobConf job) {
maxValueThreshold = job.getInt(MAX_VALUES, 100);
}
@Override
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output,
Reporter reporter) throws IOException {
int i = 0;
while (values.hasNext()) {
values.next();
i++;
}
if (++i > maxValueThreshold) {
log.info("Received " + i + " values for key " + key);
}
}
3)減少數(shù)據(jù)傾斜的方法
方法1:抽樣和范圍分區(qū)
可以通過對原始數(shù)據(jù)進行抽樣得到的結果集來預設分區(qū)邊界值。
方法2:自定義分區(qū)
基于輸出鍵的背景知識進行自定義分區(qū)。例如,如果map輸出鍵的單詞來源于一本書。且其中某幾個專業(yè)詞匯較多。那么就可以自定義分區(qū)將這這些專業(yè)詞匯發(fā)送給固定的一部分reduce實例。而將其他的都發(fā)送給剩余的reduce實例。
方法3:Combine
使用Combine可以大量地減小數(shù)據(jù)傾斜。在可能的情況下,combine的目的就是聚合并精簡數(shù)據(jù)。
方法4:采用Map Join,盡量避免Reduce Join。
7、常用的調優(yōu)參數(shù)
1)資源相關參數(shù)
(1)以下參數(shù)是在用戶自己的mr應用程序中配置就可以生效(mapred-default.xml)


(2)應該在yarn啟動之前就配置在服務器的配置文件中才能生效(yarn-default.xml)

(3)shuffle性能優(yōu)化的關鍵參數(shù),應在yarn啟動之前就配置好(mapred-default.xml)

2)容錯相關參數(shù)(mapreduce性能優(yōu)化)

HDFS小文件優(yōu)化方法
8、HDFS小文件弊端
HDFS上每個文件都要在namenode上建立一個索引,這個索引的大小約為150byte,這樣當小文件比較多的時候,就會產(chǎn)生很多的索引文件,一方面會大量占用namenode的內存空間,另一方面就是索引文件過大是的索引速度變慢。
9、解決方案
1)Hadoop Archive:
是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣就減少了namenode的內存使用。
2)Sequence file:
sequence file由一系列的二進制key/value組成,如果key為文件名,value為文件內容,則可以將大批小文件合并成一個大文件。
3)CombineFileInputFormat:
CombineFileInputFormat是一種新的inputformat,用于將多個文件合并成一個單獨的split,另外,它會考慮數(shù)據(jù)的存儲位置。
4)開啟JVM重用
對于大量小文件Job,可以開啟JVM重用會減少45%運行時間。
JVM重用理解:一個map運行一個jvm,重用的話,在一個map在jvm上運行完畢后,jvm繼續(xù)運行其他map。
具體設置:mapreduce.job.jvm.numtasks值在10-20之間。
七、MapReduce實戰(zhàn)
這需要寫代碼,多寫幾個案列。