我想弄清楚如何设置引用HDFS的类路径?我找不到任何参考。
java -cp "how to reference to HDFS?" com.MyProgram
如果我不能引用hadoop文件系统,那么我必须在每个hadoop机器上复制$ HADOOP_HOME下所有引用的第三方库/ jar ...但我想通过将文件放到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 classpath?喜欢 -cp“/home/nanshi/wiki/Lucene/lib/lucene-core-3.6.0.jar:/home/nanshi/Lucene/bin”
答案 0 :(得分:11)
我想你要做的是在分布式程序中包含第三方库。你可以做很多选择。
选项1)我找到的最简单的选项是将所有jar放在所有节点上的$ HADOOP_HOME / lib(例如/usr/local/hadoop-0.22.0/lib)目录中,然后重新启动jobtracker和tasktracker。
选项2)使用libjars选项命令 hadoop jar -libjars comma_seperated_jars
选项3)将jar包含在jar的lib目录中。在创建jar时你必须这样做。
选项4)安装计算机中的所有jar并将其位置包含在类路径中。
选项5)您可以尝试将这些jar放在分布式缓存中。
答案 1 :(得分: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>
答案 2 :(得分:2)
您可以将jar路径指定为
-libjars hdfs:// namenode / path_to_jar
,我把它和Hive一起使用了。