是否可以根据文件数告诉使用的映射器/缩减器的数量?

时间:2014-06-25 17:00:20

标签: hadoop mapreduce cloudera

我想知道是否有可能根据文件数告诉使用的映射器/缩减器的数量(默认情况下)?

我知道mapper的数量取决于块的大小而不是实际的文件大小,但是想确定我是否遗漏了任何内容。

例如:

如果hdfs中有4个目录,其中包含4个文件。

dir1/file1 - contains (testing file 1, testing again)
dir2/file2 - contains (testing file 2, testing again)
dir3/file3 - contains (testing file 3, testing again)
dir4/file4 - contains (testing file 4, testing again)

有没有办法告诉使用多少映射器和缩减器来处理上述四个文件?

2 个答案:

答案 0 :(得分:6)

Mapper数量取决于拆分数量,但是如果文件小于拆分大小,则每个文件将对应一个映射器。这就是不推荐大量小文件的原因

确定属性以决定分割大小,默认值如下

  mapred.min.split.size=1 (in bytes)
  mapred.max.split.size=Long.MAX_VALUE
  dfs.block.size=64 MB

分割尺寸计算为

   inputSplitSize=max(minimumSize, min(maximumSize, blockSize))

  # of mappers= totalInputSize/inputSplitSize

Reducers的数量取决于-D mapred.reduce.tasks =#of reducers参数。 Java API将尝试导出您需要的reducers数量,但同样您也可以显式设置它。在这两种情况下,每个节点可以运行的reducer数量有一个硬上限,并且使用mapred.tasktracker.reduce.tasks.maximum

在mapred-site.xml配置文件中设置。

默认值

  mapred.reduce.tasks=1
  mapred.tasktracker.reduce.tasks.maximum=2

这是关于apache wiki http://wiki.apache.org/hadoop/HowManyMapsAndReduces

上的Mapper和reducers数量的一个很好的参考

答案 1 :(得分:1)

映射器的数量取决于文件的数量,hdfs块大小属性和mapred.min.split.size属性,它确定了拆分为了实际拆分文件所需的最小大小。

假设你有两个输入文件,每个128Mb,

如果hdfs块大小为128 Mb,那么您将生成2个映射器(独立于最小分割大小)。

如果hdfs块大小实际上小于文件大小(比如32 Mb),那么它也将取决于您的最小分割大小。如果它小于hdfs块大小,则每个文件将生成4个映射器,而如果它更大(例如64 Mb),则将根据此值拆分文件,因此将生成每个文件2个映射器。

然而,减速器的数量几乎完全取决于您(因为您可以通过setNumReduceTasks方法设置您想要的减速器的确切数量。)