简单来说:

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

在长:

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

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

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

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

最佳答案

  • 根据块数或输入拆分分配映射器。
  • 使用CombineFileInputFormat()将您的输入文件合并为一个拆分,以便一个映射器将处理您的数据。
  • 另外,您还应该设置max split size属性,以防止Hadoop将整个输入组合到单个拆分中。
  • 如果您没有处理。的small文件,那就很好了。
  • 在这种情况下,您需要扩展CombineFileInputFormat并通过返回getRecordReader来实现CombineFileRecordReader方法。
  • 关于java - 如何使Hadoop v2使用相同的映射器来处理多个块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36866023/

    10-11 07:44