大數(shù)據(jù)之Hadoop - MapReduce(4)

第6章 Hadoop企業(yè)優(yōu)化

6.1 MapReduce 跑的慢的原因

MapReduce 程序效率的瓶頸在于兩點:
1 計算機性能:CPU、內存、磁盤健康、網(wǎng)絡
2 I/O 操作優(yōu)化
(1)數(shù)據(jù)傾斜
(2)Map和Reduce數(shù)設置不合理
(3)Map運行時間太長,導致Reduce等待過久
(4)小文件過多
(5)大量的不可分塊的超大文件
(6)Spill次數(shù)過多
(7)Merge次數(shù)過多等。

6.2 MapReduce優(yōu)化方法

MapReduce優(yōu)化方法主要從六個方面考慮:數(shù)據(jù)輸入、Map階段、Reduce階段、IO傳輸、數(shù)據(jù)傾斜問題和常用的調優(yōu)參數(shù)。

6.2.1 數(shù)據(jù)輸入

(1)合并小文件:在執(zhí)行MR任務前將小文件進行合并,大量的小文件會產生大量的Map任務,增大Map任務裝載次數(shù),而任務的裝載比較耗時,從而導致MR運行較慢。
(2)采用CombineTextInputFormat來作為輸入,解決輸入端大量小文件場景。

6.2.2 Map階段

(1)減少溢寫(Spill)次數(shù):通過調整io.sort.mb及sort.spill.percent參數(shù)值,增大觸發(fā)Spill的內存上限,減少Spill次數(shù),從而減少磁盤IO。
(2)減少合并(Merge)次數(shù):通過調整io.sort.factor參數(shù),增大Merge的文件數(shù)目,減少Merge的次數(shù),從而縮短MR處理時間。
(3)在Map之后,不影響業(yè)務邏輯前提下,先進行Combine處理,減少 I/O。

6.2.3 Reduce階段

(1)合理設置Map和Reduce數(shù):兩個都不能設置太少,也不能設置太多。太少,會導致Task等待,延長處理時間;太多,會導致Map、Reduce任務間競爭資源,造成處理超時等錯誤。
(2)設置Map、Reduce共存:調整slowstart.completedmaps參數(shù),使Map運行到一定程度后,Reduce也開始運行,減少Reduce的等待時間。
(3)規(guī)避使用Reduce:因為Reduce在用于連接數(shù)據(jù)集的時候將會產生大量的網(wǎng)絡消耗。
(4)合理設置Reduce端的Buffer:默認情況下,數(shù)據(jù)達到一個閾值的時候,Buffer中的數(shù)據(jù)就會寫入磁盤,然后Reduce會從磁盤中獲得所有的數(shù)據(jù)。也就是說,Buffer和Reduce是沒有直接關聯(lián)的,中間多次寫磁盤->讀磁盤的過程,既然有這個弊端,那么就可以通過參數(shù)來配置,使得Buffer中的一部分數(shù)據(jù)可以直接輸送到Reduce,從而減少IO開銷:mapreduce.reduce.input.buffer.percent,默認為0.0。當值大于0的時候,會保留指定比例的內存讀Buffer中的數(shù)據(jù)直接拿給Reduce使用。這樣一來,設置Buffer需要內存,讀取數(shù)據(jù)需要內存,Reduce計算也要內存,所以要根據(jù)作業(yè)的運行情況進行調整。

6.2.4 I/O傳輸

(1)采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡IO的的時間。安裝Snappy和LZO壓縮編碼器。
(2)使用SequenceFile二進制文件。

6.2.5 數(shù)據(jù)傾斜問題

數(shù)據(jù)傾斜現(xiàn)象
數(shù)據(jù)頻率傾斜——某一個區(qū)域的數(shù)據(jù)量要遠遠大于其他區(qū)域。
數(shù)據(jù)大小傾斜——部分記錄的大小遠遠大于平均值。

減少數(shù)據(jù)傾斜的方法
方法1:抽樣和范圍分區(qū)
可以通過對原始數(shù)據(jù)進行抽樣得到的結果集來預設分區(qū)邊界值。

方法2:自定義分區(qū)
基于輸出鍵的背景知識進行自定義分區(qū)。例如,如果Map輸出鍵的單詞來源于一本書。且其中某幾個專業(yè)詞匯較多。那么就可以自定義分區(qū)將這這些專業(yè)詞匯發(fā)送給固定的一部分Reduce實例。而將其他的都發(fā)送給剩余的Reduce實例。

方法3:Combine
使用Combine可以大量地減小數(shù)據(jù)傾斜。在可能的情況下,Combine的目的就是聚合并精簡數(shù)據(jù)。

方法4:采用Map Join,盡量避免Reduce Join。

6.2.6 常用的調優(yōu)參數(shù)

1 資源相關參數(shù)
(1)以下參數(shù)是在用戶自己的MR應用程序中配置就可以生效(mapred-default.xml)

