SparkStreaming限速以及背压详解

WebUI解读

SparkStreaming限速以及背压详解_第1张图片
这时候我们再往Kafka里面写10条记录

SparkStreaming限速以及背压详解_第2张图片

SparkStreaming限速以及背压详解_第3张图片

  • Input Rate:数据输入的速率
  • Scheduling Delay:每个批次启动任务等待了多少时间被调度 叫 调度的延迟
  • Processing Time:每个批次处理花费了多少时间
  • Total Delay:调度延迟 + 处理时间

这些在UI最下面都能看到

SparkStreaming限速以及背压详解_第4张图片

最佳实践

在下一个批次启动任务之前,一定要运行完前一个批次的数据处理,官网上有提到

问题

但是如果你当前批次数据都没有处理完,下一个批次数据进来,也就意味着你的数据逐渐逐渐堆积的,你的数据在堆积,也就意味着后面的作业肯定对于Scheduling Delay 要花一些时间的 ,整个作业运行时间也就越来越长的

那么batch time 设置多少合适?是根据需求来定的,影响任务运行时长的要素有以下几点:

  • 数据规模 ,数据量大 一定要多放core (多放core 不一定有用 为什么? 因为你topic的partition 和RDD的partition是一一对应的),可以调整topic的分区数 分区数越多 也就意味着RDD的分区越多 RDD的分区越多task也就越多 task多 并行度就上去了
  • batch time,time越长表示 一个批次的数据越多 数据越多你相同的资源下面 处理数据的时长肯定要多一点
  • 业务复杂度,如果你的算子用的不好 也就意味着整个 带着大量的shuffle 你的性能会差很多很多

所以这些东西一定要先测,batch time 设置 需求来定是一方面,另一个一定到环境上测试,测试得到满意的结果

SparkStreaming限速以及背压详解_第5张图片

Kafka限速

为了保证SS应用程序高效稳定的运行,所以要尽可能的使得你的批次处理时间要比调度间隔时间要小

这里官方给我们提供了一个参数:

 spark.streaming.kafka.maxRatePerPartition  : 
  		 	Maximum rate (number of records per second) read from kafka
  		 	 when using the new Kafka direct stream API
  		 	 
spark.streaming.kafka.maxRatePerPartition是指每秒每个分区的记录数(设置100的话就是如下的计算方式)
5秒一个批次 * 每个分区100条记录数 * 3个分区 = 1500

修改代码:

    val conf = new SparkConf().setMaster("local[2]").setAppName("DirectKafkaApp")
      .set("spark.streaming.kafka.maxRatePerPartition","10")

    val ssc = new StreamingContext(conf, Seconds(10))

先测试没有修改前的:同时我写入kafka一些数据,查看结果

SparkStreaming限速以及背压详解_第6张图片

测试修改后的,直接写入1000条

SparkStreaming限速以及背压详解_第7张图片
这时候说明限速成功了,300这个就可以根据我们上面说的公式计算,另外这个参数只适合 direct api

限速的场景:

  • 当你topic里有大量没有处理的数据的时候 并且 “auto.offset.reset” -> “earliest” 选择earliest (就是从最早消费)为了防止第一个批次数据量过大 要设置限速
  • 你的业务高峰期和低峰期的时候数据量是不一样的 高峰期是低峰期数据量的很多倍的,你不限速 很多作业都会处在等待状态 因为你前面批次的那一点时间已经处理不过来这一批次的数据了

问题

这个限速是挺好,不过参数设置多少合适呢?这个值写死就没法评估高峰和低估,这时候就出来一个背压机制

Back Pressure背压原理

https://www.linkedin.com/pulse/enable-back-pressure-make-your-spark-streaming-production-lan-jiang/

这是1.5版本引进来的,可以在运行时根据前一个批次数据的运行情况,动态调整后续批次读入的数据量,这样可以很长从容的面对数据量突增和波动的情况

参数控制

spark.streaming.backpressure.enabled 

第一次会把所有数据都拿过来处理然后判断压力,所以有个初始化的参数,官网上有,但是这个参数到底有没有用,有待考究

SparkStreaming限速以及背压详解_第8张图片

设置方法

    val conf = new SparkConf().setMaster("local[2]").setAppName("DirectKafkaApp")
      .set("spark.streaming.kafka.maxRatePerPartition","10")
      .set("spark.streaming.backpressure.initialRate","150")

优雅的关闭JVM

spark.streaming.stopGracefullyOnShutdown 

SparkStreaming限速以及背压详解_第9张图片
设置这个参数后可以防止数据丢失,要不然原先强行关闭就相当于kill操作,很好奇官方为何会把背压、stopGracefullyOnShutdown这些参数设置为false

你可能感兴趣的:(Spark)