在使用windows调用Hadoop 错误 /bin/bash: line 0: fg: no job control一般解决方法
在使用windows调用Hadoop yarn平台的时候,一般都会遇到如下的错误:
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
org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: line 0: fg: no job control at org.apache.hadoop.util.Shell.runCommand(Shell.java:505)
at org.apache.hadoop.util.Shell.run(Shell.java:418)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650)
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: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版本源码)
// Setup the command to run the AM
List<String> vargs = new ArrayList<String>(8);
vargs.add(Environment.JAVA_HOME.$() + "/bin/java");
这里打上断点后,然后运行到445这一行,就可以看到vargs是如下的样子(或者看vargsFinal这个变量):
[%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的值,可以看到起值为:
{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. 看出上面两个地方的区别后,如果直接把这两个值改为:
[$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 ]
和
{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环境下的):
即把
vargs.add(Environment.JAVA_HOME.$() + "/bin/java");
替换为
vargs.add("$JAVA_HOME/bin/java");
(3)在466行添加:
replaceEnvironment(environment);
这个方法放在最后面,为:
private void replaceEnvironment(Map<String, String> environment) {
    String tmpClassPath = environment.get("CLASSPATH");
    tmpClassPath=tmpClassPath.replaceAll(";", ":");
    tmpClassPath=tmpClassPath.replaceAll("%PWD%", "\\$PWD");
    tmpClassPath=tmpClassPath.replaceAll("%HADOOP_MAPRED_HOME%", "\\$HADOOP_MAPRED_HOME");
    tmpClassPath= tmpClassPath.replaceAll("\\\\", "/" );
    environment.put("CLASSPATH",tmpClassPath);
}
这样替换完成后,在windows的eclipse中向linux Hadoop集群中提交任务就可以执行了。
最后,在运行的时候,eclipse终端没有日志打印出来;直接在src下面加上一个log4j.properties文件(可以在linux 集群的/etc/hadoop/conf/里面下载)。
在使用windows调用Hadoop 错误 /bin/bash: line 0: fg: no job control一般解决方法的更多相关文章
- /bin/bash: line 0: fg: no job control一般解决方法
		
測试版本号:CDH5.0,(Hadoop2.3) 在使用windows调用Hadoop yarn平台的时候,一般都会遇到例如以下的错误: 2014-05-28 17:32:19,761 WARN or ...
 - 【解决】org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: line 0: fg: no job control
		
[环境信息] Hadoop版本:2.4.0 客户端OS:Windows Server 2008 R2 服务器端OS:CentOS 6.4 [问题现象] 在通过Windows客户端向Linux服务器提交 ...
 - Yarn报错:Exception message: /bin/bash: line 0: fg: no job control
		
Exception message: /bin/bash: line 0: fg: no job control 这个错误是 本地idea跨平台远程调试hadoop集群出现的,在使用windows调用 ...
 - Exception message: /bin/bash: line 0: fg: no job control
		
这个错误是 我本地idea 远程调试hadoop集群出现的 Diagnostics: Exception from container-launch. Container id: container_ ...
 - PHP错误Warning: Cannot modify header information - headers already sent by解决方法
		
这篇文章主要介绍了PHP错误Warning: Cannot modify header information - headers already sent by解决方法,需要的朋友可以参考下 今天在 ...
 - Windows下运行python脚本报错“ImportError: No Module named ...”的解决方法
		
之前遇到一个问题,在Pycharm或IPython之类的IDE上运行脚本正常,但是直接运行或cmd命令行运行的时候报了模块未能找到的错误--ImportError: No Module named . ...
 - ubuntu下安装jdk(rpm版)错误: 找不到或无法加载主类 解决方法
		
1.官网下载jdk,linux64位,rpm格式的. 2.提取下载的文件,提取到一个目录下,我的是提取到了usr目录下了 3.终端输入:sudo gedit ~/.bashrc 会打开一个文本,在文本 ...
 - .NET Core SDK在Windows系统安装后出现Failed to load the hostfxr.dll等问题的解决方法
		
这次无论如何也要记录下,原因是今天在一台Windows2008R2的电脑上安装.NET Core SDK后再命令行执行dotnet --info 居然爆出了"Failed to load t ...
 - MDK错误 Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o). 解决方法
		
此错误产生的位置在STM32工程所包含的汇编启动代码文件,如下图 熟悉ARM汇编的朋友一定可以看出,这是一个子程序调用语句,而调用的子程序正是SystemInit.出现错误的原因就是汇编器没有在代码之 ...
 
随机推荐
- svn diff color
			
大致有两种方式: 1,在bashrc中添加如下脚本 svndiff() { svn diff "${@}" | colordiff } 2,修改svn的配置文件 $ vim ~/. ...
 - C++双向循环链表实现
			
双向循环链表C++实现 1.单链表: 结构图: 2.双向链表: 3.双向循环链表: 对于本程序中,则是给定一个_head 头结点,而不是指针,因为这样更加方便避免一些空判断问题 /* 版权信息:狼 ...
 - bzoj  4627  值域线段树
			
4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 523 Solved: 227[Submit][Sta ...
 - MySQl的group by 与排序
			
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtoAAAFLCAIAAABnXrwfAAAgAElEQVR4nO2dT29jvZHu+WHnW8xqdl ...
 - echarts在miniUI和ajax下动态渲染数据
			
<script src="echarts.js"></script> <script src="jquery-3.3.1.min.js&qu ...
 - DSOFramer原有的接口说明
			
(转自:http://blog.csdn.net/hwbox/article/details/5669414) DSOFramer原有的接口说明 =========================== ...
 - WebLogic和Tomcat
			
J2ee开发主要是浏览器和服务器进行交互的一种结构.逻辑都是在后台进行处理,然后再把结果传输回给浏览器.可以看出服务器在这种架构是非常重要的. 这几天接触到两种Java的web服务器,做项目用的Tom ...
 - ElementUI组件Cascader级联选择器数据后台处理
			
Cascader级联选择器数据数据格式不知道的可以去官网看下:这里我就不表示什么了. 部门实体类: import lombok.Data; @Data public class Department ...
 - C++编译错误:multiple types in one declaration
			
这是在使用QT的时候看到的.这种情况往往是结构体或者是class最后少加了一个分好,加上即可,这个bug找了我好久,mark一下.
 - compass框架的sprite雪碧图的用法简要
			
---恢复内容开始--- **简介** CSS SPRITE 即 CSS雪碧,即是将诸多图片合成一张图片,然后使用CSS 的background和background-position属性渲染. 这样 ...