> 你準備好面試了嗎?這裡有一些面試中可能會問到的問題以及相對應的答案。如果你需要更多的面試經驗和麵試題,關註一下"張飛的豬大數據分享"吧,公眾號會不定時的分享相關的知識和資料。 ## 1、MapReduce優化方法 1)數據輸入 (1)合併小文件:在執行mr任務前將小文件進行合併,大量的小文件會產 ...
你準備好面試了嗎?這裡有一些面試中可能會問到的問題以及相對應的答案。如果你需要更多的面試經驗和麵試題,關註一下"張飛的豬大數據分享"吧,公眾號會不定時的分享相關的知識和資料。
1、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)合理設置reduce端的buffer,預設情況下,數據達到一個閾值的時候,buffer中的數據就會寫入磁碟,然後reduce會從磁碟中獲得所有的數據。也就是說,buffer和reduce是沒有直接關聯的,中間多個一個寫磁碟->讀磁碟的過程,既然有這個弊端,那麼就可以通過參數來配置,使得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的目的就是聚合併精簡數據。
2、MapReduce跑得慢的原因?
Mapreduce 程式效率的瓶頸在於兩點:
1)電腦性能
CPU、記憶體、磁碟健康、網路
2)I/O 操作優化
(1)數據傾斜
(2)map和reduce數設置不合理
(3)reduce等待過久
(4)小文件過多
(5)大量的不可分塊的超大文件
(6)spill次數過多
(7)merge次數過多等
3、HDFS小文件優化方法
1)HDFS小文件弊端:
HDFS上每個文件都要在namenode上建立一個索引,這個索引的大小約為150byte,這樣當小文件比較多的時候,就會產生很多的索引文件,一方面會大量占用namenode的記憶體空間,另一方面就是索引文件過大是的索引速度變慢。
2)解決的方式:
(1)Hadoop本身提供了一些文件壓縮的方案。
(2)從系統層面改變現有HDFS存在的問題,其實主要還是小文件的合併,然後建立比較快速的索引。
3)Hadoop自帶小文件解決方案
(1)Hadoop Archive:
是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣在減少namenode記憶體使用的同時。
(2)Sequence file:
sequence file由一系列的二進位key/value組成,如果為key小文件名,value為文件內容,則可以將大批小文件合併成一個大文件。
(3)CombineFileInputFormat:
CombineFileInputFormat是一種新的inputformat,用於將多個文件合併成一個單獨的split,另外,它會考慮數據的存儲位置。
4、更多大數據面試集錦
本文來自博客園,作者:張飛的豬,轉載請註明原文鏈接:https://www.cnblogs.com/the-pig-of-zf/p/17576338.html
公眾號:張飛的豬大數據分享,不定期分享大數據學習的總結和相關資料,歡迎關註。
個人網站"張飛的豬編程工作室"鏈接: https://zhangfeidezhu.com