简而言之:
我有与hdfs块大小相同的块大小的文件,每个块是独立的,但必须提供一个Map器整体。自从我的Map绘制者 setup
函数消耗大量时间,如何配置Map器在丢弃多个块/块之前处理这些块/块,同时利用数据局部性?
长文:
我正在尝试使用hadoop来处理大量大块的大文件,这是hadoop所擅长的。每个输入文件的每个块都可以完全分开处理,但每个块都必须是完整的。为了让它在hadoop下正常工作,我做了这样的工作,使得每个块正好是hadoop块的大小。因此,我开发了“blockinputformat”和“blockrecordreader”,一次将整个块交给Map器。这似乎效果不错。
我面临的问题是,我的mapper任务(在必要的情况下)在未来有大量的工作要做 setup
方法,然后在丢弃整个对象之前只调用一次“map”函数。我尝试过通过 mapreduce.input.fileinputformat.split.minsize
这减少了安装程序调用的次数,因此我在每个输入文件中调用一次安装程序(因为每个输入文件最终都在它自己的inputsplit中)。我担心的是这样做会失去mapreduce提供的数据局部性的好处,因为我认为这意味着inputsplit跨越的块不一定在mapper的机器上。
总之,我的问题是:如何配置Map器来读取多个块(甚至可能从不同的输入文件中读取),同时保留数据的局部性?我最好把每个块放进自己的文件中?
谢谢你的帮助,菲尔
2条答案
按热度按时间2skhul331#
使用multipleinputfomat的addinputpath()方法将多个输入添加到一个Map器中。
multipleinputs.addinputpath(作业,新路径(args[0]),textinputformat.class,yourmapper.class);multipleinputs.addinputpath(作业,新路径(args[1]),textinputformat.class,yourmapper.class);
w8f9ii692#
Map器是根据块数或输入分割来分配的。
使用
CombineFileInputFormat()
将输入文件合并到一个单独的拆分中,以便一个Map器将处理您的数据。你也应该设置
max split size
属性来防止hadoop将整个输入组合到单个拆分中。如果你处理的是
small
那就好了。那样的话,你需要延长
CombineFileInputFormat
并实施getRecordReader
返回法CombineFileRecordReader
.