【发布时间】: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