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

Java 从DistributedCache读取Hadoop作业的分片输出,java,hadoop,distributed-computing,distributed-cache,Java,Hadoop,Distributed Computing,Distributed Cache,(标题应为sharded,以反映Hadoopshards在多个文件中的输出) 我正在将多个Hadoop作业链接在一起。早期的一个作业生成的输出比其他作业小几个数量级,因此我想将其放入DistributedCache。这是一个困难的部分。以下是我为此编写的代码: FileSystem fs = FileSystem.get(conf); Path pathPattern = new Path(distCache, "part-r-[0-9]*"); FileStatus [] list = fs.

(标题应为sharded,以反映Hadoopshards在多个文件中的输出)

我正在将多个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);
}
这在我的本地机器和我设置的虚拟集群上运行良好但是,与in不同,它在AWS上失败,原因是
DistributedCache.getCacheFiles()
的返回值是一个空列表。

本质上,我需要一种方法,以编程方式从一个MR作业读取分片输出,并将其放入DistributedCache。我不能指定硬文件名,因为每次程序运行时,还原程序的数量都会改变。我没有完全掌握S3和HDFS是如何协同工作的,因此我很难与文件系统交互以读取分片输出。我怎样才能在AWS上工作呢


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

事实证明,这是一个简单的修复程序,可以让AWS上的东西正常工作:

FileSystem fs = distCache.getFileSystem(conf);

AWS可以看到该目录下的碎片,并且执行得很好。我仍然不知道为什么当我问题中的前一段代码在标准集群上运行正常时,AWS需要这样做,但现在你有了它。

事实证明,这是一个简单的修复方法,可以让AWS正常工作:

FileSystem fs = distCache.getFileSystem(conf);

AWS可以看到该目录下的碎片,并且执行得很好。我仍然不知道为什么当我问题中的前一段代码在标准集群上运行得很好时,AWS需要这样做,但现在你有了它。

;它的不同之处在于,我是以编程方式从缓存中写入和读取的,我不知道这两者之间的问题在哪里。当只需要担心“part-r-00000”时,手动添加文件就可以了;由于在*分布式模式下进行任意分片,我很难设计出一种既能在*分布式模式下工作又能在独立模式下工作的解决方案;它的不同之处在于,我是以编程方式从缓存中写入和读取的,我不知道这两者之间的问题在哪里。当只需要担心“part-r-00000”时,手动添加文件就可以了;由于在*分布式模式下进行任意分片,我很难设计出一种既能在*分布式模式下工作又能在独立模式下工作的解决方案。