如何让hadoopv2使用相同的Map器来处理多个块?

ycggw6v2  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(263)

简而言之:
我有与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器来读取多个块(甚至可能从不同的输入文件中读取),同时保留数据的局部性?我最好把每个块放进自己的文件中?
谢谢你的帮助,菲尔

2skhul33

2skhul331#

使用multipleinputfomat的addinputpath()方法将多个输入添加到一个Map器中。
multipleinputs.addinputpath(作业,新路径(args[0]),textinputformat.class,yourmapper.class);multipleinputs.addinputpath(作业,新路径(args[1]),textinputformat.class,yourmapper.class);

w8f9ii69

w8f9ii692#

Map器是根据块数或输入分割来分配的。
使用 CombineFileInputFormat() 将输入文件合并到一个单独的拆分中,以便一个Map器将处理您的数据。
你也应该设置 max split size 属性来防止hadoop将整个输入组合到单个拆分中。
如果你处理的是 small 那就好了。
那样的话,你需要延长 CombineFileInputFormat 并实施 getRecordReader 返回法 CombineFileRecordReader .

相关问题