我有两个Mapper类,它们从输入的同一文件夹中获取一些文件,并根据具有时间戳的文件名确定文件必须作为输入给出哪个映射器。有时会发生相同的输入文件作为两个不同Mapper的输入。现在我已经测试了它,当两个不同的输入都给两个Mapper但是当我给它们相同的输入时,那么Mapper类中的一个不生成用于在reducer中进行比较的结果。
代码是巨大的,所以不要把它放在这里,我会描述我做了什么。我创建了两个列表并扫描目录中的文件,并根据具有时间戳的文件的名称,我将它们放在两个不同的列表中,然后将它们添加到两个不同的Mapper中,即两者都以不同的方式计算,所以我使用不同的要计算的映射器,然后用于在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);
的更新 的
我刚发现这个问题(Multiple mappers in hadoop)与我的相似,但我不想复制输入文件,因为它可能很大。任何人都可以指导我如何使用不同的Mapper创建两个单独的作业并将其提供给单个reducer。
答案 0 :(得分:-1)
其中一个Mapper类不会生成用于在reducer中进行比较的结果。
我猜两个映射器都在相同的任务跟踪器节点上启动,并且映射器任务共享中间映射器输出位置 - 您应该检查启动这些映射任务的任务跟踪器节点以确认这一点。
此外,您应该只运行mapper(s)作业,将reduce任务数设置为零并检查输出 - 这是为了确认mapper不共享输出目录。
为了解决您的问题 - 听起来您正在将相同的文件传递给映射器和来自给予单个reducer的映射器的数据。这有一些重复,你的工作输出是否可以重复这个?