配置參數(shù) 參數(shù)說明
mapreduce.map.memory.mb 一個MapTask可使用的資源上限(單位:MB),默認為1024。如果MapTask實際使用的資源量超過該值,則會被強制殺死。
mapreduce.reduce.memory.mb 一個ReduceTask可使用的資源上限(單位:MB),默認為1024。如果ReduceTask實際使用的資源量超過該值,則會被強制殺死。
mapreduce.map.cpu.vcores 每個MapTask可使用的最多cpu core數(shù)目,默認值: 1
mapreduce.reduce.cpu.vcores 每個ReduceTask可使用的最多cpu core數(shù)目,默認值: 1
mapreduce.reduce.shuffle.parallelcopies 每個Reduce去Map中取數(shù)據(jù)的并行數(shù)。默認值是5
mapreduce.reduce.shuffle.merge.percent Buffer中的數(shù)據(jù)達到多少比例開始寫入磁盤。默認值0.66
mapreduce.reduce.shuffle.input.buffer.percent Buffer大小占Reduce可用內存的比例。默認值0.7
mapreduce.reduce.input.buffer.percent 指定多少比例的內存用來存放Buffer中的數(shù)據(jù),默認值是0.0

(2)應該在YARN啟動之前就配置在服務器的配置文件中才能生效(yarn-default.xml)

配置參數(shù) 參數(shù)說明
yarn.scheduler.minimum-allocation-mb 給應用程序Container分配的最小內存,默認值:1024
yarn.scheduler.maximum-allocation-mb 給應用程序Container分配的最大內存,默認值:8192
yarn.scheduler.minimum-allocation-vcores 每個Container申請的最小CPU核數(shù),默認值:1
yarn.scheduler.maximum-allocation-vcores 每個Container申請的最大CPU核數(shù),默認值:32
yarn.nodemanager.resource.memory-mb 給Containers分配的最大物理內存,默認值:8192

(3)Shuffle性能優(yōu)化的關鍵參數(shù),應在YARN啟動之前就配置好(mapred-default.xml)

配置參數(shù) 參數(shù)說明
mapreduce.task.io.sort.mb Shuffle的環(huán)形緩沖區(qū)大小,默認100m
mapreduce.map.sort.spill.percent 環(huán)形緩沖區(qū)溢出的閾值,默認80%

2.容錯相關參數(shù)(MapReduce性能優(yōu)化)

配置參數(shù) 參數(shù)說明
mapreduce.map.maxattempts 每個Map Task最大重試次數(shù),一旦重試參數(shù)超過該值,則認為Map Task運行失敗,默認值:4。
mapreduce.reduce.maxattempts 每個Reduce Task最大重試次數(shù),一旦重試參數(shù)超過該值,則認為Map Task運行失敗,默認值:4。
mapreduce.task.timeout Task超時時間,經(jīng)常需要設置的一個參數(shù),該參數(shù)表達的意思為:如果一個Task在一定時間內沒有任何進入,即不會讀取新的數(shù)據(jù),也沒有輸出數(shù)據(jù),則認為該Task處于Block狀態(tài),可能是卡住了,也許永遠會卡住,為了防止因為用戶程序永遠Block住不退出,則強制設置了一個該超時時間(單位毫秒),默認是600000。如果你的程序對每條輸入數(shù)據(jù)的處理時間過長(比如會訪問數(shù)據(jù)庫,通過網(wǎng)絡拉取數(shù)據(jù)等),建議將該參數(shù)調大,該參數(shù)過小常出現(xiàn)的錯誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。

6.3 HDFS小文件優(yōu)化方法

6.3.1 HDFS小文件弊端

HDFS上每個文件都要在NameNode上建立一個索引,這個索引的大小約為150byte,這樣當小文件比較多的時候,就會產生很多的索引文件,一方面會大量占用NameNode的內存空間,另一方面就是索引文件過大使得索引速度變慢。

6.3.2 HDFS小文件解決方案

小文件的優(yōu)化無非以下幾種方式:
(1)在數(shù)據(jù)采集的時候,就將小文件或小批數(shù)據(jù)合成大文件再上傳HDFS。
(2)在業(yè)務處理之前,在HDFS上使用MapReduce程序對小文件進行合并。
(3)在MapReduce處理時,可采用CombineTextInputFormat提高效率。

1 Hadoop Archive
是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣就減少了NameNode的內存使用。

2 Sequence File
Sequence File由一系列的二進制key/value組成,如果key為文件名,value為文件內容,則可以將大批小文件合并成一個大文件。

3 CombineFileInputFormat
CombineFileInputFormat是一種新的InputFormat,用于將多個文件合并成一個單獨的Split,另外,它會考慮數(shù)據(jù)的存儲位置。

4 開啟JVM重用
對于大量小文件Job,可以開啟JVM重用會減少45%運行時間。
JVM重用原理:一個Map運行在一個JVM上,開啟重用的話,該Map在JVM上運行完畢后,JVM繼續(xù)運行其他Map。
具體設置:mapreduce.job.jvm.numtasks值在10-20之間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容