Hadoop map調優引數

2021-07-09 04:31:02 字數 2846 閱讀 9253

引數:io.sort.mb(default 100)

當map task開始運算,並產生中間資料時,其產生的中間結果並非直接就簡單的寫入磁碟。

而是會利用到了記憶體buffer來進行已經產生的部分結果的快取,

並在記憶體buffer中進行一些預排序來優化整個map的效能。

每乙個map都會對應存在乙個記憶體buffer,map會將已經產生的部分結果先寫入到該buffer中,

這個buffer預設是100mb大小,

但是這個大小是可以根據job提交時的引數設定來調整的,

當map的產生資料非常大時,並且把io.sort.mb調大,

那麼map在整個計算過程中spill的次數就勢必會降低,

map task對磁碟的操作就會變少,

如果map tasks的瓶頸在磁碟上,這樣調整就會大大提高map的計算效能。

引數:o.sort.spill.percent(default 0.80,也就是80%)

map在執行過程中,不停的向該buffer中寫入已有的計算結果,

但是該buffer並不一定能將全部的map輸出快取下來,

當map輸出超出一定閾值(比如100m),那麼map就必須將該buffer中的資料寫入到磁碟中去,

這個過程在mapreduce中叫做spill。

map並不是要等到將該buffer全部寫滿時才進行spill,

因為如果全部寫滿了再去寫spill,勢必會造成map的計算部分等待buffer釋放空間的情況。

所以,map其實是當buffer被寫滿到一定程度(比如80%)時,就開始進行spill。

這個閾值也是由乙個job的配置引數來控制,

這個引數同樣也是影響spill頻繁程度,進而影響map task執行週期對磁碟的讀寫頻率的。

但非特殊情況下,通常不需要人為的調整。調整io.sort.mb對使用者來說更加方便。

引數:io.sort.factor

當map task的計算部分全部完成後,如果map有輸出,就會生成乙個或者多個spill檔案,這些檔案就是map的輸出結果。

map在正常退出之前,需要將這些spill合併(merge)成乙個,所以map在結束之前還有乙個merge的過程。

merge的過程中,有乙個引數可以調整這個過程的行為,該引數為:io.sort.factor。

該引數預設為10。它表示當merge spill檔案時,最多能有多少並行的stream向merge檔案中寫入。

比如如果map產生的資料非常的大,產生的spill檔案大於10,而io.sort.factor使用的是預設的10,

那麼當map計算完成做merge時,就沒有辦法一次將所有的spill檔案merge成乙個,而是會分多次,每次最多10個stream。

這也就是說,當map的中間結果非常大,調大io.sort.factor,

有利於減少merge次數,進而減少map對磁碟的讀寫頻率,有可能達到優化作業的目的。

引數:min.num.spill.for.combine(default 3)

當job指定了combiner的時候,我們都知道map介紹後會在map端根據combiner定義的函式將map結果進行合併。

執行combiner函式的時機有可能會是merge完成之前,或者之後,這個時機可以由乙個引數控制,

即min.num.spill.for.combine(default 3),當job中設定了combiner,並且spill數最少有3個的時候,

那麼combiner函式就會在merge產生結果檔案之前執行。

通過這樣的方式,就可以在spill非常多需要merge,並且很多資料需要做conbine的時候,

減少寫入到磁碟檔案的資料數量,同樣是為了減少對磁碟的讀寫頻率,有可能達到優化作業的目的。

引數:mapred.compress.map.output(default false)

減少中間結果讀寫進出磁碟的方法不止這些,還有就是壓縮。

也就是說map的中間,無論是spill的時候,還是最後merge產生的結果檔案,都是可以壓縮的。

壓縮的好處在於,通過壓縮減少寫入讀出磁碟的資料量。

對中間結果非常大,磁碟速度成為map執行瓶頸的job,尤其有用。

控制map中間結果是否使用壓縮的引數為:mapred.compress.map.output(true/false)。

將這個引數設定為true時,那麼map在寫中間結果時,就會將資料壓縮後再寫入磁碟,讀結果時也會採用先解壓後讀取資料。

這樣做的後果就是:寫入磁碟的中間結果資料量會變少,但是cpu會消耗一些用來壓縮和解壓。

所以這種方式通常適合job中間結果非常大,瓶頸不在cpu,而是在磁碟的讀寫的情況。

說的直白一些就是用cpu換io。

根據觀察,通常大部分的作業cpu都不是瓶頸,除非運算邏輯異常複雜。所以對中間結果採用壓縮通常來說是有收益的。

引數:mapred.map.output.compression.codec( default org.apache.hadoop.io.compress.defaultcodec)

當採用map中間結果壓縮的情況下,使用者還可以選擇壓縮時採用哪種壓縮格式進行壓縮,

現在hadoop支援的壓縮格式有:gzipcodec,lzocodec,bzip2codec,lzmacodec等壓縮格式。

通常來說,想要達到比較平衡的cpu和磁碟壓縮比,lzocodec比較適合。但也要取決於job的具體情況。

使用者若想要自行選擇中間結果的壓縮演算法,

可以設定配置引數:mapred.map.output.compression.codec=org.apache.hadoop.io.compress.defaultcodec或者其他使用者自行選擇的壓縮方式

原文出處:

hadoop map端reduce端調優引數

map端 io.sort.mb 型別int預設100 map的記憶體緩衝區 io.sort.record.precent 型別 float預設0.05 io.sort.mb的快取區記錄索引kvindices和快取區記錄索引排序工作陣列kvoffsets占用空間比例 io.sort.spill.per...

MySQL引數調優

l 通用類 key buffer size 含義 用於索引塊的緩衝區大小,增加它可得到更好處理的索引 對所有讀和多重寫 影響 對於myisam 表的影響不是很大,myisam 會使用系統的快取來儲存資料,所以大量使用 myisam 表的機器記憶體很快就會耗盡。但是,如果你將該值設得過大 例如,大於總...

mysql引數調優

l max connect errors max connect errors預設值為10,也即mysqld執行緒沒重新啟動過,一台物理伺服器只要連線 異常中斷累計超過10次,就再也無法連線上mysqld服務,為此建議大家設定此值至少大於等於10w 若異常中斷累計超過引數設定的值,有二種解決辦法,執...