Kafka基础知识

kafka V3.0
数据传输,相当于管道,缓冲池

传统定义 分布式 发布订阅模式 消息队列
最新定义 分布式事件流平台

消息队列作用 缓存 消峰 异步 解耦

100m 值bit 换算为 12.5m,受其他影响这是最高速度
内网 物理网线有关
外网 会涉及交换机,所以慢

直接用flume的hdfssink不行
日常flume采集速度 100m/s 受网速影响
hadoop 数量固定 处理不过来 就会挤压
所以flume采集以后 就扔到kafka,做缓冲

点对点模式
producer -> 5 4 3 2 1 -> consumer 消费一条删一条

发布订阅模式
producer -> 5 4 3 2 1 -> consumer Topic 不会删除数据,每个消费者独立,都可以收到数据

Kafka架构

依赖zookeeper,2.8以后可以不配置zk

1.扩展,提高吞吐量,一个Topic 分为多个patition,在不同节点broker上
2消费者组,配合分区设计,组内消费者并行消费,消费者组才是逻辑上的订阅者
3.副本,高可用,partition在不同节点增加副本 leader(读写) follower(备份)

Broker kafka服务器,即一个节点
Partition 一个Topic分为多个partition,每个partition是有序队列
Replica副本 一个leader 若干个follower 只有涉及副本才有主从,和节点没关系

Kafka安装目录
kafka_2.12-3.0.0.tgz scala版本号 kafka版本号
config
kafka-connect也可以用,但flume和kafka兼容性更好
kraft 不依赖zookeeper配置
日志配置文件
生产者配置文件
消费者配置文件
server.properties 服务
broker.id=0 不能同名
log.dirs=/tmp/kafka-logs kafka存数据的地方
zookeeper.connect= zookeeper连接
bin
kafka-server-start.sh

主题命令脚本
kafka-topic.sh
创建 查看 删除
kafka-topic.sh --bootstrap-sever hadoop001:9092 --list
创建主题 必须指定分区副本
kafka-topic.sh --bootstrap-sever hadoop001:9092 --create --topic demo1 --partition3 --replication-factor 2
查看主题demo1 描述信息
kafka-topic.sh --bootstrap-sever hadoop001:9092 --describe --topic first
alter修改只能增加分区
delete一般不使用,设置策略时间会清楚,如果删除会先标记,特点时间会删除

生产者消费者脚本
kafka-console-product.sh --bootstrap-sever hadoop001:9092 --topic first
kafka-console-consumer.sh --bootstrap-sever hadoop001:9092 --topic first 【–from-begining 从头开始消费,kafka分区内有序,因为是队列,又是分布式】
消费者组
节点1:kafka-console-consumer.sh --bootstrap-sever hadoop001:9092 --topic first --group k1
节点2同样:kafka-console-consumer.sh --bootstrap-sever hadoop001:9092 --topic first --group k1
生产者发送到未创建分区,会自动创建,默认1分区0副本

kafka工作流程

offset 偏移量 同一个组,断点续传,不同的消费者组对分区记录不同的offset

kafka文件存储机制

Segement-0 – 默认1片一个g
000000000000000000.index – 索引
000000000000000000.log – 存数据,数字是条数,偏移量
000000000000000000.timelog – 时间索引一般不用

Segement-1
000000000000170410.index – 索引
000000000000170410.log – 存数据,数字是条数,偏移量
000000000000000000.timelog – 时间索引一般不用

Segement-0
.index .log
偏移量 字节
0 0 Message-0
1 237 Message-1
2 567 Message-2
3 756 Message-3

数据结构 数组,每个偏移量存固定大小,直接字节做乘法就知道偏移量了,即先创建好大小文件,后填写数据

Kafka消息发送流程
默认异步发送
main线程 自带sender线程
sender线程
线程共享变量 RecordAccumulator 缓冲

Producer–>
main线程–>
send(ProducerRecord)【直接发对象,不是发字符串】–>
inretceptors拦截器–>
serializer序列化器–>
partitioner分区器–>
发送到线程共享变量【分配好了分区】–>
sender去拿数据【字节大小/时间,默认0毫秒,流处理】–>
topic

producer.clouse()
flush机制:关闭连接时,会刷新数据,把所有未处理完的处理完

kafka send加入.get()会变为同步发送【Future异步发送对象调get()】

分区策略
脚本指定分区即该分区
不写分区,根据key的hash分配
不写分区,不写key,根据自身粘性机制分配,随机,达到大小或者时间,切换
自定义分区器 implements Partitioner 需要在生产者配置PARTITIONER_CLASS_CONFIG自定义分区器全类名
生产者数据可靠性 ack 经过一定时间没有收到验证就会重新发送
什么时候发送ack?1.leader在内存接受2.leader落盘3.follower复制 3之后发送ack
了解: 数据丢失 数据重复问题 ack=0 ack=-1 上位机制,高水位线,幂等性(重复:同一个生产者,同一个分区,同一个offset,不能全局)+producer事务(绑定事务id可以全局)

Kafka消息发送流程
java:new KafkaConsumer
properties.put() 连接地址 kv反序列化 指定消费者组
poll拉数据,填写时间,返回迭代器对象
注册主题 subscribe()
死循环 while true
不需要关闭连接

kafka消费者分区分配策略
1.Range 默认 分区消费者取余 挂掉1台重新分配
2.RoundRobin 轮循
3.Sticky 粘性 分区消费者取余 挂掉1台,挂掉的节点重新分配

节点挂了以后会有协作粘性 45s以内有效 3s心跳机制

offset
0.9版本之前在zookeeper中,0.9之后在kafka内置topic中,__consumer_offset

自动提交(默认)
内存拉取数据就会提交offset(有可能丢数据,相当于ack=0),可以手动设置时间间隔
offset提交即为ack
offset重置
如果一直使用同一个消费者组 会触发断点续传 能消费到之前的数据
找一个新的消费者组来消费 会触发offset重置
AUTO_OFFSET_RESET_CONFIG latest表示新的消费者组不会消费之前的数据
修改为earliest 重置之后会从最开始的时候消费(不生效,改新消费者组,不改就是断点续传了)
手动提交
处理数据完成在手动提交,ack=-1,如果数据有容错并落盘,数据就不会丢,挂了有可能重复
同步提交没意义,一般异步提交,提交最高偏移量,及12356 6都在了4肯定在
事务绑定,精准一次性消费,把处理数据和提交offset绑定在事务上,配合spark
flink不用事务也可以实现精准一次性消费
保证数据不丢不重

kafka高效读写数据
基于磁盘
速度最直接影响:网络带宽,加节点
1.顺序写磁盘
顺序写600/s 随机写 100k/s 省去了大量磁头寻址的时间
磁盘(复制粘贴是指定位置的所以快,小文件是随机读写所以慢)
2.应用
页缓存Pagecache
让JVM 使用更多内存
3.零拷贝
常规 代码–>linux/win–>磁盘
零复制 linux/win–>磁盘1 磁盘2

zookeeper在kafka作用
1.配置管理:动态读取更新存储配置信息(如broker、topic和分区的元数据)
2.选举机制
3.发现和注册服务:IP地址,端口号,可用的分区等,其他节点通过Zookeeper发现可用的broker节点和分区
4.监控和健康检查:监控Kafka各个节点状态,心跳检测,如果宕机发生故障,通知其他节点触发相应的处理机制

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值