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

标签 java hadoop

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

该代码是巨大的,因此,与其将其放到这里,不如描述我所做的。我创建了两个列表,并根据目录中包含时间戳的文件的名称进行扫描,将它们放在两个不同的列表中,然后将它们添加到两个不同的Mappers中,即,它们的计算方式不同,因此我使用不同的方法要计算的映射器,该映射器随后用于在化简器中进行比较,但是当与两个映射器的时间标准相同时,如果输入文件相同,则该映射器中的一个不会生成任何结果。那是因为一个映射器因为另一个正在使用它而无法访问文件,如果是这种情况,那么它周围有任何办法。

这里的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)与我的问题相似,但是我不想复制输入文件,因为它可能很大。谁能指导我如何使用不同的Mappers创建两个单独的作业并将其提供给单个化简器。

最佳答案

one of the Mapper class doesn't generate the result to be used for comparison in the reducer.



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

另外,应通过将reduce任务数设置为零并检查输出来运行仅映射器作业,这是为了确认映射器未共享输出目录。

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

关于java - 多个输入:将相同的输入添加到多个映射器以进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25860959/

相关文章:

java - hdfs纯文本写入hbase,未设置输出目录

python - 从 python (happybase) 写入 hbase 表

java - 程序的运行时间

java - 如果方法参数无效则抛出异常

java - 编写注释以防止参数无效时调用方法

hadoop - 通过R将本地文件夹复制到hdfs

java - Java中的Yarn和MapReduce帮助

java - 一次显示 String 和 Int 数组

java - 如何查找特定项目的存储位置 | eclipse

excel - 使用hadoop进行文本分析的最简单方法?