Map和Reduce任務的優化

2021-08-27 14:18:06 字數 1668 閱讀 8865

程式設計總是圍繞著兩個問題:「如何完成這個任務」和「如何能讓程式執行得更快」

因此,相對應的mapreduce計算模型的優化也就集中在兩個方面:一是計算效能方面的優化;二是i/o操作方面的優化

1、任務排程

兩個方面的優化:一是計算方面:hadoop總會先將任務分配給空閒的機器,使所有的任務能公平地分享系統資源;二是i/o方面:hadoop會盡量將map任務分配給inputsplit所在的機器,以減少網路i/o的消耗。(分配的就近原則)

2、資料預處理和inputsplit的大小

2.1.原因:mapreduce擅長處理少量的大資料,而在處理大量的小資料時,效能要遜色很多。

2.2.優化措施:在提交mapreduce任務之前可以對資料進行一次預處理,將資料合併以提高執行效率(很有效)。

進一步優化:可以考慮map任務的執行時間,當乙個map任務只需要執行幾秒鐘就可以結束時,就需要考慮是否應該給它分配更多的資料了。(一分鐘左右比較合適)——設定方法:可通過設定map的輸入資料大小來調節map的執行時間。a、合理地設定block塊的大小(在fileinputformat中,hadoop會在處理每個block後將其作為乙個inputsplit);b、合理地設定map任務的數量。

3、map和reduce任務的數量

3.1.定義:map任務槽和reduce任務槽就是這個集群能夠同時執行的map/reduce任務的最大數量。(比如在乙個具有1200臺機器的集群中,設定每台機器最多可以同時執行10個map和5個reduce,那麼這個集群的map任務槽就是12000,reduce任務槽是6000。)

3.2.設定reduce數量

(map數量設定主要考慮它的執行時間)

設定reduce的數量時只需要參考任務槽的設定。一般來說reduce任務的數量應該是reduce任務槽的0.95倍或是1.75倍。

0.95倍易於找到空閒機器處理失敗的任務。1.75則可以使負載更加均衡(執行速度快的機器可以獲得更多的任務),以提高任務的處理速度。

4、combine函式

4.1.作用:用於在本地合併資料。例如,在單詞計數中,combine函式先計算出在這個block中某個單詞的個數,再傳輸給reduce。如下圖:

沒有使用combine函式

使用了combine函式

4.2.使用方法:job.setcombineclass(combine.class);

在wordcount程式中,可以指定reduce函式為combine函式

job.setreduceclass(reduce.class)

5、壓縮

編寫mapreduce程式時,可以選擇對map的輸出和最終的輸出結果進行壓縮(可自行選擇壓縮方式)。

#當map的中間輸出很大時,對其進行壓縮可以有效地減少網路上的資料傳輸量。

#對最終結果的壓縮雖然可以減少資料寫入hdfs的時間,但是也會對讀取產生一定的影響,因此要根據時間情況來選擇。

6、自定義comparator(自定義資料型別以實現更複雜的目的)

比如:k-means演算法(基礎的聚類演算法)。

本篇博文內容主要來自《hadoop實戰》一書。

map和reduce 個數的設定

一 控制hive任務中的map數 1.通常情況下,作業會通過input的目錄產生乙個或者多個map任務。主要的決定因素有 input的檔案總個數,input的檔案大小,集群設定的檔案塊大小 目前為128m,可在hive中通過set dfs.block.size 命令檢視到,該引數不能自定義修改 2....

從Map和Reduce說起

從map和reduce說起 最近在看函式式程式設計的一些東西,尤其是sheme和python,有些困惑,遂寫下一些東西。在python中,map reduce filter是函式式程式設計的一組重要的工具.map將過程 函式 應用於資料以產生新的資料,而reduce則是將資料進行歸併.下面的語句分別...

map 函式和reduce 函式

map 函式 也稱對映物件函式,接受兩個引數,第乙個是函式,第二個是序列。map 將傳入的函式依次作用到序列的每個元素並把結果作為list返回。map返回的結果是乙個可迭代的map物件,可以使用 next 獲取值,也可使用for迴圈迭代獲取或者直接轉換為list獲取更加暴力。def demo x r...