Windows环境安装Apache Spline(Spark数据血缘工具)报错求助
场景复现
我在Windows系统中尝试安装Apache Spline,使用Spark 2.4.0、Scala 2.12.0,遵循官网步骤先启动了Spline UI:
wget https://raw.githubusercontent.com/AbsaOSS/spline/release/0.5/docker-compose.yml docker-compose up
但执行启动pyspark shell的命令时:
pyspark \ --packages za.co.absa.spline.agent.spark:spark-2.4-spline-agent-bundle_2.12:0.5.3 \ --conf "spark.sql.queryExecutionListeners=za.co.absa.spline.harvester.listener.SplineQueryExecutionListener" \ --conf "spark.spline.producer.url=http://localhost:9090/producer"
出现以下错误:
C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\pyspark\shell.py:45: UserWarning: Failed to initialize Spark session. warnings.warn("Failed to initialize Spark session.")
Traceback (most recent call last):
File "C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\pyspark\shell.py", line 41, in
spark = SparkSession._create_shell_session()
File "C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\pyspark\sql\session.py", line 583, in _create_shell_session
return SparkSession.builder.getOrCreate()
File "C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\pyspark\sql\session.py", line 183, in getOrCreate
session._jsparkSession.sessionState().conf().setConfString(key, value)
File "C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\lib\py4j-0.10.7-src.zip\py4j\java_gateway.py", line 1257, in call
answer, self.gateway_client, self.target_id, self.name)
File "C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\pyspark\sql\utils.py", line 63, in deco
return f(*a, **kw)
File "C:\Users\AyanBiswas\Documents\softwares\spark-2.4.0-bin-hadoop2.7\python\lib\py4j-0.10.7-src.zip\py4j\protocol.py", line 328, in get_return_value
format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling o31.sessionState. : java.lang.NoSuchMethodError: org.apache.spark.internal.Logging.$init$(Lorg/apache/spark/internal/Logging;)V
排查后发现多数帖子指向Scala版本不匹配,但我使用的Scala 2.12.0与Spline包的2.12版本匹配,请问问题出在哪里?
问题根源
你踩了一个很容易忽略的坑:Spark 2.4.x 官方并不支持 Scala 2.12。
虽然你本地安装的是Scala 2.12.0,但Spark 2.4.0的预编译发行包(比如你用的spark-2.4.0-bin-hadoop2.7)默认是基于Scala 2.11构建的。Spark运行时依赖的是它自带的Scala库,和你本地的Scala环境完全无关——也就是说,你本地的Scala版本再新,也不影响Spark实际用的是哪个版本的Scala。
当你加载基于Scala 2.12编译的Spline agent包时,就会出现这种NoSuchMethodError类初始化错误,因为Scala 2.11和2.12的字节码不兼容,跨版本的类无法正常交互。
解决方案
有两种可行的解决路径,你可以根据自己的需求选择:
1. 保留Spark 2.4.0,改用Scala 2.11对应的Spline包
修改pyspark启动命令,把Spline包的Scala后缀从_2.12改成_2.11:
pyspark \ --packages za.co.absa.spline.agent.spark:spark-2.4-spline-agent-bundle_2.11:0.5.3 \ --conf "spark.sql.queryExecutionListeners=za.co.absa.spline.harvester.listener.SplineQueryExecutionListener" \ --conf "spark.spline.producer.url=http://localhost:9090/producer"
这个方案不需要更换Spark版本,直接适配Spark自带的Scala 2.11环境。
2. 升级Spark到3.0+,继续使用Scala 2.12
Spark从3.0版本开始才正式支持Scala 2.12,如果你想保留Scala 2.12环境,可以升级Spark到3.x版本,同时选择对应Spark 3.x的Spline agent包(比如spark-3.1-spline-agent-bundle_2.12,具体版本需要匹配你的Spark 3.x子版本)。
验证Spark的Scala版本
你可以通过运行spark-shell查看启动日志,里面会明确显示Spark使用的Scala版本(比如Spark 2.4.0默认是Using Scala version 2.11.12),这个版本才是你需要和Spline包匹配的版本。
内容的提问来源于stack exchange,提问作者Ayan Biswas

