【问题标题】:Hadoop accessing 3rd party libraries from local file system of a Hadoop nodeHadoop 从 Hadoop 节点的本地文件系统访问 3rd 方库
【发布时间】:2015-01-29 11:11:31
【问题描述】:

我的所有 Hadoop 节点上都有一个 jar 文件,地址为 /home/ubuntu/libs/javacv-0.9.jar,还有一些其他 jar 文件。

当我的 MapReduce 应用程序在 Hadoop 节点上执行时,我遇到了这个异常

java.io.FileNotFoundException: File does not exist hdfs://192.168.0.18:50000/home/ubuntu/libs/javacv-0.9.jar

如何解决此异常?我在 Hadoop 中运行的 jar 如何从 Hadoop 节点的本地文件系统访问第三方库?

【问题讨论】:

    标签: java hadoop filenotfoundexception


    【解决方案1】:

    您需要将文件复制到 HDFS 而不是本地文件系统。

    要将文件复制到 HDFS,您需要使用:

    hadoop fs -put localfile hdfsPath
    

    其他选项是将文件路径更改为:

    file:///home/ubuntu/libs/javacv-0.9.jar
    

    要将 jar 文件添加到类路径,请查看 DistributedCache

    DistributedCache.addFileToClassPath(new Path("file:///home/ubuntu/libs/javacv-0.9.jar"), job);
    

    您可能需要遍历该目录中的所有 jar 文件。

    【讨论】:

    • 谢谢 Paulo,我在 lib 文件夹中有 50 个 jar 文件。我需要一一指定所有条目还是有更好的方法?
    【解决方案2】:

    另一种选择是使用distributed cacheaddFileToClassPath(new Path("/myapp/mylib.jar"), job); 提交应添加到映射器和reducer 任务的类路径中的Jar 文件。

    注意:确保先将 jar 文件复制到 HDFS。

    您甚至可以使用 hadoop 命令行参数 -libjars <jar_file> 将 jar 文件添加到类路径。

    注意:确保您的 MapReduce 应用程序实现 ToolRunner 以允许来自命令行的 -libjars 选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多