mapreduce中MAP數量如何控制?

2021-07-24 03:51:12 字數 2270 閱讀 1873

一、果斷先上結論

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

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

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

二、原理與分析過程

看了很多部落格,感覺沒有乙個說的很清楚,所以我來整理一下。

輸入分片(input split):在進行map計算之前,mapreduce會根據輸入檔案計算輸入分片(input split),每個輸入分片(input split)針對乙個map任務,輸入分片(input split)儲存的並非資料本身,而是乙個分片長度和乙個記錄資料的位置的陣列。

hadoop 2.x預設的block大小是128mb,hadoop 1.x預設的block大小是64mb,可以在hdfs-site.xml中設定dfs.block.size,注意單位是byte。

分片大小範圍可以在mapred-site.xml中設定,mapred.min.split.size mapred.max.split.size,minsplitsize大小預設為1b,maxsplitsize大小預設為long.max_value = 9223372036854775807

那麼分片到底是多大呢?

minsize=max

maxsize=mapred.max.split.size

splitsize=max}

我們再來看一下原始碼

所以在我們沒有設定分片的範圍的時候,分片大小是由block塊大小決定的,和它的大小一樣。比如把乙個258mb的檔案上傳到hdfs上,假設block塊大小是128mb,那麼它就會被分成三個block塊,與之對應產生三個split,所以最終會產生三個map task。我又發現了另乙個問題,第三個block塊裡存的檔案大小只有2mb,而它的block塊大小是128mb,那它實際占用linux file system的多大空間?

答案是實際的檔案大小,而非乙個塊的大小。

為了方便介紹,先來看幾個名詞:

block_size : hdfs的檔案塊大小,預設為64m,可以通過引數dfs.block.size設定

total_size : 輸入檔案整體的大小

input_file_num : 輸入檔案的個數

(1)預設map個數

如果不進行任何設定,預設的map個數是和blcok_size相關的。

default_num = total_size / block_size;

(2)期望大小

可以通過引數mapred.map.tasks來設定程式設計師期望的map個數,但是這個個數只有在大於default_num的時候,才會生效。

goal_num = mapred.map.tasks;

(3)設定處理的檔案大小

可以通過mapred.min.split.size 設定每個task處理的檔案大小,但是這個大小只有在大於block_size的時候才會生效。

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

split_num = total_size / split_size;

(4)計算的map個數

compute_map_num = min(split_num,  max(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。

MapReduce中的map個數

在map階段讀取資料前,fileinputformat會將輸入檔案分割成split。split的個數決定了 map的個數。影響map個數 split個數 的主要因素有 1 檔案的大小。當塊 dfs.block.size 為128m時,如果輸入檔案為128m,會被劃分為1個split 當塊為256m,...

mapreduce中map和reduce個數

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

mapreduce中map個數的確定

在map階段讀取資料前,fileinputformat會將輸入檔案分割成split。split的個數決定了 map的個數。影響map個數,即split個數的因素主要有 1 hdfs塊的大小,即hdfs中dfs.block.size的值。如果有乙個輸入檔案為1024m,當塊為 256m時,會被劃分為4...