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...