繁体   English   中英

使用hadoop在迭代作业中的每个分割的mapreduce输入文件上附加相同的字符串(先前的结果)

[英]Append the same string (previous result) on each splitted mapreduce input file in iterative job with hadoop

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

我知道,使用Hadoop时,将从大数据集开始将其拆分为小文件,然后将它们作为输入发送到不同计算机上的mapfunction。

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

因此,我想将结果附加到发送到每台计算机的EACH分割文件中,以便任何计算机都可以看到以前的结果。

我该怎么做?

在您的Map方法中,您可以将输出追加到一个公共HDFS文件中,而不是写入上下文对象。 但是,如果有多个地图任务试图追加文件,则会出现错误。

解决方法:

  1. 在每次MR作业迭代之后,将输出附加到tmp目录中的temp文件。
  2. 将此临时文件移动到hdfs(使用Java Hadoop filestatus API)
  3. 在下一次迭代中,将此加载到hdfs中的临时文件添加到分布式缓存中。
  4. 从地图任务中读取分布式缓存文件。

如果您需要进一步的帮助,请告诉我。

更新临时文件逻辑

 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以进行分布式缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM