1、Spark SQL 概述:Spark SQL 的发展历史、核心优势、与 Hive 的对比

1.1 从 Shark 到 Spark SQL:一段不得不说的历史

说起 Spark SQL,得先聊聊它的前身——Shark。2012 年左右,Hive 还是大数据 SQL 查询的事实标准。但 Hive 有个硬伤:慢。它基于 MapReduce,每次查询都要落盘,延迟高得让人抓狂。

我记得当时有个项目,每天跑 Hive 做报表,一个简单的聚合查询要等十几分钟。业务方催得急,我们只能干瞪眼。后来 Spark 出现了,内存计算让性能有了质的飞跃。于是 UC Berkeley 的 AMPLab 搞出了 Shark——说白了就是把 Hive 的 SQL 翻译成 Spark 的 RDD 操作。

但 Shark 有个问题:它深度依赖 Hive 的解析器和优化器,改起来非常痛苦。我参与过几个 Shark 的调优项目,每次加个新功能都要动 Hive 的源码,维护成本极高。所以 2014 年,Spark 团队决定推倒重来,开发了 Spark SQL。

Spark SQL 不再依赖 Hive 的解析器,而是自己实现了 Catalyst 优化器和 Tungsten 执行引擎。嗯,这才是真正的「自研」路线。从 Spark 1.0 到现在的 3.x 版本,Spark SQL 已经成了 Spark 生态里最核心的模块之一。

关键时间线:
  • 2012 年:Shark 诞生,基于 Hive + Spark
  • 2014 年:Spark SQL 1.0 发布,引入 DataFrame
  • 2015 年:Spark SQL 1.3 引入 Dataset API
  • 2016 年:Spark 2.0 统一了 DataFrame 和 Dataset
  • 2020 年至今:持续优化,支持 ANSI SQL、动态分区裁剪等

1.2 Spark SQL 的核心优势:凭什么选它?

你可能会问:市面上 SQL-on-Hadoop 的引擎那么多,为什么偏偏选 Spark SQL?我个人的经验是,它有几个别人学不来的优势。

1.2.1 统一的数据处理平台

Spark SQL 不只是个 SQL 引擎。它把批处理、流处理、机器学习、图计算全部统一在一个框架里。我在做实时数仓项目时,用 Spark Structured Streaming 做实时 ETL,然后用 Spark SQL 做 Ad-hoc 查询,一套代码搞定。这种「一个平台打天下」的感觉,真的很爽。

1.2.2 极致的性能优化

Catalyst 优化器和 Tungsten 执行引擎是 Spark SQL 的两大杀器。Catalyst 会做逻辑优化(比如谓词下推、列裁剪)和物理优化(比如选择 Broadcast Hash Join 还是 Sort Merge Join)。Tungsten 则通过代码生成和内存管理,把执行效率拉到极致。

我曾经对比过同样的查询,Spark SQL 比 Hive 快了 5-10 倍。当然,这不是绝对的,但大部分场景下 Spark SQL 确实更胜一筹。

1.2.3 丰富的 API 支持

Spark SQL 提供了三种 API:SQL、DataFrame、Dataset。你可以用 SQL 写查询,也可以用 Scala/Java/Python 写 DataFrame 操作。我个人习惯用 SQL 做快速探索,用 DataFrame 做复杂 ETL。灵活度非常高。

小提示: 如果你团队里 SQL 能力强的同学多,直接用 SQL 就好。如果要做复杂的业务逻辑,DataFrame API 更合适。别纠结,两个都学。

1.3 Spark SQL vs Hive:一场没有硝烟的战争

很多人问我:有了 Spark SQL,Hive 是不是该淘汰了?我的回答是:看场景。下面这张表是我在实际项目中总结的对比。

对比维度 Spark SQL Hive
执行引擎 Spark(内存计算) MapReduce / Tez(磁盘计算)
查询速度 快(内存迭代) 慢(磁盘落盘)
SQL 兼容性 ANSI SQL 大部分支持 HiveQL(类 SQL)
ACID 事务 有限支持(Delta Lake 等) 原生支持(Hive ACID)
数据规模 适合 TB-PB 级 适合 PB 级以上(更稳定)
资源消耗 高(内存需求大) 低(磁盘为主)
生态集成 Spark 全家桶 Hadoop 生态

1.3.1 什么时候选 Spark SQL?

  • 需要快速交互式查询,比如 BI 报表、Ad-hoc 分析
  • 要做复杂的多阶段计算,比如迭代算法、图计算
  • 团队已经用了 Spark 做 ETL,不想引入新引擎

1.3.2 什么时候选 Hive?

  • 数据量极大(PB 级以上),且对延迟不敏感
  • 需要强 ACID 事务支持,比如金融场景
  • 现有 Hadoop 集群资源有限,内存不足
避坑指南: 我曾经在一个项目中,为了追求性能,把所有 Hive 任务都迁移到了 Spark SQL。结果发现有些复杂的 SQL 在 Spark 上跑会 OOM(内存溢出)。后来我学乖了:不要一刀切。对于大表 Join 或者数据倾斜严重的场景,Hive 反而更稳定。

1.4 我的个人建议

如果你是新项目,我建议直接上 Spark SQL。原因很简单:生态好、性能强、社区活跃。但如果你维护的是老系统,别急着迁移。先把 Hive 和 Spark SQL 混用,慢慢过渡。

我记得有一次,一个客户非要我们一个月内把所有 Hive 任务改成 Spark SQL。结果呢?改到一半发现有些 UDF 不兼容,回滚都来不及。所以,渐进式迁移才是王道。

最后说一句:Spark SQL 和 Hive 不是非此即彼的关系。很多大厂的做法是:用 Hive 做离线批处理,用 Spark SQL 做实时或近实时查询。两者互补,效果更好。