简单来说:
我的文件块大小与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/