Java 多输入:将相同输入添加到多个映射器以进行比较

Java 多输入:将相同输入添加到多个映射器以进行比较,java,hadoop,Java,Hadoop,我有两个Mapper类,它们从同一个文件夹中获取一些文件作为输入,并根据具有时间戳的文件名确定必须将文件作为输入提供给哪个Mapper。有时,同一个输入文件会作为输入提供给两个不同的映射器。现在我已经测试过,当两个不同的输入都提供给两个映射器时,它可以工作,但是当我给它们相同的输入时,其中一个映射器类不会生成用于在reducer中进行比较的结果 代码是巨大的,所以我不会把它放在这里,我会描述我做了什么。我创建了两个列表并扫描了目录中的文件,根据有时间戳的文件名,我将它们放在两个不同的列表中,然后

我有两个Mapper类,它们从同一个文件夹中获取一些文件作为输入,并根据具有时间戳的文件名确定必须将文件作为输入提供给哪个Mapper。有时,同一个输入文件会作为输入提供给两个不同的映射器。现在我已经测试过,当两个不同的输入都提供给两个映射器时,它可以工作,但是当我给它们相同的输入时,其中一个映射器类不会生成用于在reducer中进行比较的结果

代码是巨大的,所以我不会把它放在这里,我会描述我做了什么。我创建了两个列表并扫描了目录中的文件,根据有时间戳的文件名,我将它们放在两个不同的列表中,然后将它们添加到两个不同的映射器中,即它们的计算方式不同,因此我使用不同的映射器进行计算,然后在reducer中进行比较,但是,当输入文件与两个映射器的时间标准几乎相同时,其中一个映射器不会生成任何结果。这是因为一个映射程序无法访问该文件,因为另一个映射程序正在使用该文件,如果是这样的话,还有其他方法可以解决它

这里,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); 
更新

我刚刚发现这个问题与我的类似,但我不想复制输入文件,因为它可能很大。有谁能告诉我如何使用不同的映射器创建两个单独的作业,并将其提供给单个减速器

其中一个Mapper类不生成用于在reducer中进行比较的结果

我猜两个映射器都是在同一个任务跟踪节点上启动的,中间映射器输出位置由两个映射器任务共享-您应该检查启动这些映射任务的任务跟踪节点以确认这一点

您还应该运行mapper only作业,方法是将reduce任务数设置为零并检查输出-这是为了确认mapper未共享输出目录


为您的问题提供解决方案-听起来您正在将相同的文件传递给两个映射器,并将来自两个映射器的数据传递给单个还原器。这有一些重复,您的作业输出可以重复吗?

我删除了减速器,正如预期的那样,只有一个映射器生成输出。