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

时间:2014-05-26 10:24:54

标签: java hadoop mapreduce

我是Hadoop的新手,我正在编写一个迭代的MapReduce作业。

我知道,对于Hadoop,从一个大型数据集开始,它将被拆分为小文件,而不是将它们作为输入发送到不同机器上的mapfunction。

我只是成功地将MapReduce的结果附加到输出文件的末尾,但是通过迭代作业的方式,这个结果将只发送到一台机器。

所以我想将结果附加到发送到每台机器的EACH分割文件中,这样任何机器都可以看到之前的结果。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

在Map方法中,您可以将输出附加到一个常见的HDFS文件,而不是写入上下文对象。但是,如果多个地图任务尝试附加文件,您将收到错误。

解决方法:

  1. 每次迭代MR作业后,将输出附加到临时文件中 tmp目录。
  2. 将此临时文件移至hdfs(使用Java Hadoop filestatus API)
  3. 在下一次迭代中,将此hdfs中加载的临时文件添加到分布式缓存中。
  4. 从地图任务中读取分布式缓存文件。
  5. 如果您需要进一步的帮助,请与我们联系。

    更新临时文件逻辑

     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)
        {
          }
        }
    

    调用此方法并将临时文件移至HDFS以进行分布式缓存。