当我在本地集群模式下启动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版本,但在这个时候,它没有使用。
2条答案
按热度按时间qcuzuvrc1#
在
org.apache.spark.launcher.AbstractCommandBuilder#getScalaVersion()
的Spark代码来自commit 2da6d1a和PR 43125,在此之前是PR SPARK-32434。这似乎是硬编码的,这意味着在启动Spark应用程序之前,您需要将
SPARK_SCALA_VERSION
环境变量设置为您正在使用的Scala版本。这应该可以绕过getScalaVersion()
中失败的目录检查。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库都在那里。仅此而已