這幾天一直在優化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...