从DistributedCache读取Hadoop作业的分片输出

时间:2013-02-21 21:00:03

标签: java hadoop distributed-computing distributed-cache

(标题应分片以反映Hadoops 分片其输出跨多个文件)

我正在将多个Hadoop作业链接在一起。其中一个早期作业生成的输出比其他作业小几个数量级,因此我想把它放入DistributedCache中。这是一个难点。这是我写的代码:

FileSystem fs = FileSystem.get(conf);
Path pathPattern = new Path(distCache, "part-r-[0-9]*");
FileStatus [] list = fs.globStatus(pathPattern);
for (FileStatus status : list) {
    DistributedCache.addCacheFile(status.getPath().toUri(), conf);
}

这在我的本地计算机和我设置的虚拟群集上运行良好。 但是,与this question不同,它在AWS上失败,理由是DistributedCache.getCacheFiles()的返回值是一个空列表。

基本上,我需要以编程方式从一个MR作业读取分片输出并将其放入DistributedCache。我无法指定硬文件名,因为每次运行程序时,reducer的数量都会改变。我没有完全掌握S3和HDFS如何协同工作,因此很难与FileSystem交互以读取分片输出。如何以适用于AWS的方式执行此操作?

供参考,我使用的是Hadoop 1.0.x:1.0.4(四个Ubuntu 12.10虚拟机)和1.0.3(AWS)的组合。

1 个答案:

答案 0 :(得分:1)

事实证明,这是一个简单的解决方案,可以在AWS上运行:

FileSystem fs = distCache.getFileSystem(conf);

然后,AWS可以在该目录下看到分片,并且执行得很好。我仍然不知道为什么当我的问题中的前一个代码在标准集群上运行得很好时,AWS才能工作,但是你有它。