中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

十六、MapReduce--調優

發布時間:2020-06-29 10:10:57 來源:網絡 閱讀:543 作者:隔壁小白 欄目:大數據

[TOC]

一、MapReduce跑得慢的原因

1)計算機性能
? CPU、內存、磁盤健康、網絡。
文件系統可以設置文件訪問時,不更新atime

2)I/O 操作優化
(1)數據傾斜
(2)map和reduce數設置不合理
(3)map運行時間太長,導致reduce等待過久
(4)小文件過多
(5)大量的不可分塊的超大文件
(6)spill次數過多
(7)merge次數過多等。

二、優化方案

? MapReduce優化方法主要從幾個方面考慮:數據輸入、Map階段、Reduce階段、IO傳輸、數據傾斜問題。

1、數據輸入階段

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

2、Map階段

1)減少溢寫(spill)次數:通過調整mapreduce.task.io.sort.mb及mapreduce.map.sort.spill.percent參數值,增大觸發spill的內存上限,減少spill次數,從而減少磁盤IO次數。
2)減少合并(merge)次數:通過調整mapreduce.task.io.sort.factor參數,增大merge時同時打開的文件數目,減少merge的次數,從而縮短mr處理時間。本質上其實就是增大打開的文件句柄數。
3)在map之后,不影響業務邏輯前提下,先進行combine處理,減少 I/O。

3、Reduce階段

1)合理設置map和reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、reduce任務間競爭資源,造成處理超時等錯誤。
2)設置map、reduce共存:調整mapreduce.job.reduce.slowstart.completedmaps參數,默認0.05。表示至少map任務中,執行完成的maptask數不少于5%才啟動reducetask。完成了使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計算也要內存,所以要根據作業的運行情況進行調整。

4、IO傳輸階段

1)采用數據壓縮的方式,減少網絡IO的的時間。安裝Snappy和LZO壓縮編碼器。
2)使用SequenceFile二進制文件。寫入速度更快,比普通文本寫入更快

5、數據傾斜問題

1)數據傾斜現象
數據頻率傾斜——某一個區域的數據量要遠遠大于其他區域。
數據大小傾斜——部分記錄的大小遠遠大于平均值。

2)減少數據傾斜的方法。

MapReduce數據傾斜通常發生在reduce階段中,因為map輸出的數據經過分區之后,每個分區由一個reduce處理,而每個分區的數據量如果差異很大的話,那么reduce的處理時間肯定不同,導致木桶效應的發送,所以必須避免數據傾斜。
方法1:抽樣和范圍分區
可以通過對原始數據進行抽樣得到的結果集來預設分區邊界值。(hive中有說到)

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

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

方法4:采用Map Join,盡量避免Reduce Join。沒有reduce就不會涉及到數據傾斜的問題

三、常用調優參數

1、資源相關參數

(1)在mr中程序通過configuration對象可以直接配置的參數

參數 說明
mapreduce.map.memory.mb 一個Map Task可使用的資源上限(單位:MB),默認為1024。如果Map Task實際使用的資源量超過該值,則會被強制殺死。
mapreduce.reduce.memory.mb 一個Reduce Task可使用的資源上限(單位:MB),默認為1024。如果Reduce Task實際使用的資源量超過該值,則會被強制殺死。
mapreduce.map.cpu.vcores 每個Map task可使用的最多cpu core數目,默認值: 1
mapreduce.reduce.cpu.vcores 每個Reduce task可使用的最多cpu core數目,默認值: 1
mapreduce.reduce.shuffle.parallelcopies 每個reduce去map中拿數據的并行數。默認值是5
mapreduce.reduce.shuffle.merge.percent reduce端的merge過程中, buffer中的數據達到多少比例開始寫入磁盤。默認值0.66
mapreduce.reduce.shuffle.input.buffer.percent buffer大小占reduce可用內存的比例。默認值0.7
mapreduce.reduce.input.buffer.percent 會保留指定比例的內存讀buffer中的數據直接拿給reduce使用,無需經過寫入磁盤再給reduce的過程。默認值是0.0
mapreduce.map.speculative 設置任務是否可以并發執行

(2)yarn啟動時參數

參數 說明
yarn.scheduler.minimum-allocation-mb 1024 給應用程序container分配的最小內存
yarn.scheduler.maximum-allocation-mb 8192 給應用程序container分配的最大內存
yarn.scheduler.minimum-allocation-vcores 1 每個container申請的最小CPU核數
yarn.scheduler.maximum-allocation-vcores 32 每個container申請的最大CPU核數
yarn.nodemanager.resource.memory-mb 8192 給containers分配的最大物理內存

(3)shuffle性能優化關鍵因素,在啟動前就在配置文件中配置

參數 說明
mapreduce.task.io.sort.mb 100 shuffle的環形緩沖區大小,默認100m
mapreduce.map.sort.spill.percent 0.8 環形緩沖區溢出的閾值,默認80%
mapreduce.task.io.sort.factor 同時打開文件的數目。增大merge時同時打開的文件數目,減少merge的次數

2、容錯相關參數

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

四、小文件優化

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

1、歸檔

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

2、Sequence file

? sequence file由一系列的二進制key/value組成,如果key為文件名,value為文件內容,則可以將大批小文件合并成一個大文件。
? 將多個文件合并成一個文件的時候,需要提供一個索引文件,說明每個文件在總文件中的起始位置,長度等信息

3、CombineFileInputFormat

? 繼承于 FileInputFormat,實現子類是CombineTextInputFormat。它是是一種新的inputformat,用于將多個文件合并成一個單獨的split,另外,它會考慮數據的存儲位置。

4、開啟JVM重用

對于大量小文件Job,可以開啟JVM重用會減少45%運行時間。
JVM重用理解:一個map運行一個jvm,重用的話,在一個map在jvm上運行完畢后,jvm繼續運行其他map。
具體設置:mapreduce.job.jvm.numtasks值在10-20之間。
但是開啟jvm有個缺陷。但是某個jvm被某個map或者reduce任務使用過之后,只有當當前MapReduce整個任務結束之后,其他MapReduce任務才能使用該jvm,也就是說即便該jvm是空閑的,也無法給其他MapReduce任務使用。一定程序上造成資源的浪費。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

枞阳县| 昌邑市| 谷城县| 广宗县| 武穴市| 周口市| 公安县| 陆川县| 洛宁县| 阳新县| 大同市| 民丰县| 罗山县| 保亭| 文登市| 务川| 星子县| 凤庆县| 承德县| 长沙县| 伊宁市| 右玉县| 苏州市| 海阳市| 宁都县| 临高县| 临潭县| 棋牌| 囊谦县| 平乡县| 墨玉县| 普兰县| 布拖县| 孟州市| 金平| 行唐县| 曲阳县| 茶陵县| 新巴尔虎右旗| 景德镇市| 大兴区|