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

标签 java hadoop distributed-computing distributed-cache

(标题应该是sharded 以反射(reflect) Hadoops shards 其跨多个文件的输出)

我将多个 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 如何协同工作,因此很难与文件系统交互以读取分片输出。我如何才能以适用于 AWS 的方式执行此操作?

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

最佳答案

事实证明,这是让事情在 AWS 上正常运行的简单修复:

FileSystem fs = distCache.getFileSystem(conf);

然后 AWS 可以看到该目录下的分片,并且它执行得很好。我仍然不知道为什么当我问题中的先前代码在标准集群上运行良好时 AWS 必须这样做才能工作,但你已经知道了。

关于java - 从 DistributedCache 读取 Hadoop 作业的分片输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15012116/

相关文章:

java - DataNucleus 类不可持久异常

java - GCLocker 中的慢路径和快路径是什么?

java - mapreduce 中 map 任务中的 NullPointer 异常

algorithm - 当无法使用中央服务器时,用于生成 key 的 GUID 有哪些替代方案?

quartz-scheduler - 分布式定时器服务

java - Spring 表单绑定(bind)怎么做呢?无法将类型 [java.lang.String] 的值转换为所需类型

java - 按设定的重复间隔发送预定消息

hadoop - 如何在 hadoop 实例类型之间找到正确的部分

java - 我正在org.apache.hadoop.ipc.RemoteException:Mapreduce作业中的java.io.IOException?

java - 网格计算中用于发现客户端的软件