2013-02-21 57 views
1

分片输出(标题应该是分片,以反映Hadoops 碎片其在多个文件输出)阅读从Hadoop的工作从DistributedCache

我链接多个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。我无法指定硬文件名,因为每次运行程序时减速器的数量都可能会发生变化。我并不完全了解S3和HDFS如何协同工作,因此我们很难与文件系统进行交互来读取分片输出。我如何以适用于AWS的方式来实现这一点?

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

+0

有点;它不同于我以编程方式写入和从缓存中读取数据,而我无法确定这两者之间的问题在哪里。当只有“part-r-00000”担心时,手动添加文件就可以工作得很好;随着*分布式模式下的任意分片,我正在设计一个可以在分布式和独立模式下工作的解决方案。 – Magsol 2013-02-22 20:13:51

回答

1

原来这是一个简单的解决得到的东西在AWS上工作:那么

FileSystem fs = distCache.getFileSystem(conf); 

AWS可以看到目录下的碎片,它执行就好了。我仍然不知道为什么在我的问题中,前面的代码在标准集群上运行得很好时,AWS才能工作,但是您拥有它。