5

我想弄清楚如何设置引用 HDFS 的类路径?我找不到任何参考。

 java -cp "how to reference to HDFS?" com.MyProgram 

如果我无法引用 hadoop 文件系统,那么我必须将所有引用的第三方库/jar 复制到每台 hadoop 机器上 $HADOOP_HOME 下的某个位置……但我想通过将文件放入 hadoop 文件系统来避免这种情况。这可能吗?

程序运行的示例hadoop命令行(我的期望是这样的,也许我错了):

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-1.0.3.jar -input inputfileDir -output outputfileDir -mapper /home/nanshi/myprog.java -reducer NONE -file /home/nanshi/myprog.java

但是,在上面的命令行中,我如何添加 java 类路径?比如 -cp "/home/nanshi/wiki/Lucene/lib/lucene-core-3.6.0.jar:/home/nanshi/Lucene/bin"

4

3 回答 3

11

我想您正在尝试做的是在您的分布式程序中包含第三方库。你可以做很多选择。

选项 1) 我发现的最简单的选项是将所有 jar 放在所有节点上的 $HADOOP_HOME/lib(例如 /usr/local/hadoop-0.22.0/lib)目录中,然后重新启动 jobtracker 和 tasktracker。

选项 2) 为此使用 libjars 选项命令是 hadoop jar -libjars comma_seperated_jars

选项 3) 将 jars 包含在 jar 的 lib 目录中。在创建 jar 时,您必须这样做。

选项 4) 在您的计算机中安装所有 jar,并将它们的位置包含在类路径中。

选项 5)您可以尝试将这些 jar 放入分布式缓存中。

于 2012-07-28T05:29:47.593 回答
3

您不能将 HDFS 路径添加到您的类路径。java 可执行文件将无法解释如下内容:

hdfs://path/to/your/file

但是可以使用-libjars选项将第三方库添加到需要这些库的每个任务的类路径中。这意味着您需要有一个所谓的驱动程序类(实现工具)来设置和启动您的工作,并在运行该驱动程序类时在命令行上使用 -libjars 选项。反过来,该工具使用 GenericParser 解析您的命令行参数(包括 -libjars),并在 JobClient 的帮助下完成所有必要的工作,将您的 lib 发送到所有需要它们的机器,并将它们设置在那些机器。

除此之外,为了运行 MR 作业,您应该使用位于您的发行版的 bin/ 目录中的 hadoop 脚本。

这是一个示例(使用包含您的作业和驱动程序类的 jar):

 hadoop jar jarfilename.jar DriverClassInTheJar 
 -libjars comma-separated-list-of-libs <input> <output>
于 2012-07-27T23:08:04.493 回答
2

您可以将 jar 路径指定为
-libjars hdfs://namenode/path_to_jar ,我已将其与 Hive 一起使用。

于 2014-04-08T07:04:07.057 回答