• 售前

  • 售后

热门帖子
入门百科

Spark SQL的整体实现逻辑剖析

[复制链接]
luly靓 显示全部楼层 发表于 2021-8-14 14:21:46 |阅读模式 打印 上一主题 下一主题
1、sql语句的模块剖析

   当我们写一个查询语句时,一般包罗三个部分,select部分,from数据源部分,where限定条件部分,这三部分的内容在sql中有专门的名称:

当我们写sql时,如上图所示,在举行逻辑剖析时会把sql分成三个部分,project,DataSource,Filter模块,当天生实行部分时又把他们称为:Result模块、
DataSource模块和Opertion模块。
那么在关系数据库中,当我们写完一个查询语句举行实行时,发生的过程如下图所示:

整个实行流程是:query -> Parse -> Bind -> Optimize -> Execute
1、写完sql查询语句,sql的查询引擎起首把我们的查询语句举行剖析,也就是Parse过程,剖析的过程是把我们写的查询语句举行分割,把project,DataSource和Filter三个部分剖析出来从而形成一个逻辑剖析tree,在剖析的过程中还会查抄我们的sql语法是否有错误,好比缺少指标字段、数据库中不包罗这张数据表等。当发现有错误时立刻停止剖析,并报错。当顺遂完成剖析时,会进入到Bind过程。
2、Bind过程,通过单词我们可看出,这个过程是一个绑定的过程。为什么需要绑定过程?这个题目需要我们从软件实现的角度去思考,如果让我们来实现这个sql查询引擎,我们应该怎么做?他们采用的策略是起首把sql查询语句分割,分割差异的部分,再举行剖析从而形成逻辑剖析tree,然后需要知道我们需要取数据的数据表在那里,需要哪些字段,实行什么逻辑,这些都保存在数据库的数据字典中,因此bind过程,实在就是把Parse过程后形成的逻辑剖析tree,与数据库的数据字典绑定的过程。绑定后会形成一个实行tree,从而让步伐知道表在那里,需要什么字段等等
3、完成了Bind过程后,数据库查询引擎会提供几个查询实行筹划,并且给出了查询实行筹划的一些统计信息,既然提供了几个实行筹划,那么有比力就有优劣,数据库会根据这些实行筹划的统计信息选择一个最优的实行筹划,因此这个过程是Optimize(优化)过程。
4、选择了一个最优的实行筹划,那么就剩下最后一步实行Execute,最后实行的过程和我们剖析的过程是不一样的,当我们知道实行的顺序,对我们以后写sql以及优化都是有很大的资助的.实行查询后,他是先实行where部分,然后找到数据源之数据表,最后天生select的部分,我们的终极效果。实行的顺序是:operation->DataSource->Result
固然以上部分对SparkSQL没有什么联系,但是知道这些,对我们明白SparkSQL照旧很有资助的。
2、SparkSQL框架的架构

要想对这个框架有一个清楚的熟悉,起首我们要弄清楚,我们为什么需要sparkSQL呢?个人发起一般情况下在写sql可以大概直接解决的题目就不要使用sparkSQL,如果想刻意使用sparkSQL,也不肯定可以大概加快开发的进程。使用sparkSQL是为了解决一般用sql不能解决的复杂逻辑,使用编程语言的上风来解决题目。我们使用sparkSQL一般的流程如下图:

如上图所示,一般情况下分为两个部分:a、把数据读入到sparkSQL中,sparkSQL举行数据处置处罚或者算法实现,然后再把处置处罚后的数据输出到相应的输出源中。
1、同样我们也是从如果让我们开发,我们应该怎么做,需要考虑什么题目来思考这个题目。
     a、第一个题目是,数据源有几个,我们大概从哪些数据源读取数据?现在sparkSQL支持许多的数据源,好比:hive数据仓库、json文件,.txt,以及orc文件,同时现在还支持jdbc从关系数据库中取数据。功能很强大。
     b、还一个需要思考的题目是数据范例怎么映射啊?我们知道当我们从一个数据库表中读入数据时,我们界说的表结构的字段的范例和编程语言好比scala中的数据范例映射关系是怎样的一种映射关系?在sparkSQL中有一种来解决这个题目标方法,来实现数据表中的字段范例到编程语言数据范例的映射关系。这个以后详细介绍,先了解有这个题目就行。
     c、数据有了,那么在sparkSQL中我们应该怎么构造这些数据,需要什么样的数据结构呢,同时我们对这些数据都可以举行什么样的操作?sparkSQL采用的是DataFrame数据结构来构造读入到sparkSQL中的数据,DataFrame数据结构实在和数据库的表结构差不多,数据是按照行来举行存储,同是尚有一个schema,就相称于数据库的表结构,记载着每一行数据属于哪个字段。
     d、当数据处置处罚完以后,我们需要把数据放入到什么地方,并切以什么样的格式举行对应,这个a和b要解决的题目是类似的。
