【问题标题】:Number of mappers for a Mapreduce programMapreduce 程序的映射器数量
【发布时间】:2014-11-03 13:15:16
【问题描述】:

如果我的 mapreduce 作业读取目录中每个 1 mb 大小的 60 个文件,将执行多少个 Mapper。假设在这个 /user/cloudera/inputs/ 目录下有 60 个文件,每个文件的大小为 1 mb

在我的 mapreduce 配置类中,我指定了目录 /user/cloudera/inputs/。

谁能告诉我有多少块用于存储每个 1 mb 大小的 60 个文件以及执行了多少映射器

是 60 个块和 60 个映射器吗?如果是这样 有人解释一下如何

【问题讨论】:

    标签: mapreduce


    【解决方案1】:

    Map 任务通常一次处理一个输入块(使用默认的 FileInputFormat)。如果文件非常小并且数量很多,那么每个 map 任务处理的输入非常少,并且有很多 map 任务,每个任务都会带来额外的簿记开销。比较一个分成 16 个 64MB 块的 1GB 文件和 10,000 个左右 100KB 的文件。 10,000 个文件每个都使用一张地图,作业时间可能比使用单个输入文件的同等文件慢几十或几百倍。

    In your case 60 map are used in 60 files and used 60 blocks.
    

    如果您使用 TextInputFormat 之类的东西,问题是每个文件至少有 1 个拆分,因此映射数量的上限是文件数量,在您有很多非常小的文件的情况下你最终会得到很多映射器来处理每一个非常少的数据。

    要解决这个问题,您应该使用 CombineFileInputFormat 它将多个文件打包到同一个拆分中(我认为达到块大小限制),因此使用该格式,映射器的数量将与文件的数量无关,它将仅取决于数据量。

    您必须通过从 CombineFileInputFormt 扩展来创建自己的输入格式,您可以找到一个实现 here。一旦你定义了你的 InputFormat,让我们像链接 CombinedInputFormat 一样调用它,你可以告诉你的工作使用它:

    job.setInputFormatClass(CombinedInputFormat.class);
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多