环境搭建:Spark与Delta Lake的集成、本地开发环境配置、Databricks环境快速上手
说实话,很多人在Delta Lake上栽跟头,不是因为概念不懂,而是环境没搭对。我见过太多人花了两天时间折腾依赖冲突,最后发现是Spark版本和Delta Lake不匹配。这一章,咱们就把这事彻底理清楚。
Spark与Delta Lake的版本匹配
这是最基础,也是最容易踩坑的地方。Delta Lake是Spark的一个扩展,它不是一个独立运行的引擎。所以,版本必须严格对应。
我个人的习惯是,先确定Spark版本,再去找对应的Delta Lake版本。别反过来,否则你会很痛苦。
| Spark 版本 | Delta Lake 版本 | 备注 |
|---|---|---|
| 3.0.x | 0.8.0 - 1.0.0 | 早期版本,功能有限 |
| 3.1.x | 1.0.0 - 1.2.1 | 开始稳定 |
| 3.2.x | 1.2.0 - 2.1.0 | 性能提升明显 |
| 3.3.x | 2.1.0 - 2.3.0 | 主流选择 |
| 3.4.x | 2.4.0 - 3.0.0 | 最新特性支持 |
本地开发环境配置
本地环境我推荐用两种方式:Maven/Gradle项目,或者直接用Spark的交互式Shell。我个人更倾向于前者,因为项目结构清晰,依赖管理方便。
方式一:基于Maven的项目配置
在你的pom.xml里,核心就是引入Delta Lake的依赖。注意,这里有个小技巧:Delta Lake的artifactId会随着版本变化。
<properties>
<scala.version>2.12</scala.version>
<spark.version>3.3.2</spark.version>
<delta.version>2.3.0</delta.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.version}</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.delta</groupId>
<artifactId>delta-core_${scala.version}</artifactId>
<version>${delta.version}</version>
</dependency>
</dependencies>
方式二:Spark Shell 快速验证
如果你想快速验证一个想法,用Spark Shell最方便。启动时加上Delta Lake的package即可。
# 启动Spark Shell并加载Delta Lake
spark-shell --packages io.delta:delta-core_2.12:2.3.0
# 或者用PySpark
pyspark --packages io.delta:delta-core_2.12:2.3.0
启动成功后,你会看到控制台输出一堆日志。看到“Delta Lake”相关的INFO日志,就说明加载成功了。
验证环境是否正常
写一段最简单的代码,创建一个Delta表,读出来看看。
// Scala 示例
import io.delta.tables._
val data = spark.range(0, 5)
data.write.format("delta").save("/tmp/delta-table")
val df = spark.read.format("delta").load("/tmp/delta-table")
df.show()
如果能正常输出0到4这5行数据,恭喜你,环境搭好了。
Databricks环境快速上手
如果你不想折腾本地环境,Databricks是最省心的选择。说白了,它就是Spark + Delta Lake的“全家桶”,开箱即用。
我记得第一次用Databricks时,最让我惊讶的是:你不需要手动指定任何Delta Lake的依赖。集群创建时,Delta Lake就已经内置好了。
创建Databricks集群
- 登录Databricks工作区
- 点击“计算” -> “创建集群”
- 选择运行时版本:推荐选择“Runtime 12.2 LTS”或更高版本
- 其他配置保持默认,点击“创建集群”
等个两三分钟,集群状态变成“运行中”,就可以用了。
在Notebook中使用Delta Lake
创建一个Notebook,选择你刚创建的集群。然后直接写代码:
# Python 示例
# 在Databricks中,Delta Lake已经预置,无需import
# 创建Delta表
df = spark.range(0, 10)
df.write.format("delta").saveAsTable("my_delta_table")
# 读取Delta表
display(spark.table("my_delta_table"))
# 查看表历史
display(spark.sql("DESCRIBE HISTORY my_delta_table"))
看到没?不需要任何额外的配置。这就是Databricks的优势——环境一致性。你在本地折腾半天的问题,在Databricks上可能一分钟就搞定了。
整体架构图
下面这张图,帮你理清Spark、Delta Lake和底层存储之间的关系。
常见问题与避坑
环境搭建过程中,有几个问题你大概率会遇到。我提前给你打个预防针。
- 依赖冲突:Delta Lake依赖的Jackson版本和Spark自带的可能冲突。解决办法是排除Delta Lake传递过来的Jackson依赖,使用Spark自带的版本。
- Hadoop版本不匹配:如果你用HDFS作为存储,Delta Lake的Hadoop版本必须和集群一致。否则会报RPC协议错误。
- 本地模式下的路径问题:在本地用
file:///路径时,注意权限。我遇到过因为/tmp目录权限不足导致写Delta表失败的情况。