Spark SQL是Spark1.0版本中加入的组件,是Spark生态系统中最活跃的组件之一。它能够利用Spark进行结构化数据的存储和操作,结构化数据存储即可来自外部结构化数据源,也可以通过向已有RDD增加Schema的方式得到。
Spark SQL提供了方便的接口调用,用户可以使用Scala、Java、Python语言开发基于Spark SQL API的数据处理程序,并通过SQL语句于Spark代码交互。当前Spark SQL使用Catalyst优化器来对SQL语句进行优化,从而得到更有效的执行方案,并且可以将结果存储到Parquet格式等兼容的外部存储系统中。
介绍Spark SQL,不得不提Hive和Shark,Hive是Shark的前身,Shark是Spark SQL的前身。Shark在基于内存计算的性能比Hive高出100倍,即使是基于磁盘计算,它的性能也比Hive高出10倍,而Spark SQL的性能比Shark又有较大的提升。
Hive是建立在Hadoop上的数据仓库基础架构,也是最早运行在Hadoop上SQL on Hadoop工具之一。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据机制。Hive还定义了简单的类SQL查询语句,称为HQL。它允许熟悉SQL的用户查询数据,同时这个语言也允许熟悉MapReduce开发者开发自定义的Mapped和Reduced来处理复杂的分析工作。但由于Hive基于MapReduce进行处理,在该过程中大量的中间磁盘落地过程消耗了大量的I/O,大大降低了运行效率,基于此,大量优化的SQL on Hadoop工具出现了,其中表现最突出的就是Shark。
Shark是由伯克利实验室技术团队开发的Spark生态环境组件之一,它扩展了Hive并修改了Hive架构中的内存管理、物理执行计划和执行3个模块,使之可以在Spark引擎上运行,大大加快了在内存和磁盘上的查询速度。
Shark直接建立在Apache Hive代码库上,所以它支持几乎所有Hive特点。他支持现有的Hive SQl语言、Hive数据格式(SerDes)和用户自定义函数(UDF),调用外部脚本查询,并采用Hive解析查询优化器等。但正是由于Shark的整体设计架构对Hive的依赖性太强。难以支持其长远发展,比如不能和Spark的其他组件进行很好的集成,无法满足Spark的一栈式解决大数据处理的需求,Databricks公司在Spark Summit 2014上宣布Shark已经完成了其学术使命全面转向Spark SQl。
相比于Shark对Hive的过度依赖,Spark SQL在Hive兼容层面仅依赖HQL Parser、Hive Metastore和Hive SerDes。也就是书,从HQL被解析成抽象语法树(AST)起,就全部由Spark SQL 接管了,执行计划生成和优化都有Catalyst负责。
Shark终止以后,产生了2个分支:
1)hive on spark
Hive社区,源码是在Hive中
2)Spark SQL
Spark社区,源码是在Spark中
支持多种数据源,多种优化技术,扩展性好很多
Spark SQL 架构