Spark SQL 是什么
Spark SQL 是 Spark 处理结构化数据的模块,外面提供 SQL 与 DataFrame/Dataset API 两种入口,内部把执行计划交给 Catalyst 优化器与钨丝执行引擎处理。它兼容 Hive Metastore 与大部分 Hive 语法,因此能直接读写 Hive 表;同一套 API 也能处理流式数据(Structured Streaming),做到批流代码统一。相比原生 MapReduce,它尽量把中间结果放在内存并在算子间流水化,多步 JOIN 与迭代计算更快。
基本信息
| 定位 | 统一的批流内存计算引擎 |
|---|---|
| 使用入口 | SQL、DataFrame / Dataset API |
| 优化组件 | Catalyst 优化器 + 钨丝执行引擎 |
| 元数据兼容 | Hive Metastore、大部分 HiveQL 语法 |
| 运行模式 | local / standalone / YARN / Kubernetes |
典型使用场景
- 离线 ETL 中多步 JOIN 与迭代计算,比 MapReduce 少落中间结果
- 替换 Hive on MapReduce 跑同一批 SQL,缩短批处理窗口
- Structured Streaming 消费消息队列做准实时加工,与批任务共用代码
- 数据探索与特征计算,用 DataFrame API 做列式处理与缓存复用
提交批作业
提交批作业
spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 20 --executor-memory 8g \
--conf spark.sql.shuffle.partitions=400 \
--conf spark.sql.adaptive.enabled=true \
job_trade_dws.py
# 本地调试:只改 master,不依赖集群
spark-submit --master local[4] job_trade_dws.py常用调优参数
| 参数 | 作用 | 经验值 |
|---|---|---|
| spark.sql.adaptive.enabled | AQE:运行时合并小分区、拆分倾斜分区 | Spark 3.x 建议开启 |
| spark.sql.shuffle.partitions | shuffle 后的分区数 | 开启 AQE 后可设大,由运行时收敛 |
| spark.executor.memory | 单个 executor 堆内存 | 与容器配额匹配,另需预留 overhead |
| spark.sql.autoBroadcastJoinThreshold | 小表广播阈值 | 默认 10MB,小维表可适当调大 |
Spark 3.x 的 AQE 能在运行时合并小分区、拆分倾斜分区,多数 ETL 场景不必再手工精调并行度。真正影响耗时的一般是三类:shuffle 数据量、数据倾斜、序列化方式。先看 Spark UI 里 stage 与 task 的耗时分布,再决定调参数,比凭经验改配置有效得多。
批流统一怎么理解
- 同一套 DataFrame API 既能读批数据也能读流数据,主体代码一致,只换数据入口
- Structured Streaming 把流看成不断追加的表,用同一套 SQL 表达增量计算与聚合
- 统一省掉批、流两套作业的重复维护,但流的延迟与状态规模仍需按场景单独设计
要访问 Hive 表,把集群的 hive-site.xml 放进 Spark 配置目录即可共用同一份 Metastore 元数据;多引擎共享元数据是避免数据孤岛的关键,也意味着一次表结构变更会同时影响所有引擎上的作业。