文章目录
-
-
- 问题1、谈谈对kafka的理解
- 问题2、Kafka和sparkStreaming的整合,手动提交的offset调用了什么方法?
- 问题3、hive怎么消费kafka的数据的
- 问题4、kafka如何管理自身的offset
- 问题5、flume 如何保证数据的可靠性?
- 问题6、kafka如何保证数据不会出现丢失或者重复消费的情况?
- 问题7、kafka消费数据是怎么消费的,用的是什么方式?
- 问题8、Kafka为什么要分区,生产数据的分区策略
- 问题9、Kafka消费者的分区分配策略
- 问题10、传统的消息传递方法与kafka的不同
- 问题11、Kafka的ISR机制
- 问题12、如何保证Kafka的消息有序
- 问题13、Kafka的高吞吐怎么实现的
- 问题14、Kafka的工作流程分析
- 问题15、Kafka怎么解决数据积压
- 问题16、Kafka为什么写入性能很高
- 问题17、kafka申请topic命令
-
问题1、谈谈对kafka的理解
-
kafka是最初由linkedin公司开发的,使用scala语言编写,kafka是一个分布式,分区的,多副本的,多订阅者的日志系统(分布式MQ系统),可以用于搜索日志,监控日志,访问日志等。
-
apache kafka是一个分布式发布-订阅消息系统和一个强大的队列,可以处理大量的数据,并使能够将消息从一个端点传递到另一个端点,kafka适合离线和在线消息消费。kafka消息保留在磁盘上,并在集群内复制以防止数据丢失。kafka构建在zookeeper同步服务之上。它与apache和spark非常好的集成,应用于实时流式数据分析。
-
Broker:kafka集群中包含一个或者多个服务实例,这种服务实例被称为Broker
-
Topic:每条发布到kafka集群的消息都有一个类别,这个类别就叫做Topic
- kafka将消息以topic为单位进行归类
topic特指kafka处理的消息源(feeds of messages)的不同分类。
topic是一种分类或者发布的一些列记录的名义上的名字。kafka主题始终是支持多用户订阅的;也就是说,一 个主题可以有零个,一个或者多个消费者订阅写入的数据。
在kafka集群中,可以有无数的主题。
生产者和消费者消费数据一般以主题为单位。更细粒度可以到分区级别。
- kafka将消息以topic为单位进行归类
-
Partition:Partition是一个物理上的概念,每个Topic包含一个或者多个Partition
-
Producer:负责发布消息到kafka的Broker中。
-
Consumer:消息消费者,向kafka的broker中读取消息的客户端
-
Consumer Group:每一个Consumer属于一个特定的Consumer Group(可以为每个Consumer指定 groupName)
: 消费组: 由一个或者多个消费者组成,同一个组中的消费者对于同一条消息只消费一次。
问题2、Kafka和sparkStreaming的整合,手动提交的offset调用了什么方法?
问题3、hive怎么消费kafka的数据的
问题4、kafka如何管理自身的offset
- offset有两种存放地点,一种是存入一个topic中,该topic被分成50个分区。还有一种是存入zookeeper中,这种方式在javaApi中已经实现了
问题5、flume 如何保证数据的可靠性?
- Channel提供两种:memory Channel、file Channel。file Channel能把event持久化到磁盘,避免数据丢失
- Flume 使用事务的办法来保证 event 的可靠传递。Source 和 Sink 分别被封装在事务中,这些事务由保存 event 的存储提供或者由 Channel 提供。这就保证了 event 在数据流的点对点传输中是可靠的。
问题6、kafka如何保证数据不会出现丢失或者重复消费的情况?
- 保证数据不丢失可以从三方面考虑
- 生产者数据不丢失:
- kafka的ack机制可以保证数据发送不丢失,它有三个值 0 1 -1
- 0:生产者只负责发送数据,不关心数据是否丢失,响应的状态码为0
- 1:partition的leader收到数据,响应的状态码为1
- -1:所有的从节点都收到数据,响应的状态码为-1
- 从数据发送方面考虑的话。有异步和同步发送的方式
- 在同步的情况下:发送一批数据给kafka后,等待kafka返回结果(默认方式)
- 生产者等待10s,如果broker没有给出ack相应,就认为失败。生产者重试3次,如果还没有相应,就报错
- 异步:发送一批数据给kafka,只是提供一个回调函数。(在消息不是很重要的话,用异步)
- 先将数据保存在生产者端的buffer中。buffer大小是2万条
- 满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
- 发送一批数据的大小是500条
- 在同步的情况下:发送一批数据给kafka后,等待kafka返回结果(默认方式)
- broker保证数据不丢失
- 主要是通过副本因子(冗余),防止数据丢失
- 消费者消费数据不丢失
- 只要每个消费者记录好offset值即可,就能保证数据不丢失。
- kafka的ack机制可以保证数据发送不丢失,它有三个值 0 1 -1
- 生产者数据不丢失:
- 保证不出现重复消费的话,要从消费者提交offset考虑(重复消费:consumer有些消息处理了,但是没来得及提交offset。等重启之后,少数消息就会再次消费一次。)
- 那么我们就需要从幂等性角度考虑了。幂等性,我通俗点说,就一个数据,或者一个请求,无论来多次,对应的数据都不会改变的,不能出错。
- 比如某个数据要写库,你先根据主键查一下,如果数据有了,就别插入了,update一下好吧
- 比如你是写redis,那没问题了,反正每次都是set,天然幂等性
- 对于消息,我们可以建个表(专门存储消息消费记录)
- 生产者,发送消息前判断库中是否有记录(有记录说明已发送),没有记录,先入库,状态为待消费,然后发送消息并把主键id带上。
- 消费者,接收消息,通过主键ID查询记录表,判断消息状态是否已消费。若没消费过,则处理消息,处理完后,更新消息记录的状态为已消费。
问题7、kafka消费数据是怎么消费的,用的是什么方式?
- 自动提交offset(At-most-once(最多一次))
- 客户端收到消息后,在处理消息前自动提交,这样kafka就认为consumer已经消费过了,偏移量增加。
//设置enable.auto.commit为true
props.put("enable.auto.commit", "true");
- 手动提交offset(At-least-once(最少一次))
- 可能出现消息处理完了,在提交offset前,网络中断或者程序挂了,那么kafka认为这个消息还没有被consumer消费,产生重复消息推送。
//关闭自动提交确认选项 props.put("enable.auto.commit", "false"); /