国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
在使用windows調(diào)用Hadoop 錯誤 /bin/bash: line 0: fg: no job control一般解決方法

在使用windows調(diào)用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: 1org.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)已經(jīng)解決了,且影響的版本是Hadoop2.2、Hadoop2.3,并且已經(jīng)解決(并沒有說在Hadoop2.4已經(jīng)修復了)。

在http://blog.csdn.net/fansy1990/article/details/22896249 博客中,lz按照 https://issues.apache.org/jira/browse/MAPREDUCE-5655的解決方案進行了解決。這里想給出這個問題的一般解決思路。

1. 首先這個問題是在windows的eclipse作為客戶端提交任務到linux Hadoop集群才會出現(xiàn)的問題,如果是linux的eclipse提交任務到linux Hadoop集群則不會出現(xiàn)這樣的問題。那么一個很直觀的想法就是同時使用兩個客戶端運行一個任務,然后每個步驟都調(diào)試,來確定其中的不同點。這么做,肯定是可以的。但是這么做肯定也是比較費時的(而且還要自己在一個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)%%和$的區(qū)別;

(2)正反斜杠的區(qū)別(這個好像不區(qū)別也行); 
4. 看出上面兩個地方的區(qū)別后,如果直接把這兩個值改為:

[$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類一模一樣(包路徑,代碼內(nèi)容都一樣);

(2)把390行替換為(這里默認Hadoop 集群是在linux環(huán)境下的):

即把

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集群中提交任務就可以執(zhí)行了。


最后,在運行的時候,eclipse終端沒有日志打印出來;直接在src下面加上一個log4j.properties文件(可以在linux 集群的/etc/hadoop/conf/里面下載)。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Windows下部署/配置/調(diào)試hadoop2
Hadoop安裝教程總結
Apache Spark源碼走讀之10
Hadoop 2.2.0 (YARN)搭建筆記
hadoop2.6.0版本搭建偽分布式環(huán)境
CDH5安裝lzo
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服