【问题标题】:JAVA_HOME error with upgrade to Spark 1.3.0升级到 Spark 1.3.0 时出现 JAVA_HOME 错误
【发布时间】:2015-05-24 02:00:36
【问题描述】:

我正在尝试将一个用 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 的网页界面(因为工作在那里,我知道它至少做到了这一点),它显示的唯一日志是这些:

    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 邮件列表上,如果/当我找到解决方案时,我会更新这两个地方。]

【问题讨论】:

  • 您必须设置一个名为 JAVA_HOME 的系统变量。
  • 我确实设置了 JAVA_HOME,但可能不在正确的位置 - 我正准备通过邮件列表中的跟进来编辑问题。 =)
  • 检查您的 JAVA_HOME 的目录/文件权限
  • 权限在配置文件和 /usr/jdk64/jdk1.6.0_31 上都是开放的。当我在 Spark 1.2.1 和 1.3.0 下运行它时,它们是一个常数。
  • 一个更详细的信息:如果我使用 1.2.1 构建程序集并在服务器上使用 Spark 1.2.1 程序集,但使用 Spark 1.3.0 的spark-submit 提交,错误仍然会发生。显然不是推荐的配置,但也许它会缩小到spark-submit 脚本?

标签: java scala hadoop apache-spark


【解决方案1】:

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

在我之前发生过,节点上 .bashrc 中的某些 env 变量没有被集群上生成的 yarn worker 读取。

该错误有可能与版本升级无关,而是与 YARN 环境配置有关。

【讨论】:

    【解决方案2】:

    好的,所以我让办公室里的其他人来帮助解决这个问题,我们找到了解决方案。我不确定其中有多少是特定于 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"
    

    现在各种 spark 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 或提交作业时都将程序集文件重新复制到集群。

    【讨论】:

      【解决方案3】:

      好吧,首先我建议您迁移到 Java 7。但是,这不是您正在寻找或需要帮助的内容。

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

      【讨论】:

      • 请注意,这个错误发生在集群机器上,而不是我的本地机器上,所以没有 rcfile 可以设置它。替代系统已经在集群机器上使用。
      • 您是否尝试在集群机器的 bashrc 中设置 JAVA_HOME?它仍然给你同样的错误吗?
      猜你喜欢
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2021-05-14
      • 2018-12-22
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      相关资源
      最近更新 更多