Hadoop企业优化
Hadoop企業(yè)優(yōu)化
1.1 MapReduce跑的慢的原因
Mapreduce 程序效率的瓶頸在于兩點:
1.計算機(jī)性能
CPU、內(nèi)存、磁盤健康、網(wǎng)絡(luò)
2.I/O 操作優(yōu)化
(1)數(shù)據(jù)傾斜
(2)map和reduce數(shù)設(shè)置不合理 combineTextinputformat,分區(qū)
(3)map運(yùn)行時間太長,導(dǎo)致reduce等待過久
(4)小文件過多
(5)spill(溢出)次數(shù)過多,溢出數(shù)據(jù)到磁盤,
(6)merge次數(shù)過多等。Shuffule,溢出之后會有合并,reduce端也會有合并
1.2 MapReduce優(yōu)化方法
MapReduce優(yōu)化方法主要從六個方面考慮:數(shù)據(jù)輸入、Map階段、Reduce階段、IO傳輸、數(shù)據(jù)傾斜問題和常用的調(diào)優(yōu)參數(shù)。
1.2.1 數(shù)據(jù)輸入
(1)合并小文件:在執(zhí)行mr任務(wù)前將小文件進(jìn)行合并,大量的小文件會產(chǎn)生大量的map任務(wù),大量節(jié)點資源被占用,從而導(dǎo)致mr整體運(yùn)行較慢。
(2)采用CombineTextInputFormat來作為輸入,解決輸入端大量小文件場景。
1.2.2 Map階段
1)減少溢寫(spill)次數(shù):通過調(diào)整io.sort.mb及sort.spill.percent參數(shù)值(在mapred-default.xml),增大觸發(fā)spill的內(nèi)存上限,減少spill次數(shù),從而減少磁盤IO。
2)減少合并(merge)次數(shù):通過調(diào)整io.sort.factor參數(shù)(在mapred-default.xml),增大merge的文件數(shù)目,減少merge的次數(shù),從而縮短mr處理時間。
3)在map之后,不影響業(yè)務(wù)邏輯前提下,先進(jìn)行combine處理,減少 I/O。
1.2.3 Reduce階段
1)合理設(shè)置map和reduce數(shù):兩個都不能設(shè)置太少,也不能設(shè)置太多。太少,會導(dǎo)致task等待,延長處理時間;太多,會導(dǎo)致 map、reduce任務(wù)間競爭資源,造成處理超時等錯誤。
2)設(shè)置map、reduce共存:調(diào)整slowstart.completedmaps參數(shù),使map運(yùn)行到一定程度后,reduce也開始運(yùn)行,減少reduce的等待時間。
3)合理設(shè)置reduce端的buffer:默認(rèn)情況下,數(shù)據(jù)達(dá)到一個閾值的時候,buffer中的數(shù)據(jù)就會寫入磁盤,然后reduce會從磁盤中獲得所有的數(shù)據(jù)。也就是說,buffer和reduce是沒有直接關(guān)聯(lián)的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那么就可以通過參數(shù)來配置,使得buffer中的一部分?jǐn)?shù)據(jù)可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認(rèn)為0.0。當(dāng)值大于0的時候,會保留指定比例的內(nèi)存讀buffer中的數(shù)據(jù)直接拿給reduce使用。這樣一來,設(shè)置buffer需要內(nèi)存,讀取數(shù)據(jù)需要內(nèi)存,reduce計算也要內(nèi)存,所以要根據(jù)作業(yè)的運(yùn)行情況進(jìn)行調(diào)整。
1.2.4 數(shù)據(jù)傾斜問題
1.數(shù)據(jù)傾斜現(xiàn)象
數(shù)據(jù)頻率傾斜——某一個區(qū)域的數(shù)據(jù)量要遠(yuǎn)遠(yuǎn)大于其他區(qū)域。
2.如何收集傾斜數(shù)據(jù)
在reduce方法中加入記錄map輸出鍵的詳細(xì)情況的功能。
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ū)
基于輸出鍵的背景知識進(jìn)行自定義分區(qū)。例如,如果map輸出鍵的單詞來源于一本書。且其中某幾個專業(yè)詞匯較多。那么就可以自定義分區(qū)將這這些專業(yè)詞匯發(fā)送給固定的一部分reduce實例。而將其他的都發(fā)送給剩余的reduce實例。
方法2:Combine
使用Combine可以大量地減小數(shù)據(jù)傾斜。在可能的情況下,combine的目的就是聚合并精簡數(shù)據(jù)。
方法3:采用Map Join,盡量避免Reduce Join。
總結(jié)
以上是生活随笔為你收集整理的Hadoop企业优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电信信息日志使用mapreduce统计的
- 下一篇: 从 ES 到 Kylin,斗鱼客户端性能