Eclipse调用Hadoop2.2运行MR程序

Hadoop:hadoop2.2 ,windows myeclipse环境;

Eclipse调用hadoop运行MR程序其实就是普通的java程序可以提交MR任务到集群执行而已。在Hadoop1中,只需指定jt(jobtracker)和fs(namenode)即可,一般如下:

Configuration conf = new Configuration();
conf.set(“mapred.job.tracker”, “192.168.128.138:9001”);
conf.set(“fs.default.name”,”192.168.128.138:9000″);

上面的代码在hadoop1中运行是ok的,完全可以使用java提交任务到集群运行。但是,hadoop2却是没有了jt,新增了yarn。这个要如何使用呢?最简单的想法,同样指定其配置,试试。

Configuration conf = new YarnConfiguration();
    conf.set(“fs.defaultFS”, “hdfs://node31:9000”);
    conf.set(“mapreduce.framework.name”, “yarn”);
    conf.set(“yarn.resourcemanager.address”, “node31:8032”);

恩,这样配置后,可以运行,首先是下面的错误:

2014-04-03 21:20:21,568 ERROR [main] util.Shell (Shell.java:getWinUtilsPath(303)) – Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable nullbinwinutils.exe in the Hadoop binaries.
 at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:278)
 at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:300)
 at org.apache.hadoop.util.Shell.(Shell.java:293)
 at org.apache.hadoop.util.StringUtils.(StringUtils.java:76)
 at org.apache.hadoop.yarn.conf.YarnConfiguration.(YarnConfiguration.java:345)
 at org.fansy.hadoop.mr.WordCount.getConf(WordCount.java:104)
 at org.fansy.hadoop.mr.WordCount.runJob(WordCount.java:84)
 at org.fansy.hadoop.mr.WordCount.main(WordCount.java:47)

这个错误不用管,这个好像是windows调用的时候就会出的错误。

 

然后是什么权限问题之类的,这个时候就需要去调整下权限,至少我目前是这样做的。调整的权限主要有/tmp 以及运行wordcount的输入、输出目录。命令如下: $HADOOP_HOME/bin/hadoop fs -chmod -R 777 /tmp 。

然后直到你出现了下面的错误,那么,好了,可以说你已经成功了一半了。

2014-04-03 20:32:36,596 ERROR [main] security.UserGroupInformation (UserGroupInformation.java:doAs(1494)) – PriviledgedActionException as:Administrator (auth:SIMPLE) cause:java.io.IOException: Failed to run job : Application application_1396459813671_0001 failed 2 times due to AM Container for appattempt_1396459813671_0001_000002 exited with  exitCode: 1 due to: Exception from container-launch:
org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: line 0: fg: no job control

 at org.apache.hadoop.util.Shell.runCommand(Shell.java:464)
 at org.apache.hadoop.util.Shell.run(Shell.java:379)
 at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:589)
 at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195)
 at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:283)
 at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:79)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
 at java.util.concurrent.FutureTask.run(FutureTask.java:166)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 at java.lang.Thread.run(Thread.java:724)

.Failing this attempt.. Failing the application.

用上面出现的错误去google,可以得到这个网页:https://issues.apache.org/jira/browse/MAPREDUCE-5655 。 恩,对的。这个网页就是我们的solution。

 

我们分为1、2、3步骤吧。

1. 修改MRapps.java 、YARNRunner.java的源码,然后打包替换原来的jar包中的相应class文件,这两个jar我已经打包,可以在这里下载http://download.csdn.net/detail/fansy1990/7143547 。然后替换集群中相应的jar吧,同时需要注意替换Myeclipse中导入的包。额,说起Myeclipse中的jar包,这里还是先上幅jar包的图吧:



2. 修改mapred-default.xml ,添加:(这个只需在eclipse中导入的jar包修改即可,修改后的jar包不用上传到集群)

 mapred.remote.os
 Linux
 
  Remote MapReduce framework’s OS, can be either Linux or Windows
 

(题外话,添加了这个属性后,按说我new一个Configuration后,我使用conf.get(“mapred.remote.os”)的时候应该是可以得到Linux的,但是我得到的却是null,这个就不清楚是怎么了。)

 

其文件在:


这时,你再运行程序,额好吧程序基本可以提交了,