1

(标题应该被分以反映 Hadoop将其输出分到多个文件中)

我将多个 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。我不能指定硬文件名,因为每次运行程序时减速器的数量都会改变。我没有完全掌握 S3 和 HDFS 如何协同工作,因此很难与 FileSystem 交互以读取分片输出。如何以适用于 AWS 的方式执行此操作?

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

4

1 回答 1

1

事实证明,让事情在 AWS 上运行是一个简单的修复:

FileSystem fs = distCache.getFileSystem(conf);

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

于 2013-02-22T22:15:10.030 回答