我是hadoop新手,我正在写一个迭代mapreduce作业。我知道用hadoop,从一个大的数据集开始,它将被分割成小文件,然后作为输入发送到不同机器上的mapfunction。我刚刚成功地将mapreduce的结果附加到输出文件的末尾,但是通过这种方式,使用迭代作业,这个结果将只发送到一台机器。所以我想把结果附加到发送到每台机器的每个分割文件中,这样任何机器都可以看到前面的结果。我该怎么做?
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以进行分布式缓存。
1条答案
按热度按时间k5hmc34c1#
在map方法中,可以将输出附加到一个公共hdfs文件,而不是写入上下文对象。但是如果多个Map任务尝试附加文件,则会出现错误。
解决方法:
在mr job的每次迭代之后,将输出附加到tmp目录中的temp文件。
将这个临时文件移到hdfs(使用javahadoopfilestatusapi)
在下一次迭代中,将这个加载在hdfs中的temp文件添加到分布式缓存中。
从Map任务读取分布式缓存文件。
如果你需要进一步的帮助,请告诉我。
更新临时文件逻辑
调用此方法并将temp文件移动到hdfs以进行分布式缓存。