有几个相关的问题,但我花了一整天的时间试图弄清楚这个问题,答案在 SO 的任何地方都没有,所以我将其记录下来以供后代使用。
我有一个 Hadoop 安装(CDH 3u6 - Hadoop 0.20.2),我想在其中发送一个具有多个 Jar 依赖项的 map reduce 作业。像大多数地方推荐的那样,我想使用分布式缓存将依赖项发送到数据节点。
Path someHdfsPlace = new Path("my/mr/libs");
FileStatus[] jarFiles = hdfs.listStatus(classpathFilesDir);
for (FileStatus fs : jarFiles) {
DistributedCache.addFileToClassPath(fs.getPath(), job.getConfiguration());
}
我在不同的 Hadoop 集群上看到了这项工作,但现在突然不行了。该文件存在于 hdfs 中,并且似乎对其上方的文件和目录具有正确的权限,但是任何 MR 代码在尝试从 lib 加载依赖项时都会失败并出现ClassNotFound
错误(因此不是损坏问题,只是这些东西在类路径上不存在。)
一篇文章建议必须设置$HADOOP_CLASSPATH
变量 - 这在某些情况下可能会有所帮助,但我不清楚你会将它设置为什么,在我之前的工作示例中,我不必这样做,所以看起来不太可能。
无比神秘!