在ADF Databricks作业集群安装Maven库遇问题求助
问题描述
- 在初始化脚本执行命令
/databricks/spark/bin/spark-shell --packages com.crealytics:spark-excel_2.13:3.4.1_0.19.0时,报错:Error: Could not find or load main class org.apache.spark.launcher.Main /databricks/spark/bin/spark-class: line 101: CMD: bad array subscript - 在SparkSession初始化时添加
.config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.15.0")配置,但该配置未生效 - 工作区库(Workspace Libraries)已弃用,无法手动下载JAR到工作区并复制到
/databricks/jars/
解决办法
1. 放弃直接在初始化脚本中使用spark-shell
Databricks环境中spark-shell并非集群初始化依赖的推荐方式,直接调用会因环境变量、启动流程不匹配触发报错,改用集群级依赖配置方案即可规避。
2. 集群级别配置Maven依赖(推荐)
方式一:通过集群UI配置
进入集群编辑页面,切换到Libraries标签,点击Install New,选择Maven类型,在Coordinates输入框中填入对应依赖坐标(如com.databricks:spark-xml_2.12:0.15.0或com.crealytics:spark-excel_2.13:3.4.1_0.19.0),保存后重启集群。此方式会自动完成依赖下载、加载,无需手动处理文件。
方式二:初始化脚本中手动下载并配置类路径
如果必须通过初始化脚本操作,可直接下载JAR到集群本地目录,再添加到Spark类路径:
# 下载spark-xml依赖到临时目录 curl -o /tmp/spark-xml.jar https://repo1.maven.org/maven2/com/databricks/spark-xml_2.12/0.15.0/spark-xml_2.12-0.15.0.jar # 添加到Driver和Executor的类路径 echo "spark.driver.extraClassPath /tmp/spark-xml.jar" >> /databricks/driver/conf/spark.driver.extraClassPath.conf echo "spark.executor.extraClassPath /tmp/spark-xml.jar" >> /databricks/driver/conf/spark.executor.extraClassPath.conf
注意:集群重启后临时目录文件会被清除,需确保脚本每次初始化都重新执行下载操作。
3. 修复SparkSession配置不生效问题
使用configure_spark_with_delta_pip时可能覆盖部分配置,可调整配置顺序:
from delta import configure_spark_with_delta_pip from pyspark.sql import SparkSession # 先初始化Delta配置 builder = configure_spark_with_delta_pip(SparkSession.builder.appName("oms-xml-streaming")) # 再添加依赖及其他Spark配置 spark = (builder .config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.15.0") .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") .config("spark.databricks.delta.autoCompact.enabled", True) .getOrCreate())
也可在Notebook的Run Configuration中,将--packages com.databricks:spark-xml_2.12:0.15.0添加到Spark submit parameters,启动Notebook时会自动加载依赖。
4. 验证依赖加载状态
执行以下代码检查依赖是否成功加载:
# 过滤包含spark-xml的JAR包 spark.sparkContext.listJars().filter(lambda jar: "spark-xml" in jar)
返回非空列表则说明依赖已生效。
内容的提问来源于stack exchange,提问作者xuxu
相关产品推荐
相关产品推荐

