十八 Hadoop的優化

2021-10-24 05:33:13 字數 3993 閱讀 7898

終於看到這麼親民的標題了,一般到了優化的部分,基本上就接近尾聲了。沒錯,hadoop部分即將結束了,hadoop ha部分的講解就放到zookeeper之後吧,畢竟ha要用到zookeeper。關注專欄《破繭成蝶——大資料篇》檢視相關系列的文章~

目錄

一、mapreduce執行慢的原因

二、mapreduce優化方法

2.1 資料輸入

2.2 map階段

2.3 reduce階段

2.4 io傳輸

2.5 資料傾斜問題

2.6 常用的引數調優

三、hdfs小檔案優化方法

3.1 小檔案的弊端

3.2 小檔案解決方案

首先我們來看一下有哪些原因導致mapreduce執行緩慢。首先可能是因為計算機的效能,例如:cpu、記憶體、磁碟、網路等等。當然還有一些其他的原因,例如:(1)資料傾斜,(2)map和reduce數設定不合理,(3)map執行時間過長導致reduce等待太久,(4)小檔案過多,(5)大量的不可分塊的超大檔案,(6)spill次數過多,(7)merge次數過多等等。

mapreduce優化方法主要從六個方面考慮:資料輸入、map階段、reduce階段、io傳輸、資料傾斜問題和常用的調優引數。

1、合併小檔案。再執行mapreduce任務前將小檔案進行合併,大量的小檔案會產生大量的map任務,增大map任務裝載次數,而任務的裝載比較耗時,從而導致mapreduce執行較慢。

2、採用combinetextinputformat來作為輸入,解決輸入端大量小檔案場景。

1、減少溢寫(spill)次數。通過調整io.sort.mb以及sort.spill.percent引數值,增大觸發spill的記憶體上限,減少spill次數,從而減少磁碟io。

2、減少合併(merge)次數。通過調整io.sort.factor引數,增大merge的檔案數目,減少merge的次數,從而縮短mapreduce的處理時間。

3、在map之後,不影響業務邏輯的前提下,先進行combiner處理,減少io。

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開銷。mapreduce.reduce.input.buffer.percent預設為0.0。當值大於0的時候,會保留指定比例的記憶體讀buffer中的資料直接拿給reduce使用。這樣一來,設定buffer需要記憶體,讀取資料需要記憶體,reduce計算也需要記憶體,所以需要根據作業的運**況進行調整。

2、使用sequencefile二進位制檔案。

資料傾斜可以分為兩類,一類是資料頻率傾斜,一類是資料大小傾斜。資料頻率傾斜是指某乙個區域的資料量要遠遠大於其他區域。資料大小傾斜是指部分記錄的大小遠遠大於平均值。可以使用如下方法減少資料傾斜。

1、抽樣和範圍分割槽。可以通過對原始資料進行抽樣得到的結果集來預設分割槽邊界值 。

2、自定義分割槽。基於輸出鍵的背景知識進行自定義分割槽。

3、combine。使用combine可以大量減小資料傾斜,在可能的情況下,combine的目的就是聚合並精簡資料。

4、採用map join,盡量避免reduce join。

1、以下引數可以配置在自己的應用程式中(mapred-default.xml)。

配置引數

引數說明

mapreduce.map.memory.mb

乙個maptask可使用的資源上限(單位:mb),預設為1024。如果maptask實際使用的資源量超過該值,則會被強制殺死。

mapreduce.reduce.memory.mb

乙個reducetask可使用的資源上限(單位:mb),預設為1024。如果reducetask實際使用的資源量超過該值,則會被強制殺死。

mapreduce.map.cpu.vcores

每個maptask可使用的最多cpu core數目,預設值: 1

mapreduce.reduce.cpu.vcores

每個reducetask可使用的最多cpu core數目,預設值: 1

mapreduce.reduce.shuffle.parallelcopies

每個reduce去map中取資料的並行數。預設值是5

mapreduce.reduce.shuffle.merge.percent

buffer中的資料達到多少比例開始寫入磁碟。預設值0.66

mapreduce.reduce.shuffle.input.buffer.percent

buffer大小佔reduce可用記憶體的比例。預設值0.7

mapreduce.reduce.input.buffer.percent

指定多少比例的記憶體用來存放buffer中的資料,預設值是0.0

2、在yarn啟動之前就配置在伺服器的配置檔案中才能生效(yarn-default.xml)。

配置引數

引數說明

yarn.scheduler.minimum-allocation-mb  

給應用程式container分配的最小記憶體,預設值:1024

yarn.scheduler.maximum-allocation-mb         

給應用程式container分配的最大記憶體,預設值:8192

yarn.scheduler.minimum-allocation-vcores  

每個container申請的最小cpu核數,預設值:1

yarn.scheduler.maximum-allocation-vcores 

每個container申請的最大cpu核數,預設值:32

yarn.nodemanager.resource.memory-mb  

給containers分配的最大物理記憶體,預設值:8192

3、shuffle效能優化的關鍵引數,應在yarn啟動之前就配置好(mapred-default.xml)。

配置引數

引數說明

mapreduce.task.io.sort.mb  

shuffle的環形緩衝區大小,預設100m

mapreduce.map.sort.spill.percent  

環形緩衝區溢位的閾值,預設80%

4、容錯相關引數(mapreduce效能優化)。

配置引數

引數說明

mapreduce.map.maxattempts

每個map task最大重試次數,一旦重試引數超過該值,則認為map task執行失敗,預設值:4。

mapreduce.reduce.maxattempts

每個reduce task最大重試次數,一旦重試引數超過該值,則認為map task執行失敗,預設值:4。

mapreduce.task.timeout

hdfs上每個檔案都要在namenode上建立乙個索引,這個索引的大小約為150byte,這樣當小檔案比較多的時候,就會產生很多的索引檔案,一方面會大量占用namenode的記憶體空間,另一方面就是索引檔案過大使得索引速度變慢。

小檔案的優化無非以下幾種方式:(1)在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳hdfs。(2)在業務處理之前,在hdfs上使用mapreduce程式對小檔案進行合併。(3)在mapreduce處理時,可採用combinetextinputformat提高效率。(4)開啟jvm重用,將mapreduce.job.jvm.numtasks的值設定在10-20之間。

hadoop的企業優化

前言 mapreduce程式的效率的瓶頸在於兩點 計算機效能 cpu 記憶體 磁碟健康 網路 i o操作 資料傾斜 map和reduce數量設定不合理 map的執行時間太長,導致reduc的等待過久 小檔案過多 大量的補課分塊的超大檔案 spill 溢寫 次數過多 merge 合併 次數過多 map...

Hadoop 六 Hadoop企業優化

mapreduce 程式效率的瓶頸在於兩點 cpu 記憶體 磁碟健康 網路 1 資料傾斜 2 map和reduce數設定不合理 3 map執行時間太長,導致reduce等待過久 4 小檔案過多 5 大量的不可分塊的超大檔案 6 spill次數過多 7 merge次數過多等。mapreduce優化方法...

Hadoop 企業優化

mapreduce優化方法主要從六個方面考慮 資料輸入 map階段 reduce階段 io傳輸 資料傾斜問題和常用的調優引數。2.6.1 資源相關引數 以下引數是在使用者自己的mr應用程式中配置就可以生效 mapred default.xml 配置引數 引數說明 mapreduce.map.memo...