Spark+Kafka如何限速的问题

最近太忙了,上一次更新还是半个月前。不过我觉得终究还是要更新一下的,只是这次实在没时间写什么心得体会或是讨论之类的了,就拿在知乎上回答的一个帖子”偷懒“一下好了。

这个帖子是在知乎上回答如何为Spark Streaming + Kafka应用限速的。同样的问题在知乎上也碰到过几次,还是具有一定的普遍性的,故我这里直接顺手牵羊了, 省的我无中生有写一些我觉得有用的东西,实际上并不是那么回事。要知道拿来主义还是无懈可击的——好久没玩三国杀了,纪念一下~

问题是这样的:SparkStreaming消费Kafka数据的时候,当有大量初始化数据时会拖累整个streaming程序的运行,问有什么办法?    

总体来说这个问题大概有两种解决思路:1.在Spark端设置限速;2.在Kafka端设置限速。

Spark端限速的方法知乎上已有很多帖子说过了,主要的思路是设置不同的参数,比如在Direct模式下设置spark.streaming.kafka.maxRatePerPartition,receiver模式下设置spark.streaming.receiver.maxRate。它们都是控制每秒处理的消息数。应该说目前使用Direct模式的比较多,因此你需要适当地调整spark.streaming.kafka.maxRatePerPartition值。

帖子中的提问题还提出一种思路,即设置spark.streaming.dynamicAllocation.enabled=true打开动态资源分配姑且也可一试吧。有点令人惊讶的是,Spark官网貌似没有这个参数的解释,不知道是否是个疏漏。跑题一下,看来文档的更新在哪个项目中都是一件容易出错的事情。比如Kafka 2.2.0版本新引入的max.connections就没有记录在官网的配置列表中,再加上我有个PR已经pending我一个月了都没有任何回复,我有时真的怀疑社区committer是不是都在忙Kafka Summit,而把日常的PR review都给忘了 。。。。 好吧,纯属吐槽一下,不针对任何人。

资料领取方式:加入大数据技术学习交流群522189307,点击加入群聊,私信管理员即可免费领取

回到限速的话题,在Kafka端设置限速有两种办法:

1. 设置broker端参数quota.consumer.default。比如quota.consumer.default=15728640表示将连入该broker的所有consumer的TPS降到15MB/s以下。此参数的好处在于全局生效简单易用,对broker上所有consumer都是”一视同仁“;缺陷也在于此,无法单独为个别consumer限速,故该方法在0.11.0.0版本之后已经不推荐使用。

2. 通过kafka-configs命令。比如下面命令是为client.id为clientA的consumer设置限速:

$ bin/kafka-configs.sh  --zookeeper localhost:2181

--alter

--add-config'consumer_byte_rate=15728640'

--entity-type clients

--entity-name clientA

此命令只为client.id=clientA的consumer设置了限速,故在Spark端你还需要显式设置client.id,比如:

Map<String,Object>kafkaParams=newHashMap<>();

...

kafkaParams.put("client.id","clientA");

...

JavaInputDStream<ConsumerRecord<String,String>>

stream=KafkaUtils.createDirectStream(...);

值得注意的是,在Kafka端设置的限速单位都是每秒字节数。如果你想按照每秒多少条消息进行限速还需要结合消息的平均大小来计算。

猜你喜欢

转载自blog.csdn.net/haotian1685/article/details/89930345
今日推荐