
一、 K afka的三大组件:Producer、Server、Consumer
1、Kafka的 Producer 写入消息
producer采用push(推)模式将消息发布到broker,每条消息,都被追加到分区中(顺序写到磁盘,比随机写内存效率高)。
· 分区的作用:方便容量扩展,可以多并发读写数据,所以我们会指定多个分区进行数据存储。
· 一般根据 event_key的hash % numPartitions来确定写入哪个分区,如果写入时没有指定key,则轮询写入每个分区;因此导致每个partition中消息是有序的,整体无序。
每条event数据写入partitionA中,并且只会写入partitionA_leader,当partitionA_leader写入完成后partitionA_flower节点再去partitionA_leader上异步拉取数据;默认ack为1,表示不会等待partitionA_flowers写入完成;如果设置ack为副本数或ack=-1,则等待副本全部写完,再写入下一条数据。
2、kafka的 broker—— 保存消息
1、 创建topic,并指定分区和副本数
2、每个分区(partition)有一个leader,多个follower,pull数据时先寻找leader,只会读leader上的数据,leader和follower不会在一个节点上,leader节点宕机后,其中一个follower变成leader
3、 消息数据存在每个分区中,默认配置每条消息保存7天 或 分区达到1GB 后删除数据
3、 K afka的 Consumer 消费数据:
1、consumer采用pull(拉)模式从broker中读取数据。
2、如果一个消费者来消费同一个topic下不同分区的数据,会读完一个分区再读下一个分区
生产者(producer)A PI 只有一套 ; 但是消费者(consumer)A PI 有两套(高级A PI 和低级A PI )
一、高级API:
Zookeeper管理offset(默认从最后一个开始读新数据,可以配置从开头读)
kafka server(kafka服务)管理分区、副本
二、低级API:
开发者自己控制offset,想从哪里读就从哪里读
// SimpleConsumer是Kafka用来读数据的类
// 通过send()方法获取元数据找到leader
TopicMetadataResponse metadataResponse = simpleConsumersend(request); //通过metadataResponse获取topic元数据,在获取topic中每个分区的元数据
// fetch 抓取数据
FetchResponse response = simpleConsumerfetch(fetchRequest);
// 解析抓取到的数据
ByteBufferMessageSet messageAndOffsets = responsemessageSet(topic, partition);
二、数据、broker状态,consumer状态的存储
一、在本地存储原始消息数据:
1、hash取模得分区、kafka中每条消息有一个Key,用来确定 每条数据存储到哪个分区中
2、轮询
3、自定义分区
二、在zookeeper存储kafka的元数据
三、存储consumer的offset数据
每个consumer有一个Key(broker+Topic+partition)的hash,再取模后 用来确定offset存到哪个系统文件中,Value是partitionMetaData。
1、使用zookeeper启动,zookeeper来存储offset
消费者 消费消息时,offset(消费到的下标)会保存在consumer本地和zookeeper中(由本地上传到zookeeper中,所以本地会保存offset)
2、使用bootstrap启动,本地存储offset(在本地可以减少两节点交互),zookeeper存储其他数据
三、某 F lume对接Kafka案例
以上就是关于kafka使用常见报错及解决方法全部的内容,包括:kafka使用常见报错及解决方法、soulcoder——消息队列知识总结(偏向于 Kafka)、【大数据技术】kafka简介和底层实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)