2、sparkSQL对于以上题目标实现逻辑也很明白,从上图已经很清楚,主要分为两个阶段,每个阶段都对应一个详细的类来实现。
   a、 对于第一个阶段,sparkSQL中存在两个类来解决这些题目:HiveContext,SQLContext,同时hiveContext继续了SQLContext的所有方法,同时又对其举行了扩展。因为我们知道, hive和mysql的查询照旧有肯定的差异的。HiveContext只是用来处置处罚从hive数据仓库中读入数据的操作,SQLContext可以处置处罚sparkSQL可以大概支持的剩下的所有的数据源。这两个类处置处罚的粒度是限定在对数据的读写上,同时对表级别的操作上,好比,读入数据、缓存表、开释缓存表表、注册表、删除注册的表、返回表的结构等的操作。
  b、sparkSQL处置处罚读入的数据,采用的是DataFrame中提供的方法。因为当我们把数据读入到sparkSQL中,这个数据就是DataFrame范例的。同时数据都是按照Row举行存储的。此中 DataFrame中提供了许多有效的方法。以后会细说。
c、在spark1.6版本以后,又增长了一个类似于DataFrame的数据结构Dataset,增长此数据结构的目标是DataFrame有软肋,他只能处置处罚按照Row举行存储的数据,并且只能使用DataFrame中提供的方法,我们只能使用一部分RDD提供的操作。实现Dataset的目标就是让我们可以大概像操作RDD一样来操作sparkSQL中的数据。
d、此中尚有一些其他的类,但是现在在sparkSQL中最主要的就是上面的三个类,其他类以后遇到了会慢慢想清楚。
3、sparkSQL的hiveContext和SQLContext的运行原理

  hiveContext和SQLContext与我第一部分讲到的sql语句的模块剖析实现的原理实在是一样的,采用了同样的逻辑过程,并且网上有好多讲这一块的,就直接粘贴复制啦!!
  sqlContext总的一个过程如下图所示:
1.SQL语句经过SqlParse剖析成UnresolvedLogicalPlan;
2.使用analyzer联合数据数据字典(catalog)举行绑定,天生resolvedLogicalPlan;
3.使用optimizer对resolvedLogicalPlan举行优化,天生optimizedLogicalPlan;
4.使用SparkPlan将LogicalPlan转换成PhysicalPlan;
5.使用prepareForExecution()将PhysicalPlan转换成可实行物理筹划;
6.使用execute()实行可实行物理筹划;
7.天生SchemaRDD。
在整个运行过程中涉及到多个SparkSQL的组件,如SqlParse、analyzer、optimizer、SparkPlan等等

hiveContext总的一个过程如下图所示:
1.SQL语句经过HiveQl.parseSql剖析成Unresolved LogicalPlan,在这个剖析过程中对hiveql语句使用getAst()获取AST树,然后再举行剖析;
2.使用analyzer联合数据hive、源数据Metastore(新的catalog)举行绑定,天生resolved LogicalPlan;
3.使用optimizer对resolved LogicalPlan举行优化,天生optimized LogicalPlan,优化前使用了ExtractPythonUdfs(catalog.PreInsertionCasts(catalog.CreateTables(analyzed)))举行预处置处罚;
4.使用hivePlanner将LogicalPlan转换成PhysicalPlan;
5.使用prepareForExecution()将PhysicalPlan转换成可实行物理筹划;
6.使用execute()实行可实行物理筹划;
7.实行后,使用map(_.copy)将效果导入SchemaRDD。

到此这篇关于Spark SQL的整体实现逻辑的文章就介绍到这了,更多干系Spark SQL实现逻辑内容请搜刮脚本之家以前的文章或继续欣赏下面的干系文章希望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作