java—在hadoop的迭代作业中,在每个拆分的mapreduce输入文件上附加相同的字符串(上一个结果)

wgx48brx  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(282)

我是hadoop新手,我正在写一个迭代mapreduce作业。
我知道用hadoop,从一个大的数据集开始,它将被分割成小文件,然后作为输入发送到不同机器上的mapfunction。
我刚刚成功地将mapreduce的结果附加到输出文件的末尾,但是通过这种方式,使用迭代作业,这个结果将只发送到一台机器。
所以我想把结果附加到发送到每台机器的每个分割文件中,这样任何机器都可以看到前面的结果。
我该怎么做?

k5hmc34c

k5hmc34c1#

在map方法中,可以将输出附加到一个公共hdfs文件,而不是写入上下文对象。但是如果多个Map任务尝试附加文件,则会出现错误。
解决方法:
在mr job的每次迭代之后,将输出附加到tmp目录中的temp文件。
将这个临时文件移到hdfs(使用javahadoopfilestatusapi)
在下一次迭代中,将这个加载在hdfs中的temp文件添加到分布式缓存中。
从Map任务读取分布式缓存文件。
如果你需要进一步的帮助,请告诉我。
更新临时文件逻辑

public void appendtempdate(String tempfile,String data)
 {
  try
  {
  File temp = new File(tempfile);
  if(!temp.exists())
  {
    temp.createNewFile();
  }
            FileWriter fw= new FileWriter(temp.getName(),true);
            BufferedWriter bw= new BufferedWriter(fw);
            bw.write(data);
            bw.close();
   }
    catch(Execption e)
    {
      }
    }

调用此方法并将temp文件移动到hdfs以进行分布式缓存。

相关问题