Spark Structured Streaming源码分析--(五)Continuous连续处理模式流式Shuffle

本文深入分析Spark Structured Streaming 2.4.0中的Continuous流处理模式,特别是ContinuousCoalesceExec和ContinuousCoalesceRDD的执行流程。流式Shuffle通过RPC实时发送数据,提高时效性。文章还探讨了如何扩展流式Shuffle,包括支持多分区、侧边输出和下游输出分区偏好设置。
摘要由CSDN通过智能技术生成

一、概述

不同于Spark静态RDD shuffle过程需要创建分段文件及分段索引,流式shuffle通过RPC方式实时发送数据,使得数据处理的时效性更高,例如可以达到~100ms级。
本文主要介绍Spark Structured Streaming 2.4.0 中,Continous流处理模式新增流式Repartition和对应Shuffle操作,为后续流式Shuffle源码扩展提供理论基础。
下一篇文章,我们会从应用项目的需求出发,探讨如何进行流式Shuffle源码扩展,包括以下三个扩展功能:

  • 流式Shuffle支持多分区(开源版本仅支持shuffle输出端为1个分区)
  • Continuous支持侧边输出(1个输入源对应多个输出,多线程执行)
  • 支持下游侧边输出分区偏好设置(如果多个目标侧边分区在同一远端主机,且具有相同的Partitioner,将数条重复数据合并为一条发送,提升性能)

二、 原生ContinuousCoaleseExec执行相关

如何创建ContinuousCoaleseExec及其对应RDD:

在这里插入图片描述

1、创建ContinuousCoaleseEexc

  • 在Spark 2.3.0流式处理中,默认不支持Repartition,IncrementalExecution#planner中也没有流式Repartition相关的处理
  • 在Spark 2.4.0流式处理中,Continuous连续处理模式已经支持Repartition操作
  • 静态Repartition操作绑定的是ShuffleExchangeExec或CoalesceExec
  • ContinuousCoaleseEexc是Continous模式中,Reparation操作的绑定SparkPlan物理计划
  • 从以下创建算子的代码中可以看到,spark 2.4.0 continuous连续处理时,目前只支持reparation为1的操作(包括流式Aggregation,只要涉及到重分区):
// Spark 2.4.0流处理中,Continuous连续处理模式Repartition在DataSourceV2Strategy中定义
object DataSourceV2Strategy extends Strategy {
	...
	override def apply(plan: LogicalPlan): Seq[SparkPlan] = plan match {
	  ...
	  case Repartition(1, false, child) =>
      val isContinuous = child.collectFirst {
        case StreamingDataSourceV2Relation(_, _, _, r: ContinuousReader) => r
      }.isDefined

      if (isContinuous) {
        ContinuousCoalesceExec(1, planLater(child)) :: Nil
      } else {
        Nil
      }
	}
}


// 静态Repartition绑定策略在BasicOperators中定义
object BasicOperators extends Strategy {
      case logical.Repartition(numPartitions, shuffle, child) =>
        if (shuffle) {
          // Dataset#repartition()默认走ShuffleExchangeExec
          ShuffleExchangeExec(RoundRobinPartitioning(numPartitions), planLater(child)) :: Nil
        } else {
          // 分区合并
          execution.CoalesceExec(numPartitions, planLater(child)) :: Nil
        }
}

2、ContinuousCoaleseEexc执行的操作

  • ContinuousCoalesceExec类实现较为简单,主要是重写#doExecutue,创建一个ContinuousCoalesceRDD,用来实现Reparation需要的流式Shuffle操作
  • Continuous
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值