《Spark大数据分析实战》——3.1节SQL on Spark

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介:

本节书摘来自华章社区《Spark大数据分析实战》一书中的第3章,第3.1节SQL on Spark,作者高彦杰 倪亚宇,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.1 SQL on Spark
AMPLab将大数据分析负载分为三大类型:批量数据处理、交互式查询、实时流处理。而其中很重要的一环便是交互式查询。大数据分析栈中需要满足用户ad-hoc、reporting、iterative等类型的查询需求,也需要提供SQL接口来兼容原有数据库用户的使用习惯,同时也需要SQL能够进行关系模式的重组。完成这些重要的SQL任务的便是Spark SQL和Shark这两个开源分布式大数据查询引擎,它们可以理解为轻量级Hive SQL在Spark上的实现,业界将该类技术统称为SQL on Hadoop。
在Spark峰会2014上,Databricks宣布不再支持Shark的开发,全力以赴开发Shark的下一代技术Spark SQL,同时Hive社区也启动了Hive on Spark项目,将Spark作为Hive(除MapReduce和Tez之外的)新执行引擎。根据伯克利的Big Data Benchmark测试对比数据,Shark的In Memory性能可以达到Hive的100倍,即使是On Disk也能达到10倍的性能提升,是Hive强有力的替代解决方案。而作为Shark的进化版本的Spark SQL,在AMPLab最新的测试中的性能已经超过Shark。图3-2展示了Spark SQL和Hive on Spark是新的发展方向。


3923bc6657b69f590ec96dd27f416f929a917f18

3.1.1 为什么使用Spark SQL
由于Shark底层依赖于Hive,这个架构的优势是对传统Hive用户可以将Shark无缝集成进现有系统运行查询负载。但是也看到一些问题:随着版本升级,查询优化器依赖于Hive,不方便添加新的优化策略,需要进行另一套系统的学习和二次开发,学习成本很高。另一方面,MapReduce是进程级并行,例如:Hive在不同的进程空间会使用一些静态变量,当在同一进程空间进行多线程并行执行,多线程同时写同名称的静态变量会产生一致性问题,所以Shark需要使用另外一套独立维护的Hive源码分支。而为了解决这个问题AMPLab和Databricks利用Catalyst开发了Spark SQL。
Spark的全栈解决方案为用户提供了多样的数据分析框架,机器学习、图计算、流计算如火如荼的发展和流行吸引了大批的学习者,为什么人们今天还是要重视在大数据环境下使用SQL呢?笔者认为主要有以下几点原因:
1)易用性与用户惯性。在过去的很多年中,有大批的程序员的工作是围绕着数据库+应用的架构来做的,因为SQL的易用性提升了应用的开发效率。程序员已经习惯了业务逻辑代码调用SQL的模式去写程序,惯性的力量是强大的,如果还能用原有的方式解决现有的大数据问题,何乐而不为呢?提供SQL和JDBC的支持会让传统用户像以前一样地书写程序,大大减少迁移成本。
2)生态系统的力量。很多系统软件性能好,但是未取得成功和没落,很大程度上因为生态系统问题。传统的SQL在JDBC、ODBC、SQL的各种标准下形成了一整套成熟的生态系统,很多应用组件和工具可以迁移使用,像一些可视化的工具、数据分析工具等,原有企业的IT工具可以无缝过渡。
3)数据解耦,Spark SQL正在扩展支持多种持久化层,用户可以使用原有的持久化层存储数据,但是也可以体验和迁移到Spark SQL提供的数据分析环境下进行Big Data的分析。
3.1.2 Spark SQL架构分析
Spark SQL与传统DBMS的查询优化器+执行器的架构较为类似,只不过其执行器是在分布式环境中实现,并采用的Spark作为执行引擎。Spark SQL的查询优化是Catalyst,其基于Scala语言开发,可以灵活利用Scala原生的语言特性很方便进行功能扩展,奠定了Spark SQL的发展空间。Catalyst将SQL语言翻译成最终的执行计划,并在这个过程中进行查询优化。这里和传统不太一样的地方就在于,SQL经过查询优化器最终转换为可执行的查询计划是一个查询树,传统DB就可以执行这个查询计划了。而Spark SQL最后执行还是会在Spark内将这棵执行计划树转换为Spark的有向无环图DAG再执行。


4069c97f2bf77ecedc83f470cafa16804c6c0d17

从图3-3中可以看到整个Catalyst是Spark SQL的调度核心,遵循传统数据库的查询解析步骤,对SQL进行解析,转换为逻辑查询计划、物理查询计划,最终转换为Spark的DAG后再执行。图3-4为Catalyst的执行流程。


292606720b935870ce70514e5d34cea4698b763f

