JAVA_HOME 升级到 Spark 1.3.0 时出错
JAVA_HOME error with upgrade to Spark 1.3.0
我正在尝试将一个用 Scala 编写的 Spark 项目从 Spark 1.2.1 升级到 1.3.0,所以我将 build.sbt
更改为:
-libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.1" % "provided"
+libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.0" % "provided"
然后制作一个assembly
jar,然后提交:
HADOOP_CONF_DIR=/etc/hadoop/conf \
spark-submit \
--driver-class-path=/etc/hbase/conf \
--conf spark.hadoop.validateOutputSpecs=false \
--conf spark.yarn.jar=hdfs:/apps/local/spark-assembly-1.3.0-hadoop2.4.0.jar \
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--deploy-mode=cluster \
--master=yarn \
--class=TestObject \
--num-executors=54 \
target/scala-2.11/myapp-assembly-1.2.jar
作业提交失败,终端出现以下异常:
15/03/19 10:30:07 INFO yarn.Client:
15/03/19 10:20:03 INFO yarn.Client:
client token: N/A
diagnostics: Application application_1420225286501_4698 failed 2 times due to AM
Container for appattempt_1420225286501_4698_000002 exited with exitCode: 127
due to: Exception from container-launch:
org.apache.hadoop.util.Shell$ExitCodeException:
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:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
最后,我去查看了 YARN app master 的 web 界面(既然工作在那里,我知道它至少做到了这一点),它显示的唯一日志是这些:
Log Type: stderr
Log Length: 61
/bin/bash: {{JAVA_HOME}}/bin/java: No such file or directory
Log Type: stdout
Log Length: 0
我不确定如何解释 - {{JAVA_HOME}}
是一个以某种方式进入脚本的文字(包括括号)吗?这是来自工作节点还是驱动程序?我可以做些什么来进行实验和故障排除?
我确实在集群所有节点的 hadoop 配置文件中设置了 JAVA_HOME
:
% grep JAVA_HOME /etc/hadoop/conf/*.sh
/etc/hadoop/conf/hadoop-env.sh:export JAVA_HOME=/usr/jdk64/jdk1.6.0_31
/etc/hadoop/conf/yarn-env.sh:export JAVA_HOME=/usr/jdk64/jdk1.6.0_31
自 1.2.1 以来,此行为在 1.3.0 中是否发生了变化?使用 1.2.1 且不做任何其他更改,作业完成得很好。
[注意:我最初在 Spark 邮件列表上发布了这个,我会更新这两个地方if/when我找到了解决方案。]
嗯,首先,我建议您转到 Java7。但是,这不是您正在寻找或需要帮助的内容。
关于设置JAVA_HOME,我建议您在您的bashrc 中设置它,而不是在多个文件中设置。此外,我建议您安装 java 和 /usr/bin.
的替代品
您试过在 etc/hadoop/yarn-env.sh 文件中设置 JAVA_HOME 吗?您的 JAVA_HOME 环境变量可能不适用于 运行 您工作的 YARN 容器。
我之前发生过,节点上 .bashrc 中的某些环境变量没有被集群上产生的 yarn worker 读取。
有可能与版本升级无关,与YARN环境配置有关。
好的,所以我让办公室里的其他人帮忙解决这个问题,我们想出了一个解决方案。我不确定其中有多少特定于 CentOS 上 Hortonworks HDP 2.0.6 的文件布局,这正是我们 运行 在我们的集群上设置的。
我们手动将一些目录从其中一台集群机器(或任何可以成功使用 Hadoop 客户端的机器)复制到您的本地机器。我们称那台机器为 $GOOD
.
设置 Hadoop 配置文件:
cd /etc
sudo mkdir hbase hadoop
sudo scp -r $GOOD:/etc/hbase/conf hbase
sudo scp -r $GOOD:/etc/hadoop/conf hadoop
设置 Hadoop 库和可执行文件:
mkdir ~/my-hadoop
scp -r $GOOD:/usr/lib/hadoop\* ~/my-hadoop
cd /usr/lib
sudo ln –s ~/my-hadoop/* .
path+=(/usr/lib/hadoop*/bin) # Add to $PATH (this syntax is for zsh)
设置 Spark 库和可执行文件:
cd ~/Downloads
wget http://apache.mirrors.lucidnetworks.net/spark/spark-1.4.1/spark-1.4.1-bin-without-hadoop.tgz
tar -zxvf spark-1.4.1-bin-without-hadoop.tgz
cd spark-1.4.1-bin-without-hadoop
path+=(`pwd`/bin)
hdfs dfs -copyFromLocal lib/spark-assembly-*.jar /apps/local/
设置一些环境变量:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
export HADOOP_CONF_DIR=/etc/hadoop/conf
export SPARK_DIST_CLASSPATH=$(hadoop --config $HADOOP_CONF_DIR classpath)
`grep 'export HADOOP_LIBEXEC_DIR' $HADOOP_CONF_DIR/yarn-env.sh`
export SPOPTS="--driver-java-options=-Dorg.xerial.snappy.lib.name=libsnappyjava.jnilib"
export SPOPTS="$SPOPTS --conf spark.yarn.jar=hdfs:/apps/local/spark-assembly-1.4.1-hadoop2.2.0.jar"
现在各种火花 shell 可以像这样 运行:
sparkR --master yarn $SPOPTS
spark-shell --master yarn $SPOPTS
pyspark --master yarn $SPOPTS
一些备注:
JAVA_HOME
设置与我一直以来的设置相同 - 只是将其包含在此处以完成。所有对 JAVA_HOME
的关注原来是一个转移话题。
--driver-java-options=-Dorg.xerial.snappy.lib.name=libsnappyjava.jnilib
是必需的,因为我收到关于 java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path
的错误。 jnilib
文件是 OS X 的正确选择。
--conf spark.yarn.jar
部分只是为了节省时间,避免每次启动 shell 或提交作业时都将程序集文件重新复制到集群。
我正在尝试将一个用 Scala 编写的 Spark 项目从 Spark 1.2.1 升级到 1.3.0,所以我将 build.sbt
更改为:
-libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.1" % "provided"
+libraryDependencies += "org.apache.spark" %% "spark-core" % "1.3.0" % "provided"
然后制作一个assembly
jar,然后提交:
HADOOP_CONF_DIR=/etc/hadoop/conf \
spark-submit \
--driver-class-path=/etc/hbase/conf \
--conf spark.hadoop.validateOutputSpecs=false \
--conf spark.yarn.jar=hdfs:/apps/local/spark-assembly-1.3.0-hadoop2.4.0.jar \
--conf spark.serializer=org.apache.spark.serializer.KryoSerializer \
--deploy-mode=cluster \
--master=yarn \
--class=TestObject \
--num-executors=54 \
target/scala-2.11/myapp-assembly-1.2.jar
作业提交失败,终端出现以下异常:
15/03/19 10:30:07 INFO yarn.Client:
15/03/19 10:20:03 INFO yarn.Client:
client token: N/A
diagnostics: Application application_1420225286501_4698 failed 2 times due to AM
Container for appattempt_1420225286501_4698_000002 exited with exitCode: 127
due to: Exception from container-launch:
org.apache.hadoop.util.Shell$ExitCodeException:
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:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
最后,我去查看了 YARN app master 的 web 界面(既然工作在那里,我知道它至少做到了这一点),它显示的唯一日志是这些:
Log Type: stderr
Log Length: 61
/bin/bash: {{JAVA_HOME}}/bin/java: No such file or directory
Log Type: stdout
Log Length: 0
我不确定如何解释 - {{JAVA_HOME}}
是一个以某种方式进入脚本的文字(包括括号)吗?这是来自工作节点还是驱动程序?我可以做些什么来进行实验和故障排除?
我确实在集群所有节点的 hadoop 配置文件中设置了 JAVA_HOME
:
% grep JAVA_HOME /etc/hadoop/conf/*.sh
/etc/hadoop/conf/hadoop-env.sh:export JAVA_HOME=/usr/jdk64/jdk1.6.0_31
/etc/hadoop/conf/yarn-env.sh:export JAVA_HOME=/usr/jdk64/jdk1.6.0_31
自 1.2.1 以来,此行为在 1.3.0 中是否发生了变化?使用 1.2.1 且不做任何其他更改,作业完成得很好。
[注意:我最初在 Spark 邮件列表上发布了这个,我会更新这两个地方if/when我找到了解决方案。]
嗯,首先,我建议您转到 Java7。但是,这不是您正在寻找或需要帮助的内容。
关于设置JAVA_HOME,我建议您在您的bashrc 中设置它,而不是在多个文件中设置。此外,我建议您安装 java 和 /usr/bin.
的替代品您试过在 etc/hadoop/yarn-env.sh 文件中设置 JAVA_HOME 吗?您的 JAVA_HOME 环境变量可能不适用于 运行 您工作的 YARN 容器。
我之前发生过,节点上 .bashrc 中的某些环境变量没有被集群上产生的 yarn worker 读取。
有可能与版本升级无关,与YARN环境配置有关。
好的,所以我让办公室里的其他人帮忙解决这个问题,我们想出了一个解决方案。我不确定其中有多少特定于 CentOS 上 Hortonworks HDP 2.0.6 的文件布局,这正是我们 运行 在我们的集群上设置的。
我们手动将一些目录从其中一台集群机器(或任何可以成功使用 Hadoop 客户端的机器)复制到您的本地机器。我们称那台机器为 $GOOD
.
设置 Hadoop 配置文件:
cd /etc
sudo mkdir hbase hadoop
sudo scp -r $GOOD:/etc/hbase/conf hbase
sudo scp -r $GOOD:/etc/hadoop/conf hadoop
设置 Hadoop 库和可执行文件:
mkdir ~/my-hadoop
scp -r $GOOD:/usr/lib/hadoop\* ~/my-hadoop
cd /usr/lib
sudo ln –s ~/my-hadoop/* .
path+=(/usr/lib/hadoop*/bin) # Add to $PATH (this syntax is for zsh)
设置 Spark 库和可执行文件:
cd ~/Downloads
wget http://apache.mirrors.lucidnetworks.net/spark/spark-1.4.1/spark-1.4.1-bin-without-hadoop.tgz
tar -zxvf spark-1.4.1-bin-without-hadoop.tgz
cd spark-1.4.1-bin-without-hadoop
path+=(`pwd`/bin)
hdfs dfs -copyFromLocal lib/spark-assembly-*.jar /apps/local/
设置一些环境变量:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
export HADOOP_CONF_DIR=/etc/hadoop/conf
export SPARK_DIST_CLASSPATH=$(hadoop --config $HADOOP_CONF_DIR classpath)
`grep 'export HADOOP_LIBEXEC_DIR' $HADOOP_CONF_DIR/yarn-env.sh`
export SPOPTS="--driver-java-options=-Dorg.xerial.snappy.lib.name=libsnappyjava.jnilib"
export SPOPTS="$SPOPTS --conf spark.yarn.jar=hdfs:/apps/local/spark-assembly-1.4.1-hadoop2.2.0.jar"
现在各种火花 shell 可以像这样 运行:
sparkR --master yarn $SPOPTS
spark-shell --master yarn $SPOPTS
pyspark --master yarn $SPOPTS
一些备注:
JAVA_HOME
设置与我一直以来的设置相同 - 只是将其包含在此处以完成。所有对JAVA_HOME
的关注原来是一个转移话题。--driver-java-options=-Dorg.xerial.snappy.lib.name=libsnappyjava.jnilib
是必需的,因为我收到关于java.lang.UnsatisfiedLinkError: no snappyjava in java.library.path
的错误。jnilib
文件是 OS X 的正确选择。--conf spark.yarn.jar
部分只是为了节省时间,避免每次启动 shell 或提交作业时都将程序集文件重新复制到集群。