Hadoop Map减少分布式缓存类路径问题

时间:2013-04-23 21:07:46

标签: hadoop mapreduce classpath

有几个相关的问题,但我花了一整天时间试图弄清楚这一个问题,答案并非真的在任何地方,所以我为后人录制它。

我有一个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变量 - 这在某些情况下可能会有所帮助,但我不清楚你会将它设置为什么,在我之前的工作示例中我没有不管怎样,不得不这样做,所以这似乎不太可能。

非常神秘!

1 个答案:

答案 0 :(得分:0)

对我来说,至少,答案在这个错误报告中:

https://issues.apache.org/jira/browse/MAPREDUCE-1581

该路径可能是一个完全限定的路径:hdfs://host:2456/my/mr/libs/myJar.jar,在:是路径分隔符的某些环境中,它将导致一组文件hdfs//host2456/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());
 }