大数据学习笔记——kafka总结
1.kafka整体架构和术语
- Broker:kafka集群中包含一个或者多个服务实例,这种服务实例被称为Broker
- Topic:每条发布到kafka集群的消息都有一个类别,这个类别就叫做Topic
- Partition:Partition是一个物理上的概念,每个Topic包含一个或者多个Partition
- Producer:负责发布消息到kafka的Broker中。
- Consumer:消息消费者,向kafka的broker中读取消息的客户端
- Consumer Group:每一个Consumer属于一个特定的Consumer Group(可以为每个Consumer指定 groupName)
2.kafka中的topic
- kafka将消息以topic为单位进行归类
- topic特指kafka处理的消息源(feeds of messages)的不同分类。
- topic是一种分类或者发布的一些列记录的名义上的名字。kafka主题是支持多用户订阅的;也就是说,一 个主题可以有零个,一个或者多个消费者订阅写入的数据。
- 在kafka集群中,可以有无数的主题。
- 生产者和消费者消费数据一般以主题为单位。更细粒度可以到分区级别。
3.kafka中的分区数
- Partitions:分区数:控制topic将分片成多少个log,可以显示指定,如果不指定则会使用 broker(server.properties)中的num.partitions配置的数量。
- 一个broker服务下,可以的,broker数与分区数没有关系;在kafka中,每一个分区会有一个编号:编号从0开始
- 某一个分区的数据是有序的,不能保证全局有序。
- 如何保证一个主题下的数据是有序的?(生产是什么样的顺序,那么消费的时候也是什么样的顺序)可以采用一个主题下面只有一个分区。
-
topic的Partition数量在创建topic时配置。Partition数量决定了每个Consumer group中并发消费者的最大数量。即每一个消费者会对应消费一个分区的数据,这样每个消费者消费的数据是不会重复的。消费者会消费完一个分区后才继续消费下一个分区的数据,如果消费者的数量多于分区的数量,多出来的消费者是不会工作的。
4.kafka partition offset
- 任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量)
- offset是一个long类型数字,它唯一标识了一条消息,消费者通过(offset,partition,topic)跟踪记录。
5.kafka分区和消费者之间的关系
- 消费组: 由一个或者多个消费者组成,同一个组中的消费者对于同一条消息只消费一次。
- 某一个主题下的分区数,对于消费组来说,应该小于等于该主题下的分区数。
- 如:某一个主题有4个分区,那么消费组中的消费者应该小于4,而且最好与分区数成整数倍1 2 4
- 同一个分区下的数据,在同一时刻,不能同一个消费组的不同消费者消费
- 总结:分区数越多,同一时间可以有越多的消费者来进行消费,消费数据的速度就会越快,提高消费的性能
6.生产者分区的策略
- 没有指定分区号、没指定key,会根据轮询的方式发送到不同的分区
- 没有指定分区号、指定了key,根据key.hashcode%numPartition
- 指定了分区号,则直接将数据写到指定的分区里面去
- 自定义分区策略
7.kafka中数据查找过程
- 第一步:通过offset确定数据保存在哪一个segment里面了,
- 第二步:查找对应的segment里面的index文件 。index文件都是key/value对的。key表示数据在log文件里面的顺序是第几条。value记录了这一条数据在全局的标号。如果能够直接找到对应的offset直接去获取对应的数据即可
- index文件是一个稀疏索引文件,减少了文件的大小,加快查询速度。如果index文件里面没有存储offset,就会查找offset最近的那一个offset,例如查找offset为7的数据找不到,那么就会去查找offset为6对应的数据,找到之后,再取下一条数据就是offset为7的数据
8.数据丢失
8.1、生产者保证数据不丢失
1. 同步模式:配置=1 (只有Leader收到,-1 所有副本成功,0 不等待)Leader Partition挂了,数据就会丢失
解决:设置 -1 保证produce 写入所有副本算成功 producer.type = sync request.required.acks=-1
2. 异步模式,当缓冲区满了,如果配置为0(没有收到确认,一满就丢弃),数据立刻丢弃
解决:不限制阻塞超时时间。就是一满生产者就阻
8.2、broker保证数据不丢失
broker采用分片副本机制,保证数据高可用。
8.3、customer保证数据不丢失
拿到数据后,存储到hbase中或者mysql中,如果hbase或者mysql在这个时候连接不上,就会抛出异常,如果在处理数据的时候已经进行了提交,那么kafka上的offset值已经进行了修改了,但是hbase或者mysql中没有数据,这个时候就会出现数据丢失。 主要是因为offset提交使用了异步提交。
解决:
- Consumer将数据处理完成之后,再来进行offset的修改提交。默认情况下offset是 自动提交,需要修改为手动提交offset值。
- 流式计算。高级数据源以kafka为例,由2种方式:receiver (开启WAL,失败可恢复) director (checkpoint保证)
9、数据重复
- 落表(主键或者唯一索引的方式,避免重复数据)
- 业务逻辑处理(选择唯一主键存储到Redis或者mongdb中,先查询是否存在,若存在则不处理;若不存在,先插入Redis或Mongdb,再进行业务逻辑处理)
- 布隆过滤器
10、Kafka auto.offset.reset值详解
- earliest- 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
- latest- 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
- none- topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
- latest 这个设置容易丢失消息,假如kafka出现问题,还有数据往topic中写,这个时候重启kafka,这个设置会从最新的offset开始消费,中间出问题的哪些就不管了。