【问题标题】:Is it possible to tell the number of mappers / reducers used based on number of files?是否可以根据文件数量来判断使用的映射器/减速器的数量?
【发布时间】:2014-08-16 08:46:16
【问题描述】:

我想知道是否可以根据文件数量来判断使用的映射器/减速器的数量(默认情况下)?

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

例如:

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

有没有办法知道需要多少个mapper和reducer来处理以上四个文件?

【问题讨论】:

    标签: hadoop mapreduce cloudera


    【解决方案1】:

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

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

      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 将尝试派生您需要的 reducer 数量,但您也可以显式设置它。在这两种情况下,每个节点可以运行的 reducer 数量都有一个硬性上限,这是在 mapred-site.xml 配置文件中使用 mapred.tasktracker.reduce.tasks.maximum 设置的

    默认值

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

    这是关于 apache wiki http://wiki.apache.org/hadoop/HowManyMapsAndReduces 上的 Mappers 和 reducer 数量的一个很好的参考

    【讨论】:

    • 那么如果我不设置reducer的任何值,4个mapper会调用多少个reducer呢?默认是1?
    • 用默认值和其他相关信息更新了答案。是的,如果您没有明确设置,那么它将是 1
    【解决方案2】:

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

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

    如果 hdfs 块大小为 128 Mb,那么您将生成 2 个映射器(与最小拆分大小无关)。

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 2013-10-23
      • 1970-01-01
      • 2014-09-10
      • 2014-09-20
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多