多输入:将相同的输入添加到多个Map器以进行比较

kt06eoxx  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(221)

我有两个mapper类,它们从同一个文件夹中获取一些文件作为输入,并根据具有时间戳的文件名确定必须将该文件作为输入的mapper。有时,同一个输入文件会作为输入提供给两个不同的Map器。现在我已经测试过,当两个不同的输入都给了两个Map器时,它可以工作,但是当我给它们相同的输入时,其中一个Map器类不会生成用于在reducer中进行比较的结果。
代码是巨大的,所以我不把它放在这里,我会描述我做了什么。我创建了两个列表并扫描了目录中的文件,根据有时间戳的文件名,我将它们放在两个不同的列表中,然后将它们添加到两个不同的Map器中,即它们的计算方式都不同,因此我使用不同的Map器进行计算,然后在reducer中进行比较,但当输入文件与两个Map器的时间条件几乎相同时,其中一个Map器不会生成任何结果。所以这是因为一个Map程序不能访问文件,因为另一个正在使用它,如果是这样的话,有什么办法可以绕过它。
这里mappath1是一个列表,而mappath2是另一个列表

for(i=0;i<MapPath1.size();i++)
      MultipleInputs.addInputPath(job,new Path(MapPath1.get(i)),TextInputFormat.class,Map1.class);
if(type.equals("comparative"))
      for(i=0;i<MapPath2.size();i++)
            MultipleInputs.addInputPath(job,new Path(MapPath2.get(i)),TextInputFormat.class,Map2.class);

更新
我刚刚发现这个问题(hadoop中的多个Map器)与我的问题类似,但我不想复制输入文件,因为它可能很大。任何一个可以指导我如何创建两个不同的工作使用不同的Map器,并提供给一个单一的减速机。

gmxoilav

gmxoilav1#

其中一个mapper类不生成要在reducer中用于比较的结果。
我猜两个Map器都在同一个任务跟踪节点上启动,中间Map器输出位置由两个Map器任务共享-您应该检查启动这些Map任务的任务跟踪节点以确认这一点。
您还应该运行mapper(s)only job,将reduce tasks的数量设置为零并检查输出-这是为了确认mapper没有共享输出目录。
为您的问题提供解决方案—听起来您正在将同一个文件传递给两个Map器,并将两个Map器中的数据传递给single reducer。这有一些重复,您的作业输出可以有这个重复吗?

相关问题