1. 程式人生 > >Hadoop MapReduce中map任務數量設定詳解

Hadoop MapReduce中map任務數量設定詳解

首先注意的是在Hadoop Streaming 中可以通過-D mapred.map.tasks=(你想要設定的map數量) 來確定map任務的個數,

goal_num = mapred.map.tasks

但是這裡需要注意的是,只有在這個值大於hadoop中計算的默認個數default_num的時候才會有效,默認個數的計算方式如下:

default_num = total_size / block_size;

 此外,可以通過改變mapred.min.split.size設定每個task處理檔案的大小,但是隻有在這個值大於block_size時才會生效

split_size= max (mapred.min.split.size,block_size)

split_num = total_size /split_size

在計算map的個數時:

compute_map_num = min(split_num ,max (default_num,goal_num))//

這裡可以看出split_num <= default_num,所以上述值其實就為split_num,

整理一下 : 

split_num 肯定會小於或等於預設的分塊大小,即:split_num <=default_num

而當期望的map個數goal_num > default>num時才會有用

個人認為compute_num該這麼取 compute_num = max(min(split_num,default_num),goal_num)

 除了這些配置以外,mapreduce還要遵循一些原則。 mapreduce的每一個map處理的資料是不能跨越檔案的,也就是說min_map_num >= input_file_num。 所以,最終的map個數應該為:

     final_map_num = max(compute_map_num, input_file_num)

總結 :在設定map個數的時候,可以簡單的總結為以下幾點:

(1)如果想增加map個數,則設定mapred.map.tasks 為一個較大的值。

(2)如果想減小map個數,則設定mapred.min.split.size 為一個較大的值。

(3)如果輸入中有很多小檔案,依然想減少map個數,則需要將小檔案merger為大檔案,然後使用準則2。