大数据学习笔记——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开始消费,中间出问题的哪些就不管了。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值