4

我在 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);  

这种方法的问题是我不确定它是最佳的,而且我必须删除每个新文件夹,否则我开始用完空间。谢谢阿金塔约

(编辑)我发现保存文件的最佳位置是job.get("job.local.dir"),它提供了一个在地图任务完成时将被删除的路径. 我不确定删除是基于每个键还是针对每个任务跟踪器完成的。

4

1 回答 1

0

这种方法的问题在于,排序和洗牌会将您的数据从数据本地化的位置移开。

我对您的数据了解不多,但分布式缓存可能对您很有效

${mapred.local.dir}/taskTracker/archive/ :分布式缓存。该目录保存本地化的分布式缓存。因此,本地化的分布式缓存在所有任务和作业之间共享

http://www.cloudera.com/blog/2008/11/sending-files-to-remote-task-nodes-with-hadoop-mapreduce/

“MapReduce 程序通常要求每个 map 或 reduce 任务在执行之前读取一个或多个文件。例如,您可能有一个查找表需要在处理一组记录之前进行解析。为了解决这个问题在场景中,Hadoop 的 MapReduce 实现包括一个分布式文件缓存,它将管理将文件复制到任务执行节点。

DistributedCache 是在 Hadoop 0.7.0 中引入的;有关其起源的更多详细信息,请参见 HADOOP-288。DistributedCache 现有大量文档:请参阅 Hadoop 常见问题解答、MapReduce 教程、Hadoop Javadoc 和 Hadoop 流式教程。一旦您阅读了现有文档并了解了如何使用 DistributedCache,请回来。”

于 2010-07-30T20:46:37.027 回答