环境准备:Spark 与 Delta Lake 版本兼容性、Maven/SBT 依赖配置、本地开发环境搭建(PySpark + Delta)
说实话,很多初学者在 Delta Lake 上栽的第一个跟头,不是语法问题,而是版本没配好。我记得刚接触 Delta Lake 那会儿,照着网上教程配了一下午,跑起来全是莫名其妙的序列化错误。后来才发现——Spark 和 Delta Lake 的版本必须严格对应,差一个小版本都可能翻车。
这一章,我们就来把环境彻底捋清楚。你跟着我走一遍,保证能跑通第一个 Delta Lake 程序。
版本兼容性:一张表说清楚
Delta Lake 的版本号跟 Spark 是绑定的。为什么?因为 Delta Lake 深度依赖 Spark 的内部 API,尤其是 Catalog、Session 和文件系统接口。Spark 每升一个主版本,这些 API 就可能变。
下面这张表是我在项目中反复验证过的组合,直接照着选就行:
| Delta Lake 版本 | Apache Spark 版本 | Scala 版本 | 备注 |
|---|---|---|---|
| 2.4.x | 3.4.x | 2.12 / 2.13 | 当前最稳定,推荐生产使用 |
| 3.0.x | 3.5.x | 2.13 | 支持 Liquid Clustering,新项目可选 |
| 2.3.x | 3.3.x | 2.12 / 2.13 | 较老,但仍在维护 |
| 1.2.x | 3.2.x | 2.12 | 已停止维护,不建议新项目使用 |
MERGE 操作时抛出 UnsupportedOperationException。查了半天才发现,2.4.x 只支持到 Spark 3.4.x。所以版本对照表一定要看官方文档的 Release Compatibility 章节。
Maven / SBT 依赖配置
如果你用 Scala + SBT 开发,依赖配置很简单。我个人习惯把 Delta Lake 的版本号抽成一个变量,方便后续升级:
// build.sbt
val deltaVersion = "2.4.0"
val sparkVersion = "3.4.0"
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
"io.delta" %% "delta-core" % deltaVersion,
"io.delta" %% "delta-storage" % deltaVersion
)
Maven 用户看这里:
<properties>
<delta.version>2.4.0</delta.version>
<spark.version>3.4.0</spark.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.delta</groupId>
<artifactId>delta-core_2.12</artifactId>
<version>${delta.version}</version>
</dependency>
<dependency>
<groupId>io.delta</groupId>
<artifactId>delta-storage</artifactId>
<version>${delta.version}</version>
</dependency>
</dependencies>
spark-sql 的 scope 设为 provided,因为运行时 Spark 集群已经提供了这些 jar。如果你打成 fat jar 还带上 Spark 依赖,部署时会跟集群自带的版本冲突,报 NoSuchMethodError 的概率极高。
PySpark + Delta Lake 本地开发环境搭建
我个人最常用的组合是 PySpark + Delta Lake,因为调试方便,写起来也快。下面是我在 Mac 和 Linux 上都验证过的步骤。
第一步:安装 Java 和 Python
Delta Lake 底层跑在 JVM 上,所以 Java 必须装。我建议用 Java 11:
# 检查 Java 版本
java -version
# 输出示例:openjdk version "11.0.20" 2023-07-18 LTS
# 检查 Python 版本(3.8 以上即可)
python --version
第二步:安装 PySpark
直接用 pip 装,但要注意版本号跟 Delta Lake 匹配:
pip install pyspark==3.4.0 delta-spark==2.4.0
这里有个细节——delta-spark 这个包会自动拉取 delta-core 和 delta-storage 的 jar 包。你不需要手动下载任何 jar 文件。
第三步:验证安装
写一个最简单的脚本,跑通就算成功:
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("DeltaQuickStart") \
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# 创建一张 Delta 表
data = [("Alice", 34), ("Bob", 45), ("Cathy", 29)]
df = spark.createDataFrame(data, ["name", "age"])
df.write.format("delta").save("/tmp/delta_table")
# 读取验证
df_read = spark.read.format("delta").load("/tmp/delta_table")
df_read.show()
如果控制台打印出三行数据,恭喜你,环境通了。
file:///C:/tmp/delta_table 这种格式。另外,Windows 下 PySpark 对中文路径支持不太好,我建议所有路径都用英文。
环境搭建核心流程
下面这张图把整个环境准备的关键步骤串起来了,你照着走就行:
IDE 配置建议
我平时用 VS Code + Jupyter Notebook 做 Delta Lake 的快速原型。你如果也这么配,记得装两个扩展:
- Python(微软官方)—— 提供 IntelliSense 和调试支持
- Jupyter —— 直接在 .ipynb 里跑 PySpark 代码
另外,在 Jupyter 里启动 SparkSession 时,我习惯加一行日志控制,不然控制台会被 INFO 日志刷屏:
import logging
logging.getLogger("py4j").setLevel(logging.ERROR)
📌 总结一下: 环境准备的核心就三件事——版本对齐、依赖正确、配置完整。你只要把 Delta Lake 和 Spark 的版本号对上,pip 安装时别搞混,再配好那两个扩展参数,基本不会出问题。