大數據優化方案----MapReduce優化方法

版權聲明:本文爲CSDN博主「北京小輝」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/silentwolfyh/article/details/103863655
———————————————————————————————————

“無意中發現了一個巨牛的人工智能教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看小說一樣!覺得太牛了,所以分享給大家。點這裏可以跳轉到教程。”。

大數據面試寶典目錄,請點擊

MapReduce跑的慢的原因(☆☆☆☆☆)

一、Mapreduce 程序效率的瓶頸在於兩點:

1) 計算機性能
CPU、內存、磁盤健康、網絡
2) I/O 操作優化
(1) 數據傾斜
(2) map 和reduce 數設置不合理
(3) reduce 等待過久
(4) 小文件過多
(5) 大量的不可分塊的超大文件
(6) spill 次數過多
(7) merge 次數過多等。

二、MapReduce優化方法(☆☆☆☆☆)

1)數據輸入:
(1)合併小文件:在執行mr 任務前將小文件進行合併,大量的小文件會產生大量的map 任務,增
大map 任務裝載次數,而任務的裝載比較耗時,從而導致mr 運行較慢。
(2)採用ConbinFileInputFormat 來作爲輸入,解決輸入端大量小文件場景。
2)map 階段
(1)減少spill 次數:通過調整io.sort.mb 及sort.spill.percent 參數值,增大觸發spill 的內存上限,
減少spill 次數,從而減少磁盤IO。
(2)減少merge 次數:通過調整io.sort.factor 參數,增大merge 的文件數目,減少merge 的次數,
從而縮短mr 處理時間。
(3)在map 之後先進行combine 處理,減少I/O。
3)reduce 階段
(1)合理設置map 和reduce 數:兩個都不能設置太少,也不能設置太多。太少,會導致task 等
待,延長處理時間;太多,會導致map、reduce 任務間競爭資源,造成處理超時等錯誤。
(2)設置map、reduce 共存:調整slowstart.completedmaps 參數,使map 運行到一定程度後,reduce
也開始運行,減少reduce 的等待時間。
(3)規避使用reduce,因爲Reduce 在用於連接數據集的時候將會產生大量的網絡消耗。
(4)合理設置reduc 端的buffer,默認情況下,數據達到一個閾值的時候,buffer 中的數據就會寫入磁盤,然後reduce 會從磁盤中獲得所有的數據。也就是說,buffer 和educe 是沒有直接關聯的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那麼就可以通過參數來配置,使得buffer 中的一部分數據可以直接輸送到reduce,從而減少IO 開銷:mapred.job.reduce.input.buffer.percent,默認爲0.0。當值大於0 的時候,會保留指定比例的內存讀buffer 中的數據直接拿給reduce 使用。這樣一來,設置buffer 需要內存,讀取數據需要內存,reduce 計算也要內存,所以要根據作業的運行情況進行調整。
4)IO 傳輸
(1)採用數據壓縮的方式,減少網絡IO 的的時間。安裝Snappy 和LZOP 壓縮編碼器。
(2)使用SequenceFile 二進制文件
5)數據傾斜問題
(1)數據傾斜現象
數據頻率傾斜——某一個區域的數據量要遠遠大於其他區域。數據大小傾斜——部分記錄的大小遠遠大於平均值。
(2)如何收集傾斜數據
在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)減少數據傾斜的方法
方法1:抽樣和範圍分區
       可以通過對原始數據進行抽樣得到的結果集來預設分區邊界值。
方法2:自定義分區
       另一個抽樣和範圍分區的替代方案是基於輸出鍵的背景知識進行自定義分區。例如,如果map 輸出鍵的單詞來源於一本書。其中大部分必然是省略詞(stopword)。那麼就可以將自定義分區將這部分省略詞發送給固定的一部分reduce 實例。而將其他的都發送給剩餘的reduce 實例。
方法3:Combine
       使用Combine 可以大量地減小數據頻率傾斜和數據大小傾斜。在可能的情況下,
combine 的目的就是聚合並精簡數據。

6) 常用的調優參數
(1) 資源相關參數
       (a) 以下參數是在用戶自己的mr 應用程序中配置就可以生效(mapred-default.xml)
在這裏插入圖片描述       (b)應該在yarn 啓動之前就配置在服務器的配置文件中才能生效(yarn-default.xml)
在這裏插入圖片描述       (c)shuffle 性能優化的關鍵參數,應在yarn 啓動之前就配置好(mapred-default.xml)
在這裏插入圖片描述
(2) 容錯相關參數(mapreduce 性能優化)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章