目錄
1 Yarn
1.1 Yarn概述
Yarn是一個資源調度平臺,負責爲運算程序調度服務器運算資源,相當於一個分佈式的操作系統平臺,而MapReduce等運算程序相當於運算在操作系統上的應用程序
1.2 Yarn基本結構
Yarn主要有ResourceManager、NodeManager、ApplicationMaster和Container等組件構成
1) ResourceManager(rm):處理客戶端請求、啓動/監控ApplicationMaster、監控NodeManager、資源分配與調度;
2)NodeManager(nm):單個節點上的資源管理、處理來自ResourceManager的命令、處理來自ApplicationMaster的命令;
3)ApplicationMaster:數據切分、爲應用程序申請資源,並分配給內部任務、任務監控與容錯。
4)Container:對任務運行環境的抽象,封裝了CPU、內存等多維資源以及環境變量、啓動命令等任務運行相關的信息。
1.3 Yarn工作機制
工作機制詳細流程:
- 先將MR程序提交到客戶端所在節點,準備運行MR
- Yarnrunner向ResourceManager申請啓動一個Application
- RM將該應用程序所需要的資源路徑返回給yarnrunner
- 該程序將運行所需要的資源信息提及到HDFS上
- 程序資源信息提交完畢之後,申請運行MrApplicationMaster
- RM將及用戶的請求初始化爲一個task放入任務隊列中
- 一個NodeManager領取到task任務
- 該NodeManager節點創建容器Container,併產生一個MrApplicationMaster
- Container從HDFS上將該task'所需要的資源信息拷貝到本地
- MrApplicationMaster向RM申請運行maptask所需要的資源
- MR將運行maptask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務創建Container容器
- MrApplicationMaster向兩個接受到任務的NodeManager發送程序啓動腳本,這兩個NodeManager分別啓動maptask,maptask對數據進行處理
- MrApplicationMaster等所有的maptask運行完畢之後,向RM申請容器、資源,運行reduce task
- reduce task 向maptask獲取對應的分區的數據
- 程序運行完畢之後。MR向RM申請註銷
1.4 資源調度器
目前,Hadoop作業調度器主要有三種:FIFO、Capacity Scheduler和Fair Scheduler。Hadoop2.7.2默認的資源調度器是Capacity Scheduler。具體設置詳見:yarn-default.xml
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
1. 先進先出調度器(FIFO)
2. 容量調度器(Capacity Scheduler)
3. 公平調度器(Fair Scheduler)
2 hadoop企業優化
2.1 MapReduce跑的慢的原因
Mapreduce 程序效率的瓶頸在於兩點:
1.計算機性能
CPU、內存、磁盤健康、網絡
2.I/O 操作優化
(1)數據傾斜
(2)map和reduce數設置不合理 combineTextinputformat,分區
(3)map運行時間太長,導致reduce等待過久
(4)小文件過多
(5)spill(溢出)次數過多,溢出數據到磁盤,
(6)merge次數過多等。Shuffule,溢出之後會有合併,reduce端也會有合併
2.2 MapReduce優化方法
MapReduce優化方法主要從六個方面考慮:數據輸入、Map階段、Reduce階段、IO傳輸、數據傾斜問題和常用的調優參數。
2.2.1 數據輸入
(1)合併小文件:在執行mr任務前將小文件進行合併,大量的小文件會產生大量的map任務,大量節點資源被佔用,從而導致mr整體運行較慢。
(2)採用CombineTextInputFormat來作爲輸入,解決輸入端大量小文件場景。
2.2.2 Map階段
1)減少溢寫(spill)次數:通過調整io.sort.mb及sort.spill.percent參數值(在mapred-default.xml),增大觸發spill的內存上限,減少spill次數,從而減少磁盤IO。
2)減少合併(merge)次數:通過調整io.sort.factor參數(在mapred-default.xml),增大merge的文件數目,減少merge的次數,從而縮短mr處理時間。
3)在map之後,不影響業務邏輯前提下,先進行combine處理,減少 I/O。
2.2.3 Reduce階段
1)合理設置map和reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、reduce任務間競爭資源,造成處理超時等錯誤。
2)設置map、reduce共存:調整slowstart.completedmaps參數,使map運行到一定程度後,reduce也開始運行,減少reduce的等待時間。
3)合理設置reduce端的buffer:默認情況下,數據達到一個閾值的時候,buffer中的數據就會寫入磁盤,然後reduce會從磁盤中獲得所有的數據。也就是說,buffer和reduce是沒有直接關聯的,中間多一個寫磁盤->讀磁盤的過程,既然有這個弊端,那麼就可以通過參數來配置,使得buffer中的一部分數據可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認爲0.0。當值大於0的時候,會保留指定比例的內存讀buffer中的數據直接拿給reduce使用。這樣一來,設置buffer需要內存,讀取數據需要內存,reduce計算也要內存,所以要根據作業的運行情況進行調整。
2.2.4 數據傾斜問題
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:自定義分區
基於輸出鍵的背景知識進行自定義分區。例如,如果map輸出鍵的單詞來源於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分區將這這些專業詞彙發送給固定的一部分reduce實例。而將其他的都發送給剩餘的reduce實例。
方法2:Combine
使用Combine可以大量地減小數據傾斜。在可能的情況下,combine的目的就是聚合並精簡數據。
方法3:採用Map Join,儘量避免Reduce Join。
3 常見錯誤及解決方案
1) 導包容易出錯。尤其Text和CombineTextInputFormat。
2) Mapper中第一個輸入的參數必須是LongWritable或者NullWritable,不可以是IntWritable. 報的錯誤是類型轉換異常。
3) java.lang.Exception: java.io.IOException: Illegal partition for 13926435656 (4),說明partition和reducetask個數沒對上,調整reducetask個數。
4) 如果分區數不是1,但是reducetask爲1,是否執行分區過程。答案是:不執行分區過程。因爲在maptask的源碼中,執行分區的前提是先判斷reduceNum個數是否大於1。不大於1肯定不執行。
5)在Windows環境編譯的jar包導入到linux環境中運行,
hadoop jar wc.jar com.bigdata.mapreduce.wordcount.WordCountDriver /user/bigdata/ /user/bigdata/output
報如下錯誤:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/bigdata/mapreduce/wordcount/WordCountDriver : Unsupported major.minor version 52.0
原因是Windows環境用的jdk1.7,linux環境用的jdk1.8。
解決方案:統一jdk版本。
6)緩存pd.txt小文件案例中,報找不到pd.txt文件
原因:大部分爲路徑書寫錯誤。還有就是要檢查pd.txt的問題。還有個別電腦寫相對路徑找不到pd.txt,可以修改爲絕對路徑。
7)報類型轉換異常。
通常都是在驅動函數中設置map輸出和最終輸出時編寫錯誤。Map輸出的key如果沒有排序,也會報類型轉換異常。
8)集羣中運行wc.jar時出現了無法獲得輸入文件。
原因:wordcount案例的輸入文件不能放在hdfs集羣的根目錄。