kafka核心概念:
1.producer
2.consumer
3.broker
4.topic
5.partition
6.repalication
1.消费者与消费者组
1.consumer:
consumer group:
consumers
“消费者消费kafka里面的数据 是以 消费者组的方式进行消费”
对接kafka常见的消费者:
1.ss、sss、flume、flink
2.java代码:
consumer group: 消费者组
1.一个组内 共享一个消费者组的id 【group id】
2.组内的所有消费者协调在一起去消费指定的topic的所有分区数据:
“每个分区只能由一个消费者组的一个消费者来消费”
绝对不会出现一个分区被一个消费者组的多个消费者进行重复消费
补充:
生产上:
1.一般都是一个消费者+一个消费者组
即:
一个消费者组 就一个消费者 可以消费全部分区数据
超大公司:
会用到消费者组 不同消费者 处理不同分区数据 【很少见】
2.kafka数据存储
一个partition:下面存储就是数据,一段一段相同大小的segment文件
segment:逻辑概念
log文件 【kafka topic里面的数据+event 元数据】 默认大小
:log.segment.bytes=1073741824 1G
index文件 【索引文件,维护是log文件内 大部分数据的位置信息】
kafka-topics.sh
–create
–zookeeper bigdata32:2181,bigdata33:2181,bigdata34:2181/kafka
–topic bigdata
–partitions 1
–replication-factor 1
kafka-topics.sh
–list
–zookeeper bigdata32:2181,bigdata33:2181,bigdata34:2181/kafka
修改:
log.segment.bytes=1048576 1m
offset:偏移量 =》 event 编号 存储在topic下的编号
-rw-rw-r–. 1 hadoop hadoop 2008 Dec 22 03:12 00000000000000000000.index
-rw-rw-r–. 1 hadoop hadoop 1048550 Dec 22 03:12 00000000000000000000.log
offset=【0-11517】
11517-0+1 =11518条数据
-rw-rw-r–. 1 hadoop hadoop 2024 Dec 22 03:12 00000000000000011518.index
-rw-rw-r–. 1 hadoop hadoop 1048524 Dec 22 03:12 00000000000000011518.log
offset=【11518-22914】
22914 -11518 +1 =xxx条数据
-rw-rw-r–. 1 hadoop hadoop 10485760 Dec 22 03:12 00000000000000022915.index
-rw-rw-r–. 1 hadoop hadoop 651820 Dec 22 03:12 00000000000000022915.log
segment命令规则:
1.parititon的全局的第一个segment 编号从0开始的
2.后续的segment名称 是上一个segment文件的最后一条消息的【offset值+1】 来表示
offset:偏移量 =》 event 编号 存储在topic下的编号
指 该条数据在partition的位置 从0开始
log文件 【kafka topic里面的数据+event 元数据】 默认大小
kafka-run-class.sh
kafka.tools.DumpLogSegments
–files /home/hadoop/data/kafka/bigdata-0/00000000000000000000.log
–print-data-log \
0.log
index文件 【索引文件,维护是log文件内 大部分数据的位置信息】
kafka-run-class.sh
kafka.tools.DumpLogSegments
–files /home/hadoop/data/kafka/bigdata-0/00000000000000000000.index
–print-data-log \
0.index
offset: 47 position: 4174
offset: 94 position: 8357
offset: 140 position: 12492
offset: 186 position: 16632
offset: 232 position: 20772
1.维护partition的消息对应offset信息和物理地址
2.稀疏表的方式维护的,并不是每一个消息的offset和物理地址都维护
面试题:
看图说话,如何查找 offset 为 11865的数据 ,简述过程?
-rw-rw-r–. 1 hadoop hadoop 2008 Dec 22 03:12 00000000000000000000.index
-rw-rw-r–. 1 hadoop hadoop 1048550 Dec 22 03:12 00000000000000000000.log
-rw-rw-r–. 1 hadoop hadoop 2024 Dec 22 03:12 00000000000000011518.index
-rw-rw-r–. 1 hadoop hadoop 1048524 Dec 22 03:12 00000000000000011518.log
-rw-rw-r–. 1 hadoop hadoop 10485760 Dec 22 03:12 00000000000000022915.index
-rw-rw-r–. 1 hadoop hadoop 651820 Dec 22 03:12 00000000000000022915.log
11518.index:
offset: 11750 position: 158143
offset: 11796 position: 162329
offset: 11842 position: 166515
offset: 11900 position: 166515
1.【二分查找】<= offset 为 11865 的大segment文件组 =》11518组
2.去11518.index 文件 【二分查找】<= offset 为 11865 大的offset
=》offset: 11842 =>position: 166515 物理地址
3.根据166515 物理地址 去信息定位 这个位置,按顺序查找 一直找到 offset为11865的数据
3.交付语义 : 生产者/消费者
At most once: Messages may be lost but are never redelivered.
At least once:Messages are never lost but may be redelivered.
Exactly once:this is what people actually want, each message is delivered once and only once.
至多一次:消息会丢失,不会重复发送/消费
至少一次:消息不会丢失 重复发送/消费
精准一次:消息不会丢失 不会重复发送/消费 完美的
produder:
1.kafka 0.11.0之前版本 至少一次 会导致重复数据
2.kafka 0.11.0之后包括 采用精准一次发送数据
0.11.0之前版本:
1 2 3 4 5
3 挂了
producer =》 kafka
0.发送1 2 数据ok offset信息 也ok 记录到kafka
1.发送数据3 producer 程序挂了 offset信息 没有记录
2.程序重启 :
producer 程序 会继续从 3 这个数据 接着发送数据 =》 导致 kafka 有重复数据
0.11.0之后版本:
1 2 3 4 5
3 挂了
精准一次【事务,数据+ offset】
0.发送1 2 数据ok offset信息 也ok 记录到kafka
1.发送数据3 producer 程序挂了 offset信息 没有记录 事务 3写入的数据 标记清除
2.程序重启 :
producer 程序 会继续从 3 这个数据 接着发送数据 =》kafka没有重复数据
kafka版本:
选 kafka 版本 一定要大于等于0.11.0版本
重点:
kafka =>consumer: 交付语义
1 2 3 4 5
3 挂了
consumer:
1.正常 【从挂的地方继续消费即可】
问题:如何存储上次消费的offset的位置
主要取决于 你的消费者组件:flume、spark、flink
sparkstreaming 对接kafka:交付语义选择
1.至多一次:消息会丢失 不会有重复数据
2.至少一次:消息不会丢失 重复消费
3.精准一次:消息不会丢失 不会重复消费 【完美】
至多一次:
1 2 3 4 5
1.offset 存储 3
2. 3 数据 还没有开始消费
3. consumer 程序挂了
=》 重新启动
接着消费
4
=》 数据丢失
至少一次:
1 2 3 4 5
1.consumer 消费 3 offset 信息也提交了
consumser挂了
启动consumer
从4继续消费=》
消费5 处理完了 offset 没有提交
程序挂了=》
重启程序=》
从5开始消费数据
数据重复消费 重复处理
精准一次:
事务
数据消费 + offset提交
sparkstreaming/struedstreaming/flink : 消费 交付语义选择:
1.至少一次 =》 可能有数据消费重复问题 [90%] code 简单
2.精准一次 =》 完美的 【开发起来太麻烦了 】
sparkstreaming:【了解】
offset信息如何维护?
1.Checkpoints 【生产上,不能用 问题】
1.offset 信息 =》 hdfs 会有小文件问题
2.代码发生变更 spark项目就不能用了 之前记录的Checkpoints 信息就失效了
2.Kafka itself 【推荐】
【至少一次】 代码简单 不需要用户自己开发 维护offset信息的代码
3.Your own data store 【外部数据源存储 offset】
redis、mysql、hbase 事务的
10s发送一次请求 存储数据
【精准一次】
code
4.副本与数据同步
8个节点
1个分区 1个副本
8个分区 1副本
leader 与 foller:
leader: 该分区负责对外读写的节点
foller:负责拉取leader分区数据 进行数据备份
机制:
ack 消息发送确认机制 【producer】
all, -1, 0, 1
1.ack =1 producer 发送数据 只要一个分区副本成功写入的通知 就认为推送消息成功
2.ack =-1 producer 发送数据 producer收到所有分区副本写入成功的通知才任务推送消息成功
3.ack=0 producer 发送一次数据即可 不管是否发送成功
all =>-1
选择:
1. 0 不要选择
2. 1 选择这个【其次】
3. all 建议【安全】
consumerapi :
1.earliest
2.latest
kafka-console-consumer.sh
–bootstrap-server bigdata33:9092,bigdata34:9092
–topic bigdata
–from-beginning
flume :
1.flume =>kafka
2. kafka =>flume =>hdfs
kafka监控:
1.kafka manager [选 ]: 二开 【了解】
https://github.com/yahoo/CMAK
按量计费
2.kafka eagle =》 也好用 【low 一点点 】 用起来简单
部署简单 简单好用
http://www.kafka-eagle.org/
https://github.com/smartloli/EFAK
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