Hadoop从Hadoop节点的本地文件系统访问第三方库

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

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

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

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

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

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

 hadop 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文件。

另一种选择是使用分布式缓存的addFileToClassPath(new Path("/myapp/mylib.jar"), job); 提交应该添加到mapper和reducer任务的类路径中的Jar文件。

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

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

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