java %PWD%

编程入门 行业动态 更新时间:2024-10-25 08:19:12

<a href=https://www.elefans.com/category/jswz/34/1770091.html style=java %PWD%"/>

java %PWD%

在使用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: 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的信息页面()已经解决了,且影响的版本是Hadoop2.2、Hadoop2.3,并且已经解决(并没有说在Hadoop2.4已经修复了)。

在 博客中,lz按照 。这里想给出这个问题的一般解决思路。

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 vargs = new ArrayList(8);

vargs.add(Environment.JAVA_HOME.$() + "/bin/java");

这里打上断点后,然后运行到445这一行,就可以看到vargs是如下的样子(或者看vargsFinal这个变量):

[%JAVA_HOME%, -Dlog4j.configuration=container-log4j.properties, -Dyarn.app.container.log.dir=, -Dyarn.app.container.log.filesize=0, -Dhadoop.root.logger=INFO,CLA, , -Xmx1024m, org.apache.hadoop.mapreduce.v2.app.MRAppMaster, 1>/stdout, 2>/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= -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1>/stdout 2>/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 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/里面下载)。

原文:.html

更多推荐

java %PWD%

本文发布于:2024-02-27 08:32:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1705890.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:java   PWD

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!