在Hadoop2.6.0下使用命令行编译打包运行自己的MapReduce程序

  思路是:编写mapreduce源程序-----启动完全分布式hadoop集群----编译Java源程序----打包编译后的程序----在集群中运行编译后的程序。

  遇到的问题如下:   

  (1):如何将Java源程序打包成jar文件?

  (2):jar文件如何在hadoop集群中运行?

  (3):如何找到hadoop提供给Java源程序用来编译的Jar包?

  

  具体过程如下:

第一步:我们将 Hadoop 的 classhpath 信息添加到 CLASSPATH 变量中,在/etc/profile中增加如下几行:

  export HADOOP_HOME=/usr/local/hadoop
  export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH

别忘了执行source /etc/profile 使变量生效。这样对于问题(3)就进行了很好的解决。(虽然不知道Java源程序具体需要哪些Jar包,但是我在classpath下把所有hadoop的jar包都放进去,这样就解决了问题(3))

第二步:编译xxx.java源程序,在命令行执行如下命令

  javac xxxx.java -d {存放的目录}

  其中-d选项指定生成的类文件的位置,在编译的时候这个选项必须重新指定,不能让xxxx.class生成在当前目录下。这是因为xxxx.java内包含package信息,如果我们不加-d选项,则编译的时候会将package信息丢失,导致能编译通过,但是后续不能找到类文件的错误。

第三步 :将xxxx.class文件打包成一个jar包:在命令行执行如下命令:

  jar -cvf xxxx.jar -C {存放的目录} . 

  要注意不要忘记最后有一个点,否则jar命令报错。该点指示jar命令的文件列表,表示指定目录下的所有文件。这里不能用*,否则会添加除了指定目录还有当前目录下的所有文件。这样以后打包的结果是在执行jar命令的目录下生成一个xxxx.jar。

第四步:在集群中运行编译后的程序,执行如下命令:

  ${HADOOP_HOME}/bin/hadoop jar xxxx.jar xxxx.MainClassName  InputPath OutputPath

 

posted @ 2017-06-13 15:43  reedom1991  阅读(371)  评论(0编辑  收藏  举报