分享

/bin/bash: line 0: fg: no job control常见解决方法

问题导读:
1./bin/bash:的原因是什么?
2.解决的步骤是什么?







测试版本:CDH5.0,(Hadoop2.3)

在使用windows调用Hadoop yarn平台的时候,一般都会遇到如下的错误:

  1. 2014-05-28 17:32:19,761 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Exception from container-launch with container ID: container_1401177251807_0034_01_000001 and exit code: 1
  2. org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: line 0: fg: no job control
  3.         at org.apache.hadoop.util.Shell.runCommand(Shell.java:505)
  4.         at org.apache.hadoop.util.Shell.run(Shell.java:418)
  5.         at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650)
  6.         at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195)
  7.         at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:300)
  8.         at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)
  9.         at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  10.         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  11.         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  12.         at java.lang.Thread.run(Thread.java:744)
复制代码

这个错误在Hadoop mapreduce bug的信息页面(https://issues.apache.org/jira/browse/MAPREDUCE-5655)已经解决了,且影响的版本是Hadoop2.2、Hadoop2.3,并且已经解决(并没有说在Hadoop2.4已经修复了)。
http://blog.csdn.net/fansy1990/article/details/22896249 博客中,lz按照 https://issues.apache.org/jira/browse/MAPREDUCE-5655的解决方案进行了解决。这里想给出这个问题的一般解决思路。

1. 首先这个问题是在windows的eclipse作为客户端提交任务到linux Hadoop集群才会出现的问题,如果是linux的eclipse提交任务到linux Hadoop集群则不会出现这样的问题。那么一个很直观的想法就是同时使用两个客户端运行一个任务,然后每个步骤都调试,来确定其中的不同点。这么做,肯定是可以的。但是这么做肯定也是比较费时的(而且还要自己在一个linux上装个eclipse,麻烦);

2. 按照1的做法,一般就可以看到有两点的不同,一个是java命令的不同,还有一个就是classpath的不同。先说下断点的地方:

(1)java命令的断点:

YarnRunner.java的390行(cdh5.0 Hadoop2.3版本源码)


  1. // Setup the command to run the AM
  2.     List<String> vargs = new ArrayList<String>(8);
  3.     vargs.add(Environment.JAVA_HOME.$() + "/bin/java");
复制代码
这里打上断点后,然后运行到445这一行,就可以看到vargs是如下的样子(或者看vargsFinal这个变量):
  1. [%JAVA_HOME%, -Dlog4j.configuration=container-log4j.properties, -Dyarn.app.container.log.dir=<LOG_DIR>, -Dyarn.app.container.log.filesize=0, -Dhadoop.root.logger=INFO,CLA, , -Xmx1024m, org.apache.hadoop.mapreduce.v2.app.MRAppMaster, 1><LOG_DIR>/stdout, 2><LOG_DIR>/stderr, null, null]
复制代码

这里打上断点后,然后运行到445这一行,就可以看到vargs是如下的样子(或者看vargsFinal这个变量):
  1. [%JAVA_HOME%, -Dlog4j.configuration=container-log4j.properties, -Dyarn.app.container.log.dir=<LOG_DIR>, -Dyarn.app.container.log.filesize=0, -Dhadoop.root.logger=INFO,CLA, , -Xmx1024m, org.apache.hadoop.mapreduce.v2.app.MRAppMaster, 1><LOG_DIR>/stdout, 2><LOG_DIR>/stderr, null, null]
复制代码

(2)classpath的断点:
YarnRunner.java的466行,查看environment的值,可以看到起值为:

  1. {CLASSPATH=%PWD%;$HADOOP_CONF_DIR;$HADOOP_COMMON_HOME/*;$HADOOP_COMMON_HOME/lib/*;$HADOOP_HDFS_HOME/*;$HADOOP_HDFS_HOME/lib/*;$HADOOP_MAPRED_HOME/*;$HADOOP_MAPRED_HOME/lib/*;$HADOOP_YARN_HOME/*;$HADOOP_YARN_HOME/lib/*;%HADOOP_MAPRED_HOME%\share\hadoop\mapreduce\*;%HADOOP_MAPRED_HOME%\share\hadoop\mapreduce\lib\*;job.jar/job.jar;job.jar/classes/;job.jar/lib/*;%PWD%/*}
复制代码

3. 看到2中的两个值就可以确定,windows和linux的不同之处了,主要有两个:
(1)%%和$的区别;

(2)正反斜杠的区别(这个好像不区别也行);

4. 看出上面两个地方的区别后,如果直接把这两个值改为:

  1. [$JAVA_HOME/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=<LOG_DIR> -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA  -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1><LOG_DIR>/stdout 2><LOG_DIR>/stderr ]
复制代码


  1. {CLASSPATH=$PWD:$HADOOP_CONF_DIR:$HADOOP_COMMON_HOME/*:$HADOOP_COMMON_HOME/lib/*:$HADOOP_HDFS_HOME/*:$HADOOP_HDFS_HOME/lib/*:$HADOOP_MAPRED_HOME/*:$HADOOP_MAPRED_HOME/lib/*:$HADOOP_YARN_HOME/*:$HADOOP_YARN_HOME/lib/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*:job.jar/job.jar:job.jar/classes/:job.jar/lib/*:$PWD/*}
复制代码



那么应该是可以运行的;

5. 怎么改呢?

(1)在我们的工程中新建一个YarnRunner类,该类与源码的YarnRunner类一模一样(包路径,代码内容都一样);

(2)把390行替换为(这里默认Hadoop 集群是在linux环境下的):

即把


  1. vargs.add(Environment.JAVA_HOME.$() + "/bin/java");
复制代码
替换为
  1. vargs.add("$JAVA_HOME/bin/java");
复制代码

(3)在466行添加:
  1. replaceEnvironment(environment);
复制代码

这个方法放在最后面,为:
  1. private void replaceEnvironment(Map<String, String> environment) {
  2.           String tmpClassPath = environment.get("CLASSPATH");
  3.           tmpClassPath=tmpClassPath.replaceAll(";", ":");
  4.           tmpClassPath=tmpClassPath.replaceAll("%PWD%", "\\$PWD");
  5.           tmpClassPath=tmpClassPath.replaceAll("%HADOOP_MAPRED_HOME%", "\\$HADOOP_MAPRED_HOME");
  6.           tmpClassPath= tmpClassPath.replaceAll("\\\", "/" );
  7.           environment.put("CLASSPATH",tmpClassPath);
  8. }
复制代码

这样替换完成后,在windows的eclipse中向linux Hadoop集群中提交任务就可以执行了。

最后,在运行的时候,eclipse终端没有日志打印出来;直接在src下面加上一个log4j.properties文件(可以在linux 集群的/etc/hadoop/conf/里面下载)。










欢迎加入about云群425860289432264021 ,云计算爱好者群,关注about云腾讯认证空间

已有(16)人评论

跳转到指定楼层
ccb 发表于 2014-10-5 17:04:19
我照着复制一个YARNRunner.java,然后照着改了那三处。但还是不行,报错连信息都没了.

2014-10-05 16:56:41,230  INFO [Job.java:1334] - Running job: job_1412495156430_0010
2014-10-05 16:56:44,277  INFO [Job.java:1355] - Job job_1412495156430_0010 running in uber mode : false
2014-10-05 16:56:44,279  INFO [Job.java:1362] -  map 0% reduce 0%
2014-10-05 16:56:44,299  INFO [Job.java:1375] - Job job_1412495156430_0010 failed with state FAILED due to: Application application_1412495156430_0010 failed 2 times due to AM Container for appattempt_1412495156430_0010_000002 exited with  exitCode: 1 due to: Exception from container-launch: ExitCodeException exitCode=1:
ExitCodeException exitCode=1:
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)
        at org.apache.hadoop.util.Shell.run(Shell.java:455)
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
        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:300)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        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:745)
回复

使用道具 举报

ccb 发表于 2014-10-5 17:04:51
hadoop2.5.1版本
回复

使用道具 举报

pig2 发表于 2014-10-13 16:34:07
回复

使用道具 举报

ccb 发表于 2014-10-15 21:05:39
又照着步骤重安装走一遍了,这错误又过去了。但eclipse提交任务到hadoop上总是出现这问题,程序不会提交到集群上,win7系统eclipse,hadoop2.5.1。
pig2大神这咋解决啊,网上也没看到好的解决方式,你们从eclipse跑mr都能直接提交到集群吗?

Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class ccb.test.wordcount.WordMapper not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1905)
        at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:186)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1614)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
Caused by: java.lang.ClassNotFoundException: Class ccb.test.wordcount.WordMapper not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:1811)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:1903)
        ... 8 more
回复

使用道具 举报

pig2 发表于 2014-10-15 21:11:26
ccb 发表于 2014-10-15 21:05
又照着步骤重安装走一遍了,这错误又过去了。但eclipse提交任务到hadoop上总是出现这问题,程序不会提交到 ...

这是没有找到包,检查自己的开发环境,hadoop jar包添加全了。把里面的包,添加到开发环境中

jar.png


回复

使用道具 举报

ccb 发表于 2014-10-15 21:24:42


我就用了这几个,够吗?
回复

使用道具 举报

ccb 发表于 2014-10-15 21:25:25
<dependency>
                        <groupId>org.apache.hadoop</groupId>
                        <artifactId>hadoop-common</artifactId>
                        <version>2.5.1</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.hadoop</groupId>
                        <artifactId>hadoop-client</artifactId>
                        <version>2.5.1</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.hadoop</groupId>
                        <artifactId>hadoop-mapreduce-client-core</artifactId>
                        <version>2.5.1</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.hadoop</groupId>
                        <artifactId>hadoop-hdfs</artifactId>
                        <version>2.5.1</version>
                </dependency>
回复

使用道具 举报

pig2 发表于 2014-10-15 21:28:09
ccb 发表于 2014-10-15 21:25
org.apache.hadoop
                        hadoop-common
                        2.5.1

把yarn的也添加进去
回复

使用道具 举报

ccb 发表于 2014-10-15 21:35:40

他引用到了
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条