【问题标题】:How can I make Hadoop v2 use the same mapper to process multiple blocks?如何使 Hadoop v2 使用相同的映射器来处理多个块?
【发布时间】:2016-04-26 13:13:58
【问题描述】:

简介:

我的文件的块大小与 HDFS 块大小相同,每个块都是独立的,但必须完整地提供给映射器。由于我的 Mapper 的 setup 函数会消耗大量时间,我如何配置我的 Mapper 在被丢弃之前处理多个块/块,同时利用数据局部性?

长期:

我正在尝试使用 Hadoop 以大块的形式处理大量大文件,这是 hadoop 擅长的。每个输入文件的每个块都可以完全单独处理,但每个块必须是整体的。为了使这项工作在 Hadoop 下运行良好,我已经做到了,以便每个块都是 Hadoop 块的大小。因此,我开发了“BlockInputFormat”和“BlockRecordReader”,一次将整个块交给 Mapper。这似乎运作良好。

我面临的问题是我的 Mapper 任务(必须)在 setup 方法中需要做大量工作,然后在整个对象被丢弃之前只调用一次“map”函数。我尝试通过mapreduce.input.fileinputformat.split.minsize 增加最小拆分大小,这减少了设置调用的数量,因此我为每个输入文件调用一次设置(因为每个输入文件最终都以它自己的 InputSplit 结束)。我担心这样做会失去 MapReduce 提供的数据局部性的好处,因为我认为这意味着 InputSplit 跨越了不一定在 Mapper 机器上的块。

总之,我的问题是:如何配置 Mapper 以读取多个块(甚至可能来自不同的输入文件),同时保留数据局部性?将每个块放入自己的文件中会更好吗?

感谢您提供的任何帮助, 菲尔

【问题讨论】:

    标签: java hadoop mapreduce hadoop2


    【解决方案1】:
    • Mapper 是根据块数或输入拆分来分配的。

    • 使用CombineFileInputFormat() 将您的输入文件合并为一个拆分,以便一个映射器处理您的数据。

    • 您还应该设置 max split size 属性以防止 Hadoop 将整个输入合并到一个拆分中。

    • 如果你正在处理没有。 small 文件然后很好。

      • 在这种情况下,您需要扩展CombineFileInputFormat 并通过返回CombineFileRecordReader 实现getRecordReader 方法。

    【讨论】:

    • 嗨,Stacey,很遗憾,我认为这不能回答我的问题。我在询问大量大文件,以及是否可以优化具有多个 HDFS 块长的 InputSplit 以仍然利用块局部性为单个映射器提供许多块。
    【解决方案2】:

    使用 MultipleInputFomat 的 addInputPath() 方法将多个输入添加到一个映射器。

    MultipleInputs.addInputPath(job, new Path(args[0]), TextInputFormat.class, YourMapper.class); MultipleInputs.addInputPath(job, new Path(args[1]), TextInputFormat.class, YourMapper.class);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-29
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多