首页/数据/数仓建模速查/Spark SQL:统一批流的内存计算引擎
湖仓与引擎63 条

Spark SQL:统一批流的内存计算引擎

Spark SQL 兼容 Hive 元数据与语法,支持批处理、流处理与机器学习;执行计划经 Catalyst 优化,比原生 MR 更适合迭代计算。

数仓建模速查数据更新于 2026-10-13

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.enabledAQE:运行时合并小分区、拆分倾斜分区Spark 3.x 建议开启
spark.sql.shuffle.partitionsshuffle 后的分区数开启 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 元数据;多引擎共享元数据是避免数据孤岛的关键,也意味着一次表结构变更会同时影响所有引擎上的作业。

易错点

  • 仍按 MapReduce 思路手调并行度:忽略 AQE 的运行时收敛能力,参数越调越乱
  • executor 内存设得超过容器配额:YARN 或 Kubernetes 直接杀容器,报 exit code 137
  • 小表没走广播就 JOIN 大表:shuffle 数据量暴涨,少数长尾 task 拖住整个 stage
  • 用 collect() 把大结果拉回 driver:driver 内存溢出,作业直接失败
  • 分区数设得过大或过小:task 过碎则调度开销高,task 过大则并行度用不上、单点慢

数据来源与参考

  • Apache Spark 官方文档:Spark SQL Guide
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