我在SLES 10(SUSE)下运行Hadoop 0.20.1。
我的Map任务需要一个文件并生成更多文件,然后我会从这些文件生成结果。我想知道我应该放置这些文件的位置,以便性能良好且没有冲突。如果Hadoop可以自动删除目录 - 那就太好了。
现在,我正在使用临时文件夹和任务ID,创建一个唯一的文件夹,然后在该文件夹的子文件夹中工作。
reduceTaskId = job.get("mapred.task.id");
reduceTempDir = job.get("mapred.temp.dir");
String myTemporaryFoldername = reduceTempDir+File.separator+reduceTaskId+ File.separator;
File diseaseParent = new File(myTemporaryFoldername+File.separator +REDUCE_WORK_FOLDER);
这种方法的问题是我不确定它是否是最佳的,我也必须删除每个新文件夹或者我开始耗尽空间。 谢谢 akintayo
(编辑) 我发现在地图生命周期之外保存你不想要的文件的最佳位置是 job.get(“job.local.dir”),它提供了一个将被删除的路径地图任务完成。我不确定删除是基于每个键还是每个任务跟踪器完成的。
答案 0 :(得分:0)
该方法的问题在于排序和混洗将使数据远离数据本地化的位置。
我对您的数据知之甚少,但分布式缓存可能适合您
$ {mapred.local.dir} / taskTracker / archive /:分布式缓存。此目录包含本地化的分布式缓存。因此,本地化的分布式缓存在所有任务和作业之间共享
http://www.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/
“MapReduce程序通常需要每个映射读取一个或多个文件或在执行之前减少任务。例如,您可能有一个需要在处理一组记录之前解析的查找表。为了解决这种情况,Hadoop的MapReduce实现包括一个分布式文件缓存,它将管理将文件复制到任务执行节点。
DistributedCache是在Hadoop 0.7.0中引入的;有关其起源的更多详细信息,请参阅HADOOP-288。有关DistributedCache的大量现有文档:请参阅Hadoop常见问题解答,MapReduce教程,Hadoop Javadoc和Hadoop流教程。一旦您阅读了现有文档并了解如何使用DistributedCache,请继续。“