07 Spark 之 Spark SQL

这篇总结来自极客时间专栏《大规模数据处理实践》的 15 节。

记得 15 年的时候,那时还在研一,当时北京每个月都会有 Spark Meetup,那时候连城还在国内,当时 Spark 最火的生态库是 Spark Streaming(那时候 Spark SQL 也出现了),现在 5 年过去了,Spark SQL 成为 Spark 中最火的生态库,Spark Streaming 也已经被 DataBricks 抛弃,技术发展、革新很快,幸运赶上这个时代。

Spark SQL 历史

从名字也知道 Spark SQL 是 Spark 发布的一款与 Hive 对标的产品,让用户使用类 SQL 的语言通过 Spark 引擎做相应的数据处理,极大地降低了用户的学习成本,先看下 Spark SQL 的历史。

最早 Spark 是在 Hive 上做了 Shark,它本质上就是 Hive,修改了 Hive 的内存管理模块,大幅优化了运行速度,是 Hive 的 10 到 100 倍之多。

但问题是:Shark 对于 Hive 过于依赖,它严重影响了 Spark 的发展,就像我之前认为依赖 BookKeeper 是 Pulsar 的一个缺点一样,Pulsar 这种上层应用完全依赖 BK 会制约其发展,如果有些新特性的开发依赖存储层的话,这个完全就受底层存储引擎的制约了。

于是,2014.7.1 Spark 将 Shark 交给了 Hive 管理,他们开始开发 Spark SQL。

Spark SQL 架构

Spark SQL 本质上还是一个运行在 Spark Core 上的库。

07 Spark 之 Spark SQL_第1张图片
Spark SQL 架构(图片来自极客时间)

Spark SQL 提供类 SQL 的接口,它还提供了两个新的 API:DataFrame API 和 DataSet API。

由于 DataFrame API 和 DataSet API,开发者会感觉自己在操作一个关系型数据库一样,而不是在操作 API。

而且 Spark SQL 的 SQL 解析逻辑是自己写的,优化规则也是自己开发的,只是在优化器这块用到了 Calcite。

DataSet API

DataSet 是 Spark 1.6 新引入的接口,也是不可变的分布式数据单元,它既有与 RDD 类似的各种转换和动作函数,还会经过 Spark SQL 执行引擎的优化,使得数据处理效率更高。

当动作操作执行时,Spark SQL 的查询优化器会优化这个逻辑计划,并生成一个可以分布式执行的、包含分区信息的物理计划。

DataSet 与 RDD 的区别:

  1. DataSet 具有关系型数据库中表的特性,它描述的数据都被组织到有名字的列中,就像关系型数据库中的表一样,它会提供详细的结构信息和每列的数据类型(schema)。

程序编译的时候,它可以执行类型检测(已经存储了每列的数据类型)。

DataFrame API

一种特殊的 DataSet,但它出现的时间比 DataSet 要早,与 DataSet 的区别是:

  1. 它的每一列并不存储类型信息,故在编译时并不能发现类型错误;
  2. DataFrame 每一列的类型固定为 Row,它可以被当作 DataSet[Row] 来处理,必须通过解析才能获取各列的值。

RDD、DataFrame、DataSet 对比

三种数据类型的对比如下:

07 Spark 之 Spark SQL_第2张图片
区别(图片来自极客时间)

在 Spark 2.0 中,DataSet 和 DataFrame 已经统一,DataFrame 作为 DataSet[Row] 存在,在 Java 中 DataFrame API 已经不存在了。

不变形和分区

DataSet 和 DataFrame 都是基于 RDD 的,他们都拥有 RDD 的基本特性,可以与 RDD 无缝切换。

性能

DataSet 和 DataFrame 的性能要比 RDD 更好。

因为 DataSet 和 DataFrame 先经过 Spark SQL 的优化才会被转换为 RDD。

错误检测

DataSet 和 RDD 都是类型安全的,但 DataFrame 不是(不存储每列的信息)。

总结

在这三个 RDD、DataFrame、DataSet 数据结构中,DataFrame 有点像一个 过渡性 的结构,它在最初时设计并不完美,但是为了兼容性,也只能被保留下来,只能等到最后慢慢被淘汰,Flink 也有一样的问题,那就是 DataStream 和 DataSet API,它们虽然在底层都是一样的,但是在上层却抽象出了两种数据结构,这并不是一个好的设计,我们学习 Spark/Flink,要学习其好的地方(这些怎么找到自己的切入点/其他系统的痛点、怎么去解决面临的问题),但更要吸收其经验,提高我们自己的系统设计能力。

有兴趣的同学,可以通过下面的链接购买,会有一些优惠

二维码扫描购买有一定优惠

你可能感兴趣的:(07 Spark 之 Spark SQL)