mapreduce作業調優tips

2021-06-12 12:48:03 字數 2473 閱讀 5424

這幾天一直在優化job,下面是我認為有用的一些tips。

推測執行在整個集群上關閉,特定需要的作業單獨開啟,一般可以省下約5%~10%的集群資源。由mapred.map.task.speculative.execution[default true]和mapred.reduce.task.speculative.execution[default true]分別控制map和reduce的推測執行開關。

mapred.map.task.speculative.execution=true;

mapred.reduce.task.speculative.execution=false;

task執行時間很短的時候,關閉推測執行(否則可能會有約5%的task被kill掉,而你會觀察到通常kill的是因推測執行而額外啟動的tasks)。

在map時間很長,而map的輸出資料並不大的時候,推遲reduce執行時間(否則在推測執行開啟的時候會看到有大量的reduce task attempts因過早啟動而被kill掉,過早啟動會導致集群資源被浪費),這個由mapred.reduce.slowstart.completed.maps[default 0.05,即5%]控制,我甚至看到有的job因為這個kill掉了2*reducenum以上的task attempts。集群把這個引數設定為0.75應該比較合適。

mapred.reduce.slowstart.completed.maps=0.80

當task數量非常多而且通常很短[約1min]的時候,把jvm重用開啟,由mapred.job.reuse.jvm.num.tasks[default 1]控制,這通常能獲得10%以上的執行時間減少。當節點數量在100個以內,而task數量高達5000以上的時候,可以直接設定為-1[意味著重用個數不限制]。

mapred.job.reuse.jvm.num.tasks=-1

io.sort.mb被用作map輸出的buffer,當buffer使用達到某個閾值的時候會進行sort然後spill到磁碟,預設地io.sort.mb[default 100,即100mb]通常過小[過小會導致寫磁碟次數很多,spill檔案也很多],在輸出資料量較大的時候建議調整到300左右,建議不要更大,否則sort會很很慢[快排nlogn,先快排後merge的分治手段在大資料情況下更好]。

io.sort.mb=300

mapred.reduce.parallel.copies控制著reduce從map拉取資料時開啟的執行緒數量[default 5],在輸出資料很多,特別是map數量也很多的時候,建議調到15或者更大,否則reduce的copy階段可能很慢[map已經完成,而reduce還處於遠沒到33%]。

mapred.reduce.parallel.copies=15

對map輸出進行壓縮可以減少磁碟io和reduce的copy時間,設定為:

mapred.compress.map.output=true;

mapred.map.output.compression.codec=com.hadoop.compression.lzo.lzocodec;

當map輸入資料量很大,map個數特別多,但是map執行時間卻很短[約1min,通常是因為計算只涉及部分輸入資料]的時候,把map的輸入分片調大到兩倍block大小[default block大小]可能獲得更好的執行效率。注意到這可能影響資料本地化的利用,不過我的經驗是在這種情況下調大會更好。

mapred.min.split.size=268435456
io.sort.factor[default 10]控制著合併spill檔案時同時開啟的spill檔案數量,當spill檔案很多時,此值太小會導致需要合併的次數很多,當資料量大的時候應該調高一些。
io.sort.factor=50

壓縮reduce輸出,常用lzo

下面的引數通常使用預設值,但也可以稍微調節

mapred.job.shuffle.input.buffer.percent=0.8

mapred.job.shuffle.merge.percent=0.8

io.sort.spill.percent=0.9#輸入資料比較有序時,否則可能導致阻塞map任務輸出

通常調節執行引數是寫完code之後根據執**況調節的,如果調節後執**況還很差,就需要對**進行優化。

我們可以使用hprof工具對**進行效能分析,以便觀察各個操作cpu使用情況和記憶體分配情況,從而針對性地優化,使用hprof會導致被分析的task執行十分緩慢,因此千萬別對所有task都使用分析。

某種程度上說,job的執行效率主要取決於使用的演算法。但在實際環境中很多人在寫job的時候可能忽略引數調節和效能分析的過程,而導致job執行過慢。這需要乙個比較完善的code review規範和監控系統。總的來說,建議對所有job都調節引數,對將長期執行的大型的job進行效能分析優化。

MapReduce作業調優

1,map緩衝區記憶體改大 環形緩衝區越大,溢寫次數越少,磁碟 io 的次數越少,執行速度就越快 預設100m,可配置 2,map輸出壓縮 減少io 可配置 3,reduce拉取過來的資料直接存記憶體,避免落盤,這樣合併也能在記憶體中完成 可配置 4,shuffle中的多次磁碟io操作非常消耗效能,...

MapReduce的調優總結

mapreduce的調優總結 mapreduce 伺服器調優 1.mapreduce.task.io.sort.factor mr程式進行合併排序的時候,開啟的檔案數量,預設為10個.3.mapreduce.map.sort.spill.percent mr程式進行flush操作的閥值,預設0.80...

7 3 3mapreduce配置調優

通過調節配置引數,達到較優的效能。map配置引數 屬性型別 預設值作用 mapreduce.task.io.sort.mb intmap輸出結果的緩衝區大小兆為單位 mapreduce.map.sort.spill.percent float 緩衝區占用比例達到這個閾值時,就會生成溢位檔案,將map...