一、原理精选:
1、kafka集群以及consumer都依赖于zookeeper集群保存一些meta信息,但是在0.9版本及以后,Kafka 消费的offset都会默认存放在 Kafka 集群中的一个叫 __consumer_offsets 的topic中。
原因:如果offset保存在zookeeper中,消费者需要频繁的去与 Zookeeper 进行交互,而利用ZKClient的API操作Zookeeper频繁的Write其本身就是一个比较低效的Action,对于后期水平扩展也是一个比较头疼的问题。
2、同一消费者组下的不同消费者,不能同时访问同一个分区
3、一个消费者组在一个分区下只有一个offset,所以同一个消费者组下的消费者不会重复读取同一条信息。但是使用低级api除外,因为使用低级api可以指定任意一个分区(leader)的任意一个位置(offset)读取数据
4、分区的原因
(1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;
(2)可以提高并发,因为可以以Partition为单位读写了。
5、分区的原则
(1)指定了patition,则直接使用;
(2)未指定patition但指定key,通过对key的value进行hash出一个patition;
(3)patition和key都未指定,使用轮询选出一个patition。
6、通过request.required.acks参数来设置数据可靠性的级别:
- all:等待ISR中的所有节点都确认接收到数据后才算一次发送完成,可靠性最高,但是速度最慢。
- 1:ISR中的leader已成功收到的数据并得到确认后发送下一条message。如果leader宕机了,则会丢失数据。
- 0:producer无需等待来自broker的确认而继续发送下一批消息。速度最快,但是可靠性最低
详细的Kafka原理请看:https://blog.csdn.net/lp284558195/article/details/80297208
二、指令
kafka后台启动指令:
kafka-server-start.sh -daemon /hadoop/kafka/config/server.properties
kafka删除指令:
kill -9 线程号
三、踩过的坑:
1、本地通过java api启动一个生产者线程,无法向服务器的kafka写数据
解决方案:除了在server.properties上配置advertised.listeners外,还要在本地的hosts文件中加上kafka服务器的ip以及主机名