spark streaming背压机制

本文介绍了Spark Streaming的背压机制,旨在解决流量毛刺和数据处理速度不平衡问题。讨论了旧版和新版背压机制,包括receiver-based和direct-approach,并详细解析了新版背压的工作流程和相关参数设置,帮助理解如何自动调整数据处理速率。
摘要由CSDN通过智能技术生成

spark streaming背压机制

背压机制产生的背景

背压(back pressure)机制主要用于解决流处理系统中,业务流量在短时间内剧增,造成巨大的流量毛刺,数据流入速度远高于数据处理速度,对流处理系统构成巨大的负载压力的问题。

如果不能处理流量毛刺或者持续的数据过高速率输入,可能导致Executor端出现OOM的情况或者任务崩溃。

旧版背压机制(spark1.5之前)

旧版架构图

在这里插入图片描述

receiver-based

receiver-based数据接收器,可以配置spark.streaming.receiver.maxRate参数来限制每个receiver没每秒最大可以接收的数据量

direct-approach

direct-approach方式接收数据,可以配置 spark.streaming.kafka.maxRatePerPartition 参数来限制每个kafka分区最多读取的数据量。

缺点

  1. 实现需要进行压测,来设置最大值。参数的设置必须合理,如果集群处理能力高于配置的速率,则会造成资源的浪费。
  2. 参数需要手动设置,设置过后必须重启streaming服务。

新版背压机制(spark1.5之后)

新版的背压机制不需要手动干预,spark streaming能够根据当前数据量以及集群状态来预估下个批次最优速率。

新版架构图

在这里插入图片描述

新版具体流程如下

在这里插入图片描述

新版的背压机制主要通过RateController组件来实现。RateController继承了接口StreamingListener并实现了onBatchCompleted方法。

结合direct-approach方式的源码来理解

  1. 首先创建一个kafka流。
val kafkaDStream: InputDStream[(String, String)] = KafkaUtils.createDirectStream[String,String,StringDecoder,StringDecoder,(String,String)](streamingContext, kafkaParams, getOffsets(topics,kc,kafkaParams),messageHandler)
  1. createDirectStream方法创建并返回一个DirectKafkaInputDStream对象

  /**
   * Create an input stream that directly pulls messages from Kafka Brokers
   * without using any receiver. This stream can guarantee that each message
   * from Kafka is included in transformations exactly once (see points below).
   *
   * Points to note:
   *  - No receivers: This stream does not use any receiver. It directly queries Kafka
   *  - Offsets: This does not use Zookeeper to store offsets. The consumed offsets are tracked
   *    by the stream itself. For interoperability with Kafka monitoring tools that depend on
   *    Zookeeper, you have to update Kafka/Zookeeper yourself from the streaming application.
   *    You can access the offsets used in each batch from the generated RDDs (see
   *    [[org.apache.spark.streaming.kafka.HasOffsetRanges]]).
   *  - Failure Recovery: To recover from driver failures, you have to enable checkpointing
   *    in the `StreamingContext`. The information on consumed offset can be
   *    recovered from the checkpoint. See the programming guide for details (constraints, etc.).
   *  - End-to-end semantics: This stream ensures that every records is effectively received and
   *    transformed exactly once, bu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值