是否有可能根据文件的数量来判断所使用的映射器/ reducer的数量



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

我知道映射器的数量取决于块大小而不是实际文件大小,但我想确保我是否遗漏了任何东西。

为例:

如果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)

是否有一种方法可以告诉我们需要使用多少个映射器和reducer来处理以上四个文件?

映射器的数量取决于分割的数量,但是如果文件小于分割大小,则每个文件将对应一个映射器。这就是不建议使用大量小文件的原因

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

  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

reducer的数量取决于-D mapred.reduce。Tasks = reducer参数的个数。Java API将尝试派生出您需要的reducer的数量,但是您也可以显式地设置它。在这两种情况下,每个节点可以运行的reducer数量都有一个硬上限,这是在mapred-site.xml配置文件中使用mapred.tasktracker.reduce.tasks.maximum

设置的。

默认值

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

这里有一个关于apache wiki上的映射器和reducer数量的很好的参考http://wiki.apache.org/hadoop/HowManyMapsAndReduces

映射器的数量取决于文件的数量,hdfs块大小属性和mapred.min.split.size属性,它决定了一个分割需要的最小大小,以便文件被实际分割。

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

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

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

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

相关内容

  • 没有找到相关文章