SqlParser将SQL语句转换为逻辑查询计划,Analyzer对逻辑查询计划进行属性和关系关联检验,之后Optimizer通过逻辑查询优化将逻辑查询计划转换为优化的逻辑查询计划,QueryPlanner将优化的逻辑查询计划转换为物理查询计划,prepareForExecution调整数据分布,最后将物理查询计划转换为执行计划进入Spark执行任务。
2.?Spark SQL优化策略
查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟。除了查询优化,Spark SQL在存储上也进行了优化,从以下几点查看Spark SQL的一些优化策略。
(1)内存列式存储与内存缓存表
Spark SQL可以通过cacheTable将数据存储转换为列式存储,同时将数据加载到内存进行缓存。cacheTable相当于在分布式集群的内存物化视图,将数据进行缓存,这样迭代的或者交互式的查询不用再从HDFS读数据,直接从内存读取数据大大减少了I/O开销。列式存储的优势在于Spark SQL只需要读出用户需要的列,而不需要像行存储那样需要每次将所有列读出,从而大大减少内存缓存数据量,更高效地利用内存数据缓存,同时减少网络传输和I/O开销。数据按照列式存储,由于是数据类型相同的数据连续存储,能够利用序列化和压缩减少内存空间的占用。
(2)列存储压缩
为了减少内存和硬盘空间占用,Spark SQL采用了一些压缩策略对内存列存储数据进行压缩。Spark SQL的压缩方式要比Shark丰富很多,例如它支持PassThrough, RunLengthEncoding, DictionaryEncoding, BooleanBitSet, IntDelta, LongDelta等多种压缩方式。这样能够大幅度减少内存空间占用和网络传输开销和I/O开销。
(3)逻辑查询优化
Spark SQL在逻辑查询优化(如图3-5所示)上支持列剪枝、谓词下压、属性合并等逻辑查询优化方法。列剪枝为了减少读取不必要的属性列,减少数据传输和计算开销,在查询优化器进行转换的过程中会进行列剪枝的优化。


d2b18073df22724cb1ec3601800fcde963b50660

下面介绍一个逻辑优化例子:

SELECT Class FROM (SELECT ID,Name,Class  FROM STUDENT ) S WHERE S.ID=1
AI 代码解读

Catalyst将原有查询通过谓词下压,将选择操作ID=1优先执行,这样过滤大部分数据,通过属性合并将最后的投影只做一次最终保留Class属性列。
(4)Join优化
Spark SQL深度借鉴传统数据库查询优化技术的精髓,同时也在分布式环境下进行特定的优化策略调整和创新。Spark SQL对Join进行了优化支持多种连接算法,现在的连接算法已经比Shark丰富,而且很多原来Shark的元素也逐步迁移过来。例如:BroadcastHashJoin、BroadcastNestedLoopJoin、HashJoin、LeftSemiJoin,等等。
下面介绍一个其中的BroadcastHashJoin算法思想。
BroadcastHashJoin将小表转化为广播变量进行广播,这样避免Shuff?le开销,最后在分区内做Hash连接。这里用的就是Hive中Map Side Join的思想。同时用了DBMS中的Hash连接算法做连接。
随着Spark SQL的发展,未来会有更多的查询优化策略加入进来。同时后续Spark SQL会支持像Shark Server一样的服务端、JDBC接口,兼容更多的持久化层例如NoSQL,传统的DBMS等。一个强有力的结构化大数据查询引擎正在崛起。
3.?如何使用Spark SQL

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// 在这里引入sqlContext下所有的方法就可以直接用sql方法进行查询
import sqlContext._
case class Person(name: String, age: Int)
// 下面的people是含有case类型数据的RDD,会默认由Scala的implicit机制将RDD转换为
  SchemaRDD,SchemaRDD是SparkSQL中的核心RDD
val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt))
// 在内存的元数据中注册表信息,这样一个Spark SQL表就创建完成了
people.registerAsTable("people")
// sql语句就会触发上面分析的Spark SQL的执行过程,读者可以参考上面的图示
val teenagers = sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
// 最后生成teenagers也是一个RDD
teenagers.map(t =>"Name: " + t(0)).collect().foreach(println)
AI 代码解读

通过之前的介绍,读者对支撑结构化数据分析任务的Spark SQL的原理与使用有了一定的了解。在生产环境中,有一类数据分析任务对响应延迟要求高,需要实时处理流数据,在BDAS中,Spark Streaming用于支撑大规模流式处理分析任务。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
打赏
0
0
0
0
1408
分享
相关文章
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
150 79
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
128 35
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
253 0
为什么大数据平台会回归SQL
在大数据领域,尽管非结构化数据占据了大数据平台80%以上的存储空间,结构化数据分析依然是核心任务。SQL因其广泛的应用基础和易于上手的特点成为大数据处理的主要语言,各大厂商纷纷支持SQL以提高市场竞争力。然而,SQL在处理复杂计算时表现出的性能和开发效率低下问题日益凸显,如难以充分利用现代硬件能力、复杂SQL优化困难等。为了解决这些问题,出现了像SPL这样的开源计算引擎,它通过提供更高效的开发体验和计算性能,以及对多种数据源的支持,为大数据处理带来了新的解决方案。
|
5月前
|
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
355 3
|
5月前
|
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
169 0
【赵渝强老师】Spark SQL的数据模型:DataFrame
本文介绍了在Spark SQL中创建DataFrame的三种方法。首先,通过定义case class来创建表结构,然后将CSV文件读入RDD并关联Schema生成DataFrame。其次,使用StructType定义表结构,同样将CSV文件读入RDD并转换为Row对象后创建DataFrame。最后,直接加载带有格式的数据文件(如JSON),通过读取文件内容直接创建DataFrame。每种方法都包含详细的代码示例和解释。
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
136 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等