从distributedcache读取hadoop作业的分片输出

r9f1avp5  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(430)

(标题应该被切分以反映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);
}

这在我的本地机器和我设置的虚拟集群上运行良好。然而,与这个问题不同的是,它在aws上失败了,理由是 DistributedCache.getCacheFiles() 是一个空列表。
本质上,我需要一种方法,通过编程从一个mr作业读取分片输出,并将其放入distributedcache。我不能指定硬文件名,因为每次程序运行时,reducer的数量都会改变。我没有完全理解s3和hdfs是如何协同工作的,因此很难与文件系统交互以读取分片输出。我怎样才能在aws上工作呢?
作为参考,我使用的是hadoop1.0.x:1.0.4(四个ubuntu12.10虚拟机)和1.0.3(aws)的组合。

xtfmy6hx

xtfmy6hx1#

原来这是一个简单的解决办法,让东西在aws上工作:

FileSystem fs = distCache.getFileSystem(conf);

aws可以看到该目录下的碎片,执行得很好。我仍然不知道为什么这对aws来说是必要的,而我问题中的前一段代码在标准集群上运行得很好,但是你已经有了它。

相关问题