Hive架构
在讲解SparkSQL之前,让我们先来看看基于MR的Hive的架构:
SparkSQL的演变
- Shark
SparkSQL是从Shark发展而来。Shark为了实现与Hive的兼容,在HQL方面用了Hive中的HQL解析、逻辑执行计划、执行计划优化,不同的是将物理计划从原有的MR作业替换成了Spark作业, 通过Hive的HQL解析,把HQL转换成Spark底层的RDD操作。先来看看Shark架构:
使用Shark的方式主要存在以下问题:
-
- 使用HQL解析,逻辑执行计划与物理执行计划的解析完全依赖于Hive, 不方便添加优化策略;
- Spark非Shuffle类算子的计算主要是基于内存处理,多个Task可以在线程层面并行执行。而传统的MR作业是进程级别并行,因此,Spark在兼容Hive的实现上不得不定制以解决线程安全问题;
- 这种方式完全依赖于Hive的HQL解析引擎,Hive的版本更新会对Spark造成影响,给Spark的优化和维护增加大量的成本。
- SparkSQL
从Spark1.3开始,Spark专门开发了SparkSQL模块,对原有的Shark进行了大量的优化,并在Shark的原有架构上重写了逻辑执行计划的优化部分,SparkSQL在Hive兼容层面令依赖HQL的SQL解析、Hive元数据管理以及Hive存储,也就是说,从HQL被解析成抽象语法树(AST)起,就由SparkSQL接管, SparkSQL执行计划生成和执行计划的优化都由Catalyst负责。来看看SparkSQL的架构:
SparkSQL抛弃原有Shark的代码,汲取了Shark的一些优点,如内存列存储(In-Memory Columnar Storage)、Hive兼容性等,重新开发了SparkSQL代码。
由于摆脱了对hive的依赖性,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便。
Spark SQL增加了SchemaRDD(即带有Schema信息的RDD),使用户可以在Spark SQL中执行SQL语句,数据既可以来自RDD,也可以来自Hive、HDFS、Cassandra等外部数据源,还可以是JSON格式的数据。
SparkSQL特点
SparkSQL是Spark的一个独立模块,主要用于进行结构化数据的处理。它提供了最核心的编程抽象DataFrame,它可以根据多种数据源进行构建,其执行原理是将SparkSQL转换为底层的RDD的依赖的有向无环图提交到Spark集群运行。SparkSQL主要有以下特点:
- 基于DataFrame编程API提供两种方式处理数据:SQL方式和DataFrame的DSL语法;
- SparkSQL完全兼容Hive的元数据、SQL语法、UDF、序列化与反序列化机制;
- SparkSQL提供统一的数据源访问API, 可以从多种数据源读取多种类型的数据;
- SparkSQL提供了标准的JDBC和ODBC连接,对处理好的数据可以对接BI, 数据库等外部系统或存储。
- 引入了新的RDD类型SchemaRDD,可以像传统数据库定义表一样来定义SchemaRDD
- 内嵌了查询优化框架,在把SQL解析成逻辑执行计划之后,最后变成RDD的计算。