本人菜鸡,正在努力学习,记录知识以备后患!
该文章承接上文(kafka系列),暂有两篇:
【kafka】一、kafka框架介绍(生产者篇):https://blog.youkuaiyun.com/lsr40/article/details/84029034
【kafka】二、kafka框架介绍(消费者篇):https://blog.youkuaiyun.com/lsr40/article/details/84034394
另一篇解决报错的文章:
【kafka】报错:advertised.listeners参数的重要性(外部访问局域网kafka)https://blog.youkuaiyun.com/lsr40/article/details/84135959
消费者有两个配置,一个是New Consumer Configs(让kafka自己管理偏移量),一个是Old Consumer Configs(使用默认zk管理偏移量),具体使用的时候,请认准自己的kafka的版本
官网:http://kafka.apache.org/documentation/#consumerconfigs
(消费者偏移量记录)当然,在说参数前,我要说说消费者的一些事情:
消费者消费数据的时候,必须记录每个分区消费到哪了,也就是说,如果消费者A读取的那个topic有10个分区的话,必须记录10个值,这10个值分别表示每个分区被消费到哪里(通过offset偏移量来记录),因此就有以下的概念,这些消费者的消费记录保存在哪里?
- 手动管理:通过api,获取拿到的该条数据的偏移量和分区值,保存在存储系统中(可以是数据库,可以是文件等方式),当然自己管理是最麻烦的一种方式,但也是可控的东西最多的。关于这个我看到了有一个系列的文章(感谢作者:葬月魔帝),大家有兴趣可以关注下!
如何管理Spark Streaming消费Kafka的偏移量(一) https://blog.youkuaiyun.com/u010454030/article/details/78535003 如何管理Spark Streaming消费Kafka的偏移量(二)
https://blog.youkuaiyun.com/u010454030/article/details/78554643 如何管理Spark Streaming消费Kafka的偏移量(三) https://blog.youkuaiyun.com/u010454030/article/details/78660643 - zookeeper管理:配置,offsets.storage=zookeeper,auto.commit.enable=true(开启自动提交偏移量)接着auto.commit.interval.ms=60*1000(默认值:1分钟提交一次),缺点:提交之后程序又运行了30s之后挂掉了,下次消费的时候就会重复消费那30s的数据,反复的跟zk交互,影响性能。
- kafka管理:offsets.storage=kafka,enable.auto.commit=true,auto.commit.interval.ms=5000(默认是5s提交一次),实现原理是kafka自己创建一个名为__consumer_offsets的topic,将offset存储在该topic下,推荐采用该方式,关于如何读取这个topic的信息:(感谢作者:huxihx)https://www.cnblogs.com/huxi2b/p/6061110.html,当然也可以使用其他的监控工具,例如kafka-manager之类的别人写好的框架,通过前端页面查看topic的数据情况,和消费者偏移量情况。
- 偏移量的管理涉及到三种语义
kafka有给出java版api:http://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html,在Storing Offsets Outside Kafka该模块中有介绍。至少一次 生产者同步发送消息(将acks设置为1或者-1/all) 至多一次 生产者异步发送消息,无论接受到与否 仅此一次 手动管理偏移量,做到处理一条保存一次偏移量,或者批量处理一批(处理未结束失败了要记得回滚),保存一次
-1.group.id:消费者的组id(非常重要),他涉及到了发布订阅和队列模式
- 发布订阅模式:不同groupid的消费者之间消费数据互不影响,也就是说可以同时消费同一份数据。举个例子:groupid就好像家庭id,家庭A定了一份人民日报(topic1),家庭B也定了一份人民日报(也是topic1),那么当家庭A在看他们家买的人民日报的时候,丝毫不影响家庭B,家庭B可以同时看相同内容,也可以看不相同
- 队列模式:相同group_id的消费者之间不可能消费同一份数据,举个例子:家庭A定了一份人民日报(topic1),人民日报里面有3个板块(3个分区),当爸爸(消费者1)在看第一个板块的时候(分区1),其他家庭成员就不能再看相同的板块,只能去看板块2(分区2)或者板块3(分区3)
-2.Rebalance:通过zookeeper实现的消费者负载均衡机制,在队列模式下,如果多个消费者的group_id相同,那么他们就会触发负载均衡机制。举个例子:topicA有3个分区,我启动了一个消费者x(默认这里的消费者都只有一个线程),那么消费者x就会独自消费3个分区的数据。这时,我又启动了消费者y(group_id和x相同),那么就会马上触发负载均衡机制,一个消费者消费2个分区数据,另一个消费1个分区,这时候我又启动了一个消费者z(group_id和x和y相同),这样每个消费者都会消费1个分区的数据。也就是说当消费者的总个数(总线程数)和topicA的分区数一样的时候,性能最好。如果这时候再增加消费者,那么就会出现有一个消费者空转(消耗资源,但接受不到数据),导致资源浪费。
-3.fetch.min.bytes:设置最少一次拉取多少数据,默认是一有数据就拉,可以调大,但是数据就会有延迟,但是请求的次数就降低,提升吞吐量(一般默认就可以了)
其他的基本上不需要太大的调整(当然如果有特殊需求的话,不同集群情况下,参数最优肯定都是不同的,还需要具体测试),为了提升性能,有时候还需要调整broker和topic的配置,这两部分本人暂时没有做太深入的研究,就不在这里瞎***吹了!
最后kafka自带消费者:
bin/kafka-console-consumer.sh --topic topic名称 --zookeeper zk1:端口1,zk2:端口2,zk3:端口3/zk上kafka的路径
总结:考虑偏移量如何管理,考虑发布订阅还是队列模式,考虑消费模式是否达到最优,是否设置拉数据的延迟,是否可以优化消费端的代码来减少数据延迟
kafka系列文章暂时到这,主要就介绍了对于集群使用者的相关参数(生产者和消费者),对于搭建集群(topic和broker)的一些参数,并没有相关的介绍,原谅本人才疏学浅。如果有什么问题或者笔误的地方,欢迎可以留言评论~