目录
一:为什么 sparkSQL?...........................................................................................................................................5
1.1:sparkSQL 的发展历程 ............................................................................................................................. 5
1.1.1:hive and shark...............................................................................................................................5
1.1.2:Shark 和 sparkSQL...................................................................................................................... 6
1.2:sparkSQL 的性能 ..................................................................................................................................... 7
1.2.1:内存列存储(In-Memory Columnar Storage)....................................................................... 7
1.2.2:字节码生成技术(bytecode generation,即 CG) .................................................................8
1.2.3:scala 代码优化 ............................................................................................................................ 10
二:sparkSQL 运行架构 .........................................................................................................................................10
2.1:Tree 和 Rule............................................................................................................................................13
2.1.1:Tree...............................................................................................................................................13
2.1.2:Rule...............................................................................................................................................14
2.2:sqlContext 的运行过程..........................................................................................................................16
2.3:hiveContext 的运行过程 ........................................................................................................................19
2.4:catalyst 优化器........................................................................................................................................23
三:sparkSQL 组件之解析 .....................................................................................................................................24
3.1:LogicalPlan ............................................................................................................................................. 24
3.2:SqlParser.................................................................................................................................................28
3.1.1:解析过程.......................................................................................................................................29
3.1.2:SqlParser ..................................................................................................................................... 32
3.1.3:SqlLexical .................................................................................................................................... 35
3.1.4:query.............................................................................................................................................37
3.3:Analyzer ...................................................................................................................................................38
3.4:Optimizer .................................................................................................................................................41
3.5:SpankPlan...............................................................................................................................................44
四:深入了解 sparkSQL 运行计划 ........................................................................................................................44
4.1:hive/console 安装...................................................................................................................................44
4.1.1:安装 hive/cosole..........................................................................................................................45
4.1.2:hive/console 原理 ....................................................................................................................... 46
4.2:常用操作.................................................................................................................................................. 48
4.2.1 查看查询的 schema......................................................................................................................48
4.2.2 查看查询的整个运行计划.............................................................................................................48
4.2.3 查看查询的 Unresolved LogicalPlan......................................................................................... 49
4.2.4 查看查询的 analyzed LogicalPlan..............................................................................................49
4.2.5 查看优化后的 LogicalPlan ...........................................................................................................49
4.2.6 查看物理计划 .................................................................................................................................50
4.2.7 查看 RDD 的转换过程..................................................................................................................50
4.2.8 更多的操作.....................................................................................................................................50
4.3:不同数据源的运行计划..........................................................................................................................50
4.3.1 json 文件 ......................................................................................................................................... 50
4.3.2 parquet 文件 ...................................................................................................................................52
4.3.3 hive 数据 ......................................................................................................................................... 53
4.4:不同查询的运行计划 ..............................................................................................................................54
4.4.1 聚合查询 .........................................................................................................................................54
4.4.2 join 操作 .......................................................................................................................................... 55
4.4.3 Distinct 操作 ................................................................................................................................... 55
4.5:查询的优化 .............................................................................................................................................. 56
4.5.1 CombineFilters...............................................................................................................................56
4.5.2 PushPredicateThroughProject....................................................................................................57
4.5.3 ConstantFolding............................................................................................................................ 57
4.5.4 自定义优化.....................................................................................................................................58
五:测试环境之搭建 ................................................................................................................................................59
5.1:虚拟集群的搭建(hadoop1、hadoop2、hadoop3) .......................................................................61
5.1.1:hadoop2.2.0 集群搭建 ............................................................................................................... 61
5.1.2:MySQL 的安装............................................................................................................................ 61
5.1.3:hive 的安装.................................................................................................................................. 61
5.1.4:Spark1.1.0 Standalone 集群搭建.............................................................................................61
5.2:客户端的搭建.......................................................................................................................................... 62
5.3:文件数据准备工作..................................................................................................................................62
5.4:hive 数据准备工作 ..................................................................................................................................63
六:sparkSQL 之基础应用 .....................................................................................................................................64
6.1:sqlContext 基础应用.............................................................................................................................. 66
6.1.1:RDD.............................................................................................................................................. 66
6.1.2:parquet 文件 ................................................................................................................................ 68
6.1.3:json 文件...................................................................................................................................... 69
6.2:hiveContext 基础应用 ............................................................................................................................70
6.3:混合使用.................................................................................................................................................. 73
6.4:缓存之使用 .............................................................................................................................................. 74
6.5:DSL 之使用 ............................................................................................................................................. 76
6.6:Tips...........................................................................................................................................................76
七:ThriftServer 和 CLI ...........................................................................................................................................77
7.1:令人惊讶的 CLI .......................................................................................................................................77
7.1.1 CLI 配置 .......................................................................................................................................... 78
7.1.2 CLI 命令参数 .................................................................................................................................. 78
7.1.3 CLI 使用 .......................................................................................................................................... 79
7.2:ThriftServer ............................................................................................................................................. 80
7.2.1 ThriftServer 配置 ............................................................................................................................80
7.2.2 ThriftServer 命令参数 ....................................................................................................................81
7.2.3 ThriftServer 使用 ............................................................................................................................82
7.3:小结.......................................................................................................................................................... 85
八:sparkSQL 之综合应用 .....................................................................................................................................85
8.1:店铺分类.................................................................................................................................................. 85
8.2:PageRank ............................................................................................................................................... 89
8.3:小结.......................................................................................................................................................... 91
九:sparkSQL 之调优 ................................................................................................................................................92
9.1:并行性 ...................................................................................................................................................... 93
9.2: 高效的数据格式.................................................................................................................................... 94
9.3:内存的使用 .............................................................................................................................................. 95
9.4:合适的 Task............................................................................................................................................ 96
9.5:其他的一些建议 ......................................................................................................................................96
十:总结 ....................................................................................................................................................................97
SparkSQL 入门
2014 年 9 月 11 日,Spark1.1.0 忽然之间发布。笔者立即下载、编译、部署了 Spark1.1.0。
关于 Spark1.1 的编译和部署,请参看笔者博客 Spark1.1.0 源码编译和部署包生成 。
Spark1.1.0 中变化较大是 sparkSQL 和 MLlib,sparkSQL1.1.0 主要的变动有:
增加了 JDBC/ODBC Server(ThriftServer),用户可以在应用程序中连接到 SparkSQL
并使用其中的表和缓存表。
增加了对 JSON 文件的支持
增加了对 parquet 文件的本地优化
增加了支持将 python、scala、java 的 lambda 函数注册成 UDF,并能在 SQL 中直接
引用
引入了动态字节码生成技术(bytecode generation,即 CG),明显地提升了复杂表达
式求值查询的速率。
统一 API 接口,如 sql()、SchemaRDD 生成等。
......
下面分十个小节来介绍 sparkSQL1.1.0 的架构和使用,希望各位读者 joy it!
第一章:为什么 sparkSQL,介绍 sparkSQL 的发展历程和性能。
第二章:sparkSQL 架构,介绍 catalyst,sqlContext、hiveContext 的运行架构及区别。
第三章:sparkSQL 组件之解析,介绍 sparkSQL 运行架构中的各个组件的功能和实现。
第四章:深入了解 sparkSQL 运行,使用 hive/console 更深入了解各种计划是如何生成的。
第五章:测试环境之搭建,介绍后面章节将使用的环境搭建和测试数据。
第六章:sparkSQ 之基础应用,介绍 sqlContext、hiveContext 使用和混合使用。
第七章:ThriftServer 和 CLI,介绍 TriftServer 和 CLI 及如何使用 JDBC 访问 sparkSQL 数据。
第八章:sparkSQL 之综合应用,介绍 sparkSQL 和 MLlib、sparkSQL 和 GraphX 结合使用。
第九章:sparkSQL 之调优,介绍 CG、压缩、序化器、缓存之使用。
第十章:总结
至于与 hive 的兼容性、具体的 SQL 语法以后有机会再介绍。
一:为什么 sparkSQL?
1.1:sparkSQL 的发展历程
1.1.1:hive and shark
sparkSQL 的前身是 shark。在 hadoop 发展过程中,为了给熟悉 RDBMS 但又不理解
MapReduce 的技术人员提供快速上手的工具,hive 应运而生,是当时唯一运行在 hadoop 上
的 SQL-on-Hadoop 工具。但是,MapReduce 计算过程中大量的中间磁盘落地过程消耗了大
量的 I/O,降低的运行效率,为了提高 SQL-on-Hadoop 的效率,大量的 SQL-on-Hadoop 工
具开始产生,其中表现较为突出的是:
MapR 的 Drill
Cloudera 的 Impala
Shark
其中 Shark 是伯克利实验室 spark 生态环境的组件之一,它修改了下图所示的右下角的
内存管理、物理计划、执行三个模块,并使之能运行在 spark 引擎上,从而使得 SQL 查询的
速度得到 10-100 倍的提升。
1.1.2:Shark 和 sparkSQL
但是,随着 Spark 的发展,对于野心勃勃的 Spark 团队来说,Shark 对于 hive 的太多
依赖(如采用 hive 的语法解析器、查询优化器等等),制约了 Spark 的 One Stack rule them
all 的既定方针,制约了 spark 各个组件的相互集成,所以提出了 sparkSQL 项目。SparkSQL
抛弃原有 Shark 的代码,汲取了 Shark 的一些优点,如内存列存储(In-Memory Columnar
Storage)、Hive 兼容性等,重新开发了 SparkSQL 代码;由于摆脱了对 hive 的依赖性,
SparkSQL 无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,真可谓“退一
步, 海阔天空”。
数据兼容方面 不但兼容 hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据,
未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据
性能优化方面 除了采取 In-Memory Columnar Storage、byte-code generation 等优化
技术外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等
组件扩展方面 无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义,进行
扩展
2014 年 6 月 1 日,Shark 项目和 SparkSQL 项目的主持人 Reynold Xin 宣布:停止对
Shark 的开发,团队将所有资源放 sparkSQL 项目上,至此,Shark 的发展画上了句话,但
也因此发展出两个直线:SparkSQL 和 hive on spark。
其中 sparkSQL 作为 Spark 生态的一员继续发展,而不再受限于 hive,只是兼容 hive;而 hive
on spark 是一个 hive 的发展计划,该计划将 spark 作为 hive 的底层引擎之一,也就是说,
hive 将不再受限于一个引擎,可以采用 map-reduce、Tez、spark 等引擎。
1.2:sparkSQL 的性能
shark 的出现,使得 SQL-on-Hadoop 的性能比 hive 有了 10-100 倍的提高:
那么,摆脱了 hive 的限制,sparkSQL 的性能又有怎么样的表现呢?虽然没有 shark
相对于 hive 那样瞩目地性能提升,但也表现得非常优异:
为什么 sparkSQL 的性能会得到怎么大的提升呢?主要 sparkSQL 在下面几点做了优化:
1.2.1:内存列存储(In-Memory Columnar Storage)
sparkSQL 的表数据在内存中存储不是采用原生态的 JVM 对象存储方式,而是采用内存
列存储,如下图所示。
该存储方式无论在空间占用量和读取吞吐率上都占有很大优势。
对于原生态的 JVM 对象存储方式,每个对象通常要增加 12-16 字节的额外开销,对于
一个 270MB 的 TPC-H lineitem table 数据,使用这种方式读入内存,要使用 970MB 左右的
内存空间(通常是 2~5 倍于原生数据空间);另外,使用这种方式,每个数据记录产生一个
JVM 对象,如果是大小为 200B 的数据记录,32G 的堆栈将产生 1.6 亿个对象,这么多的对
象,对于 GC 来说,可能要消耗几分钟的时间来处理(JVM 的垃圾收集时间与堆栈中的对象
数量呈线性相关)。显然这种内存存储方式对于基于内存计算的 spark 来说,很昂贵也负担
不起。
对于内存列存储来说,将所有原生数据类型的列采用原生数组来存储,将 Hive 支持的
复杂数据类型(如 array、map 等)先序化后并接成一个字节数组来存储。这样,每个列创
建一个 JVM 对象,从而导致可以快速的 GC 和紧凑的数据存储;额外的,还可以使用低廉
CPU 开销的高效压缩方法(如字典编码、行长度编码等压缩方法)降低内存开销;更有趣的
是,对于分析查询中频繁使用的聚合特定列,性能会得到很大的提高,原因就是这些列的数
据放在一起,更容易读入内存进行计算。
1.2.2:字节码生成技术(bytecode generation,即 CG)
在数据库查询中有一个昂贵的操作是查询语句中的表达式,主要是由于 JVM 的内存模
型引起的。比如如下一个查询:
SELECT a + b FROM table
在这个查询里,如果采用通用的 SQL 语法途径去处理,会先生成一个表达式树(有两
个节点的 Add 树,参考后面章节),在物理处理这个表达式树的时候,将会如图所示的 7 个
步骤:
1. 调用虚函数 Add.eval(),需要确认 Add 两边的数据类型
2. 调用虚函数 a.eval(),需要确认 a 的数据类型
3. 确定 a 的数据类型是 Int,装箱
4. 调用虚函数 b.eval(),需要确认 b 的数据类型
5. 确定 b 的数据类型是 Int,装箱