logo资料库

SparkSql技术.docx

第1页 / 共99页
第2页 / 共99页
第3页 / 共99页
第4页 / 共99页
第5页 / 共99页
第6页 / 共99页
第7页 / 共99页
第8页 / 共99页
资料共99页,剩余部分请下载后查看
一:为什么sparkSQL?
1.1:sparkSQL的发展历程
1.1.1:hive and shark
1.1.2:Shark和sparkSQL       
1.2:sparkSQL的性能
1.2.1:内存列存储(In-Memory Columnar Storage)
1.2.2:字节码生成技术(bytecode generation,即CG)
1.2.3:scala代码优化
二:sparkSQL运行架构
2.1:Tree和Rule
2.1.1:Tree
2.1.2:Rule
2.2:sqlContext的运行过程
2.3:hiveContext的运行过程
2.4:catalyst优化器
三:sparkSQL组件之解析
3.1:LogicalPlan
3.2:SqlParser
3.1.1:解析过程
3.1.2:SqlParser
3.1.3:SqlLexical
3.1.4:query
3.3:Analyzer
3.4:Optimizer
3.5:SpankPlan
四:深入了解sparkSQL运行计划
4.1:hive/console安装
4.1.1:安装hive/cosole
4.1.2:hive/console原理
4.2:常用操作
4.2.1 查看查询的schema
4.2.2 查看查询的整个运行计划
4.2.3 查看查询的Unresolved LogicalPlan
4.2.4 查看查询的analyzed LogicalPlan
 4.2.5 查看优化后的LogicalPlan
4.2.6 查看物理计划
4.2.7 查看RDD的转换过程
4.2.8 更多的操作
4.3:不同数据源的运行计划
4.3.1 json文件
4.3.2 parquet文件
4.3.3 hive数据
4.4:不同查询的运行计划
4.4.1 聚合查询
4.4.2 join操作
4.4.3 Distinct操作
4.5:查询的优化
4.5.1 CombineFilters
4.5.2 PushPredicateThroughProject
4.5.3 ConstantFolding
4.5.4 自定义优化
五:测试环境之搭建
5.1:虚拟集群的搭建(hadoop1、hadoop2、hadoop3)
5.1.1:hadoop2.2.0集群搭建
5.1.2:MySQL的安装
5.1.3:hive的安装
5.1.4:Spark1.1.0 Standalone集群搭建
5.2:客户端的搭建
5.3:文件数据准备工作
5.4:hive数据准备工作
六:sparkSQL之基础应用
6.1:sqlContext基础应用
6.1.1:RDD
6.1.1.1 case class方式
6.1.1.2 applySchema 方式      applySchema 方式比较复杂,通常
6.1.2:parquet文件
6.1.3:json文件
6.2:hiveContext基础应用
6.3:混合使用
6.4:缓存之使用
6.5:DSL之使用
6.6:Tips
七:ThriftServer和CLI
7.1:令人惊讶的CLI
7.1.1 CLI配置
7.1.2 CLI命令参数
7.1.3 CLI使用
7.2:ThriftServer
7.2.1 ThriftServer配置
7.2.2 ThriftServer命令参数
7.2.3 ThriftServer使用
7.2.3.1 启动ThriftServer
7.2.3.2 远程客户端连接
7.2.3.3 代码示例
7.3:小结
八:sparkSQL之综合应用
8.1:店铺分类
8.2:PageRank
8.3:小结
九:sparkSQL之调优
9.1:并行性
9.2: 高效的数据格式
9.2.1 数据本地性
9.2.2 合适的数据类型
9.2.3 合适的数据列
9.2.4 更优的数据存储格式
9.3:内存的使用
9.4:合适的Task
9.5:其他的一些建议
十:总结
目录 一:为什么 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,装箱
分享到:
收藏