【问题标题】:Spark-on-k8s:/opt/spark/bin/spark-class: line 71: /home/deploy/jdk1.8.0_201/bin/java: No such file or directorySpark-on-k8s:/opt/spark/bin/spark-class: line 71: /home/deploy/jdk1.8.0_201/bin/java: 没有这样的文件或目录
【发布时间】:2021-06-23 07:21:46
【问题描述】:

我按照说明在 https://spark.apache.org/docs/3.1.1/running-on-kubernetes.html#content 上运行 spark-on-k8s

提交以集群模式启动 Spark Pi 的示例后,pod 遇到错误,我不明白为什么会发生。

这是命令行:

./bin/spark-submit \
--master k8s://https://2-120:6443 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.container.image=ethanzhang1997/spark:3.1.1 \
local:///path/to/examples.jar

这是错误: error information

我认为这个容器应该在镜像中使用 java env,但它试图从我当前的计算机上读取 JAVA_HOME。

任何帮助对我都很重要,非常感谢!


现在我暂时解决了这个问题。我把对应版本的jdk下载到spark目录下,在Dockerfile中加入下面几行,就是构建spark镜像:

RUN mkdir -p /home/deploy
ADD jdk-8u201-linux-x64.tar.gz /home/deploy/

ENV JAVA_HOME /home/deploy/jdk1.8.0_201
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH

这确保我在映像和主机中都有相同的 JAVA_HOME。

但还有一点我无法理解。hadoop 和 spark env 在我的主机和图像之间也有所不同。为什么这不会引起问题?我注意到有一个在图像上挂载 spark dir 的过程,但是它是如何工作的?

顺便说一句,spark-on-kubernetes 上的官方指南似乎将 openjdk11 设为默认值。但是如果用户的 JAVA_HOME 不是这样设置的,那就有问题了,是吗?

【问题讨论】:

  • 嗨@EthanZhang,欢迎来到StackOverflow。我发现了非常相似的问题:stackoverflow.com/questions/43834670/…。这可以解决您的问题吗?
  • 谢谢@Mikolaj Glodziak,但这不是同一个问题,他的 spark 安装在 os 中,但我的 spark 安装在 k8s pod 中。根据那个问题,我认为我的 JAVA_HOME 设置是正确的。
  • JAVA_HOME 的路径设置不正确时会出现此错误。看起来您需要检查容器映像。见this question 或this
  • 感谢您的建议@Mikolaj Glodziak。我暂时解决了这个问题。我在我的问题描述下方添加了解决方案。但我并不完全了解这背后的机制。
  • 在容器中运行某些东西使其与环境的其余部分分开。如果您需要容器中的任何变量 - 它们必须在容器映像中。 “我的主机和图像之间的 hadoop 和 spark env 也不同。”在您的情况下,您只对容器图像中的变量感兴趣。

标签: apache-spark kubernetes


【解决方案1】:

最近遇到了同样的问题并进行了一些测试以了解这种行为。以下是我的发现。

如果存在 export JAVA_HOME=\path\to\java 启动机器的 $SPARK_HOME/conf 文件夹中 spark-env.sh 中的命令,然后在启动机器和启动机器上使用该确切值作为 java home在 docker 容器中(即使您在容器中设置了 JAVA_HOME 环境变量)。尝试了多个选项来覆盖 docker 容器内的 spark-env 值,但无济于事。

但是,如果您从 spark-env.sh 中删除 JAVA_HOME 导出命令,则 JAVA_HOME 会从启动机器和 docker 容器中的 bash_profile(或者如果以其他方式导出)中获取。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2020-10-09
    • 2018-12-17
    • 1970-01-01
    相关资源
    最近更新 更多