暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL物理计划是起什么作用

架构与英文 2021-07-11
1637

随着海量数据的涌现,业务上对海量数据分析速度的要求越来越严格,这很大程度上取决于分布式SQL的执行速度。很多人在了解分布式SQL的架构逻辑中,都会遇到分布式SQL物理计划这个概念 ,相信对于很多想了解分布式SQL内部逻辑的朋友来说应该是抽象的、很难理解的。笔者也是通过了大量的资料查阅 ,最终才理解了它到底是干什么用的。Spark/Flink是最锋利的两把分析利剑,本文会借助Spark/Flink的物理计划实现过程,尽量以最通俗的方式说明白物理计划是个什么角色。 

1.1 、Spark 上物理计划的简化图

Spark最核心的是基于RDD实现的批处理,其它子模块streaming、sql等都会转换到这上面来,因此也就有了streaming是微批的说法,但是通过读streaming源码,对微批的理解可能会更加深刻点,建议大家阅读。在分析sql之前,假设大家对Spark任务的ShuffleMapTask和ResultTask的执行过程都非常清晰了。其实sql的执行过程是通过定义好的框架逻辑逐步把每一个子节点转换为RDD,然后串联起来组成了DAG,物理计划的最大作用是把你定义好的其它逻辑,与后端的计算引擎对接起来,转换为计算引擎可以认识的类。Spark物理计划简化图如下:



假设每一个框代表一个Spark物理计划节点,Spark Sql层面会通过doExecute函数指向其子节点(黑色线),然后doExecute内部处理后转换为一个RDD(蓝色线),再由父节点以子节点返回的RDD组成一个DAG(橙色虚线),最终提交到spark集群执行。Flink的实现也是类似的。


1.2 spark源码分析

比如我们执行一个select * from table1;其会先转换为一棵逻辑树,逻辑树是由一元节点、二元节点、叶子节点组成的。经过优化规则优化逻辑树(常用的有谓词下推、列裁剪、常量累计等),然后转为物理逻辑计划树,物理计划优化(常用的由aggregate和join优化),执行前检查、RDD执行等。


spark sql的执行入口是QueryExecution类,可以看到其内部流程是analyze、optimizedPlan、sparkPlan、executedPlan、toRDD。由于我们分析的是物理计划,所有我们重点分析sparkPlan和toRDD。


1.2.1、sparkPlan



sparkplan是调用QueryPlan内部调用SparkPlanner的strategies,每一个strategy都会应用到logicalplan上,然后转换为一个physicalPlan,其中DataSourceV2Strategy的实现逻辑如下

经过DataSourceV2Strategy假设匹配的是PhysicalOperation会返回一个ProjectExec物理计划,其子节点是DatasourceV2ScanExec物理计划。

1.2.2 、 toRDD


根据QueryExecution内的toRDD定义可知,其其主要是执行前面sparkplan的execute函数,而execute函数内部主要是调用doExecute函数,这一部分和我们上面画的物理计划简化图是一致的。


上面最先调用的是ProjectExec的doExecute函数,在其内部有调用了其child的doExecute函数,由于在DataSourceV2Strategy的策略中,其child指向的是DatasourceV2ScanExec,


因此DatasourceV2ScanExec是叶子节点,由于其没有child,所以它是首先生成RDD的地方 ,然后返回给父节点,父节点再利用其RDD创建新的RDD,最终也就是我们画的图的橙色虚线部分。


2.1 Flink物理计划


Flink部分我进行了梳理,其逻辑和Spark物理计划实现类似,其主线逻辑如下:

1、realnode为顶级接口,flinkrelNode下分flinkLogicalRelFlinkPhysicalRel 。


2、plannerBase 分batchplanner和streamPlanner。重点在translate里面,重写translateToPlan 。


3、所有物理node为实现execnode类型接口,然后调用物理node重写的translateToPlanInternal转换为transformation。


Plannerbase->streamplanner.translate->translateToRel

                 ->optimer->streamoptimizer.optimzer()->{logicalplan、physicalPlan}


4、Optimizer里调用FlinkRulesets内定义的rule rule继承自ConverterRule,实现matches方法进行匹配,覆盖convert方法把calciterelnode转换为flinkrelnode


通过以上分析,我们得知物理计划就是写一些逻辑,让其转到我们想使用的计算引擎认识的类。

 

原创实属不易,如有转载,请注明出处


文章转载自架构与英文,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论