起因sparkStream作为一个微流处理框架,每批次处理数据的时间应尽可能地接近批次间隔时间,才能保证流处理的高效和稳定。
批处理时间<<批间隔时间:流量太小,集群闲置,浪费资源,批处理时间>>批间隔时间:流量太大,集群繁忙,数据积压导致系统崩溃#####通过设置spark.streaming.kafka.maxRatePerPartition可以静态调整每次拉取的最大流量,但是需要重启集群。
背压机制,不需要重启集群就能根据当前系统的处理速度智能地调节流量阈值的方案。
设置spark.streaming.backpressure.enabled为true开启反压机制后,sparkStreaming会根据上批次和本批次的处理速率,自动估算出下批次的流量阀值,我们可以通过改变几个增益比例来调控它的自动估算模型。
它的底层采用的是Guava的令牌桶算法实现的限流:程序到桶里取令牌,如果取到令牌就缓存数据,取不到就阻塞等待。通过改变放令牌的速度即可实现流量控制。
其它方案 1. 如果增加kafka的分区数,spark也会增加相应数目的消费者去拉取,可以提升拉取效率;
2. 如果降低批次间隔时间,每次拉取的数据量会减少,可以提升处理数据的速度,差距的间隔时间可以通过窗口来弥补。