升级到Spark 1.3.0的HOME错误

我试图用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罐,并提交它:

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应用程序主人的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邮件列表上发布了这个,如果/当我找到解决方案时,我会更新这两个地方。]


你有没有尝试在etc / hadoop / yarn-env.sh文件中设置JAVA_HOME? 您的JAVA_HOME环境变量可能不适用于正在运行作业的YARN容器。

它发生在我身上之前,节点上的.bashrc中的某些env变量没有被群集上产生的纱线工读取。

错误与版本升级无关,而是与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"

现在各种火花弹可以像这样运行:

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错误java.lang.UnsatisfiedLinkError: no snappyjava in java.library.pathjnilib文件是OS X的正确选择。
  • --conf spark.yarn.jar只是为了节省时间,避免每次启动shell或提交作业时将程序集文件重新复制到集群。

  • 那么,首先我建议你转移到Java 7.但是,这不是你正在寻找或需要帮助。

    对于设置JAVA_HOME,我建议你将它设置在你的bashrc中,而不是设置在多个文件中。 此外,我会建议你安装java,替代/ usr / bin。

    链接地址: http://www.djcxy.com/p/25235.html

    上一篇: HOME error with upgrade to Spark 1.3.0

    下一篇: Sharing Google Analytics ClientID between javascript client and java server