在Apache Spark中,“SPARK_HOME/launcher/target/scala-2.13”在哪里?如何使用它?

m1m5dgzv  于 2023-10-23  发布在  Apache
关注(0)|答案(2)|浏览(137)

当我在本地集群模式下启动Spark程序时,我得到了以下错误:

17:45:33.930 [ExecutorRunner for app-20231004174533-0000/0] ERROR org.apache.spark.deploy.worker.ExecutorRunner - Error running executor
java.lang.IllegalStateException: Cannot find any build directories.
    at org.apache.spark.launcher.CommandBuilderUtils.checkState(CommandBuilderUtils.java:228) ~[spark-launcher_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.launcher.AbstractCommandBuilder.getScalaVersion(AbstractCommandBuilder.java:241) ~[spark-launcher_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.launcher.AbstractCommandBuilder.buildClassPath(AbstractCommandBuilder.java:195) ~[spark-launcher_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.launcher.AbstractCommandBuilder.buildJavaCommand(AbstractCommandBuilder.java:118) ~[spark-launcher_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.launcher.WorkerCommandBuilder.buildCommand(WorkerCommandBuilder.scala:39) ~[spark-core_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.launcher.WorkerCommandBuilder.buildCommand(WorkerCommandBuilder.scala:45) ~[spark-core_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.deploy.worker.CommandUtils$.buildCommandSeq(CommandUtils.scala:63) ~[spark-core_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.deploy.worker.CommandUtils$.buildProcessBuilder(CommandUtils.scala:51) ~[spark-core_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.deploy.worker.ExecutorRunner.org$apache$spark$deploy$worker$ExecutorRunner$$fetchAndRunExecutor(ExecutorRunner.scala:160) [spark-core_2.13-3.5.0.jar:3.5.0]
    at org.apache.spark.deploy.worker.ExecutorRunner$$anon$1.run(ExecutorRunner.scala:80) [spark-core_2.13-3.5.0.jar:3.5.0]

分析Spark的源代码会导致以下代码片段导致错误:
(the以下是Spark 3.5.0源代码的一部分:AbstractCommandBuilder.scala,第227行)

String getScalaVersion() {
    String scala = getenv("SPARK_SCALA_VERSION");
    if (scala != null) {
      return scala;
    }
    String sparkHome = getSparkHome();
    File scala213 = new File(sparkHome, "launcher/target/scala-2.13");
    checkState(scala213.isDirectory(), "Cannot find any build directories.");
    return "2.13";
    // ...
  }

这个函数的目的是确保“SPARK_HOME/launcher/target/scala-2.13”的存在,以确保部署的Spark是使用相同的Scala版本编译的。不幸的是,这个目录只存在于Spark项目中,Spark的二进制版本没有它:

是否应该改进此功能以兼容这两个发行版?

**更新1:**非常感谢Anish的建议,Spark发行版不包含Scala二进制文件。但事实上,它们包含:

这可能是一个更可靠的证据,以确定Scala版本,但在这个时候,它没有使用。

qcuzuvrc

qcuzuvrc1#

org.apache.spark.launcher.AbstractCommandBuilder#getScalaVersion()的Spark代码来自commit 2da6d1aPR 43125,在此之前是PR SPARK-32434
这似乎是硬编码的,这意味着在启动Spark应用程序之前,您需要将SPARK_SCALA_VERSION环境变量设置为您正在使用的Scala版本。这应该可以绕过getScalaVersion()中失败的目录检查。

brjng4g3

brjng4g32#

我不知道你做了什么,但我没有遇到任何问题,而运行Spark。
准确的说,你必须选择Apache Spark Binary,它包含scala库,并且附带spark-3.5.0-bin-hadoop 3-scala2.13.tgz文件。

**注意:**我没有安装scala。

一步一步地告诉我它是如何在我的本地。

1.现在,从/bin文件夹打开终端。
1.执行./spark-shell --master local命令,在本地运行集群模式。
截图:

要验证它是否在本地模式下运行,在scala终端输入sc.isLocal,如屏幕截图所示。

**注意:**Spark 3.5.0的二进制文件已经预先打包了Scala库,所以不会抛出这个错误。

进入/jars目录,你所有的scala库都在那里。

仅此而已

相关问题