如何在hadoop文件系统上为Java程序设置类路径

如何在hadoop文件系统上为Java程序设置类路径,java,hadoop,classpath,Java,Hadoop,Classpath,我试图弄清楚如何设置引用HDFS的类路径?我找不到任何参考资料 java -cp "how to reference to HDFS?" com.MyProgram 如果我不能引用hadoop文件系统,那么我必须将所有引用的第三方lib/jar复制到每个hadoop机器上$hadoop_HOME下的某个地方……但我想通过将文件放入hadoop文件系统来避免这种情况。这可能吗 程序运行的hadoop命令行示例(我的预期是这样的,也许我错了): 但是,在上面的命令行中,如何添加java类路径?

我试图弄清楚如何设置引用HDFS的类路径?我找不到任何参考资料

 java -cp "how to reference to HDFS?" com.MyProgram 
如果我不能引用hadoop文件系统,那么我必须将所有引用的第三方lib/jar复制到每个hadoop机器上$hadoop_HOME下的某个地方……但我想通过将文件放入hadoop文件系统来避免这种情况。这可能吗

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

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

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

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

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

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

hadoop jar jarfilename.jar驱动器助理jar
-libjars以逗号分隔的lib列表

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

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

选项2)使用libjars选项命令进行此操作 hadoop jar-libjars逗号分隔的jar

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

选项4)在计算机中安装所有JAR,并将其位置包含在类路径中


选项5)您可以尝试将这些JAR放在分布式缓存中

您可以将jar路径指定为
-libjarshdfs://namenode/path_to_jar
,我已经用过这个了。

谢谢你!我需要使用$HADOOP_HOME/contrib/streaming/HADOOP-streaming-1.0.3.jar来映射输入文件。然后有我自己的java程序来处理输入流(文件内容)。我仍然对如何编写驱动程序类感到困惑。你能给我指一些文档或例子吗?谢谢!该库应该位于集群中运行hadoop的所有计算机上。您不必从客户端发送该库。该库应该位于集群中运行hadoop的所有计算机上。你不必从客户那里发送。请看这里:幻灯片27我想我仍然感到困惑…通过添加更多关于我需要什么的信息修改了我的问题…嗯。让我重新阅读你的答案…仍在试图弄清楚。jar是打包任何应用程序的标准方式,所以我不知道放置类(类在jar中)会有什么问题.hadoop jar$hadoop_HOME/contrib/streaming/hadoop-streaming-1.0.3.jar-libjars lucene-core-3.6.0.jar、hadoop-core-1.0.3.jar、concept.jar-input mydata_-output mydata_-out-mapper“java mylucene.conceptRunner”-以上是最后运行的命令。添加到本帖子中供其他人参考。非常感谢你的帮助,阿尼梅什。也谢谢你耐心的帮助!一旦程序在hadoop上运行,我得到了一个异常,因为“失败的映射任务超出了允许的限制”,我仍在调查…感谢您全面的回答。我有个问题。libjar能否引用hdfsjar文件(因为我希望避免将jar放在每个节点本地文件系统中)?如果没有,怎么做?
hdfs://path/to/your/file
 hadoop jar jarfilename.jar DriverClassInTheJar 
 -libjars comma-separated-list-of-libs <input> <output>