Spark Streaming 动态资源配置

文章目录

    • 前言
    • 参数配置
    • 源码解析
    • 注意事项
    • 示例
  • 参考

前言

此文章基于spark 3.0.1版本
对于Spark Streaming 流处理任务,Spark官方并未在文档中给出介绍,
同反压机制一样,Spark Streaming动态资源分配(即DRA,Dynamic Resource Allocation)也可以用来应对流处理中批次流量过载的场景。
Spark Streaming动态资源分配,允许为应用动态分配资源。当任务积压时,申请更多资源;当任务空闲时,使用最少资源。

在生产中,可将动态资源分配背压机制一起使用,通过背压机制来细粒度确保系统稳定;通过动态资源分配机制来粗粒度根据应用负载,动态增减Executors。共同保证Spark Streaming流处理应用的稳定高效。

参数配置

  1. spark.streaming.dynamicAllocation.enabled: 默认false,是否启用Spark Streaming流处理动态资源分配。

  2. spark.streaming.dynamicAllocation.scalingInterval: 默认60秒,多久检查一次(实时性要求高的话,建议减小)

  • 下面3,4参数是一般默认设置即可
  1. spark.streaming.dynamicAllocation.scalingUpRatio: 默认0.9,增加Executor的阈值。

  2. spark.streaming.dynamicAllocation.scalingDownRatio: 默认0.3,减少Executor的阈值。

  3. spark.streaming.dynamicAllocation.minExecutors: 默认无,最小Executor个数

  4. spark.streaming.dynamicAllocation.maxExecutors: 默认无,最大Executor个数

  • spark ui界面
    在这里插入图片描述

源码解析

入口类是org.apache.spark.streaming.scheduler.ExecutorAllocationManager
ExecutorAllocationManager中的定时器,每隔spark.streaming.dynamicAllocation.scalingInterval时间,调用一次manageAllocation方法来管理Executor。manageAllocation方法计算规则如下:

必须完成至少一个Batch处理,即batchProcTimeCount > 0

计算Batch平均处理时间averageBatchProcTime(Batch平均处理时间=Batch总处理时间/Batch总处理次数)。

计算Batch平均处理时间和窗口间隔的比值ratioratio = averageBatchProcTime.toDouble / batchDurationMs

若ratio大于阈值spark.streaming.dynamicAllocation.scalingUpRatio,则请求新的Executor。

若ratio小于阈值spark.streaming.dynamicAllocation.scalingDownRatio,则移除没有任务的Executor。

private def manageAllocation(): Unit = synchronized {
    logInfo(s"Managing executor allocation with ratios = [$scalingUpRatio, $scalingDownRatio]")
    if (batchProcTimeCount > 0) {
      val averageBatchProcTime = batchProcTimeSum / batchProcTimeCount
      //batchProcTimeCount 窗口大小 
      val ratio = averageBatchProcTime.toDouble / batchDurationMs
      logInfo(s"Average: $averageBatchProcTime, ratio = $ratio" )
      if (ratio >= scalingUpRatio) {
        logDebug("Requesting executors")
        val numNewExecutors = math.max(math.round(ratio).toInt, 1)
        requestExecutors(numNewExecutors)
      } else if (ratio <= scalingDownRatio) {
        logDebug("Killing executors")
        killExecutor()
      }
    }
    batchProcTimeSum = 0
    batchProcTimeCount = 0
  }

注意事项

  1. Spark Streaming动态资源分配和Spark Core动态资源分配互斥
    Spark Core动态资源分配适合于批处理,如Spark Sql Cli,可以根据Task数量动态分配Executor数量;如Spark ThriftServer On Yarn,空闲时不占用资源,只有在用户提交Sql任务时才会根据Task数动态分配Executor数。

当开启Spark Streaming动态资源分配时,需要关闭Spark Core动态资源分配。

  1. Spark Streaming动态资源分配起作用前,需要至少完成一个Batch处理
    由于Spark Streaming动态资源分配需要根据Batch总处理时间和Batch总处理次数来计算Batch平均处理时间,因此需要至少完成一个Batch处理。这就需要我们保证在Spark Streaming动态资源分配起作用前,应用程序不会崩溃,在程序冷启动时加上下面的参数:
spark.streaming.backpressure.enabled  (true / false)  默认false
背压,开启后spark自动根据系统负载选择最优消费速率

spark.streaming.backpressure.initialRate (整数)
默认直接读取所有 在背压开启的情况下,限制第一次批处理应该消费的数据,因为程序冷启动队列里面有大量积压,防止第一次全部读取,造成系统阻塞
  1. Spark Streaming动态资源分配应当和Spark Streaming背压机制同时使用
  2. 动态参数指挥调整 executor个数,executor-cores、executor-memory需要自己设置,且不受动态参数调整

示例

  • 在业务低谷期executor数量下降
    Spark Streaming 动态资源配置_第1张图片
    Spark Streaming 动态资源配置_第2张图片

参考

https://blog.csdn.net/wangpei1949/article/details/90734304

你可能感兴趣的:(#,Spark-Streaming,spark,大数据,分布式)