Spark SQL系列------1. Spark SQL 物理计划的Shuffle实现

    Spark SQL物理计划要到Spark-core执行,需要将Spark SQL物理计划转化成RDD,并且建立RDD之间的依赖关系。这个过程可以通过如下图大概表示:


上图中绿色部分指Spark物理计划到RDD过程中数据结构的变迁过程。黄色部分表示变迁过程中,起加工作用的数据结构。

一:从SparkPlan到Exchange

优化后的Spark SQL物理计划对数据Distribution有一定的要求。当当前物理计划的Child输出数据的Distribution达不到要求的时候需要进行Shuffle,使得Child物理计划输出数据Distribution达到要求,Exchange就是如何进行Shuffle的描述。Exchange中会描述ShuffleDependency如何创建,以及如何根据ShuffleDependency创建ShuffledRowRDD。

EnsureRequirement.ensureDistributionAndOrdering描述了如何将Spark物理计划加工成Exchange.

物理计划需要转换成Exchange有一下几个原因:

1.child物理计划的输出数据分布不satisfies当前物理计划的数据分布要求。比如说child物理计划的数据输出分布是UnspecifiedDistribution,而当前物理计划的数据分布要求是ClusteredDistribution

2.对于包含2个Child物理计划的情况,2个Child物理计划的输出数据有可能不compatile。因为涉及到两个Child物理计划采用相同的Shuffle运算方法才能够保证在本物理计划执行的时候一个分区的数据在一个节点,所以2个Child物理计划的输出数据必须采用compatile的分区输出算法。如果不compatile需要创建Exchange替换掉Child物理计划。



二:从Exchange到ShuffledRowRDD

从Exchange到ShffleDependency有2中方式:

1.直接执行Exchange.prepareShuffleDependency,创建ShuffleDependency,然后根据ShuffleDependency创建ShuffledRowRDD。这种情况下的ShuffledRowRDD每个分区id和Exchange1和Exchange2 Shuffle后数据分区之间是一一对应的映射关系。如下例图所示:


2.如果需要ExchangeCoordinator协调ShuffledRowRDD的分区,则需要先提交ExchangeCoordinator对应的所有Exchange到spark-core执行Shuffle,得到Shuffle后数据分区情况,确定ShuffledRowRDD的分区和Exchange产生的分区的映射关系,可能是1对多的映射关系。

假设规定ShuffledRowRDD一个分区最小为128M,则ShuffledRowRDD的分区情况如下例图所示:




关于物理计划的Shuffle实现的几个问题:

Q:什么时候会使用ExchangeCoordinator协调ShuffledRowRDD的分区?

A:需要满足如下条件之一,

1. spark.sql.adaptive.enabled配置为true(默认为false) ,当前物理物理有2个Child,每个Child物理计划都不是Exchange类型,每个Child的输出Distribution是ClusteredDistribution(HashPartitioning分区算法实现)。

2.spark.sql.adaptive.enabled配置为true(默认为false) ,当前物理计划中存在至少一个Child是Exchange类型,那么所有的Child的输出分区算法都是HashPartitioning


Q:对于Join操作一定会发生Shuffle吗?
A:不一定。如果Join的两个children的数据分区算法相同,则不会发生shuffle

Q:ExchangeCoordinator协调ShuffledRowRDD的分区的时候,需要知道Child物理计划输出的数据统计信息,那么岂不是在协调之前需要提交到Spark-core执行完毕?
A:是这样的













  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值