有几个相关的问题,但我花了一整天时间试图弄清楚这一个问题,答案并非真的在任何地方,所以我为后人录制它。
我有一个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
变量 - 这在某些情况下可能会有所帮助,但我不清楚你会将它设置为什么,在我之前的工作示例中我没有不管怎样,不得不这样做,所以这似乎不太可能。
非常神秘!
答案 0 :(得分:0)
对我来说,至少,答案在这个错误报告中:
https://issues.apache.org/jira/browse/MAPREDUCE-1581
该路径可能是一个完全限定的路径:hdfs://host:2456/my/mr/libs/myJar.jar
,在:
是路径分隔符的某些环境中,它将导致一组文件hdfs
,//host
和2456/my/mr/libs/myJar.jar
,这些都不会导致将正确的文件添加到类路径中。
错误报告中发布的第二个解决方案对我有用 - 取消了这样的路径:
Path someHdfsPlace = new Path("my/mr/libs");
FileStatus[] jarFiles = hdfs.listStatus(classpathFilesDir);
for (FileStatus fs : jarFiles) {
Path disqualified = new Path(fs.getPath().toUri().getPath());
DistributedCache.addFileToClassPath(disqualified, job.getConfiguration());
}