Hadoop 六 Hadoop企業優化

2022-06-17 12:36:14 字數 4218 閱讀 3301

mapreduce 程式效率的瓶頸在於兩點:

cpu、記憶體、磁碟健康、網路

(1)資料傾斜

(2)map和reduce數設定不合理

(3)map執行時間太長,導致reduce等待過久

(4)小檔案過多

(5)大量的不可分塊的超大檔案

(6)spill次數過多

(7)merge次數過多等。

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

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

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

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

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

(3)在map之後,不影響業務邏輯前提下,先進行combine處理,減少 i/o。

(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)減少資料傾斜的方法

方法1:抽樣和範圍分割槽

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

方法2:自定義分割槽

基於輸出鍵的背景知識進行自定義分割槽。例如,如果map輸出鍵的單詞**於一本書。且其中某幾個專業詞彙較多。那麼就可以自定義分割槽將這這些專業詞彙傳送給固定的一部分reduce例項。而將其他的都傳送給剩餘的reduce例項。

方法3:combine

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

方法4:採用map join,盡量避免reduce join。

2.6.1、資源相關引數

1)以下引數是在使用者自己的mr應用程式中配置就可以生效(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%

2.6.2、容錯相關引數

配置引數

引數說明

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提高效率。

hdfs小檔案解決方案:

1)hadoop archive

是乙個高效地將小檔案放入hdfs塊中的檔案存檔工具,它能夠將多個小檔案打包成乙個har檔案,這樣就減少了namenode的記憶體使用。

2)sequence file

sequence file由一系列的二進位制key/value組成,如果key為檔名,value為檔案內容,則可以將大批小檔案合併成乙個大檔案。

3)combinefileinputformat

combinefileinputformat是一種新的inputformat,用於將多個檔案合併成乙個單獨的split,另外,它會考慮資料的儲存位置。

4)開啟jvm重用

對於大量小檔案job,可以開啟jvm重用會減少45%執行時間。

jvm重用原理:乙個map執行在乙個jvm上,開啟重用的話,該map在jvm上執行完畢後,jvm繼續執行其他map。

具體設定:mapreduce.job.jvm.numtasks值在10-20之間。

Hadoop 企業優化

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

hadoop之 hadoop能為企業做什麼?

hadoop是什麼?hadoop能做什麼?hadoop擅長日誌分析,facebook就用hive來進行日誌分析,2009年時facebook就有非程式設計人員的30 的人使用hiveql進行資料分析 搜尋中的自定義篩選也使用的hive 利用pig還可以做高階的資料處理,包括twitter linke...

hadoop的企業優化

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