1.kafka 中的数据是有序的吗? kafka 中分区消息的有序性
kafka 中的数据是有序的。
单分区内有序,多分区,分区与分区间无序;
1、一个分区,消费者将消息全部写入一个分区中,一个消费者进行消费。
2、自定义分区器 Partitioner ,重写 partition 方法,将消息顺序追加到 K 个分区,然后在消费者写 K 个内存队列,相同分区号的数据都存到一个内存 Queue 中,N 个线程分别消费一个内存队列即可
2.kafka 的分区分配策略
在 Kafka 内部存在两种默认的分区分配策略:Range 和 RoundRobin。
Range 是默认策略。Range 是对每个 Topic 而言的(即一个 Topic 一个 Topic 分),首先对同一个 Topic 里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用 Partitions 分区的个数除以消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。
例如:我们有 10 个分区,两个消费者(C1,C2),3 个消费者线程,10 / 3 = 3 而且除不尽。
C1-0 将消费 0, 1, 2, 3 分区
C2-0 将消费 4, 5, 6 分区
C2-1 将消费 7, 8, 9 分区
RoundRobin:前提:同一个 Consumer Group 里面的所有消费者的 num.streams(消费者消费线程数)必须相等;每个消费者订阅的主题必须相同。
第一步:将所有主题分区组成 TopicAndPartition 列表,
然后对 TopicAndPartition 列表按照 hashCode 进行排序,最后按照轮询的方式发给每一个消费线程。
3 如果 kafka 挂掉了,
flume 有记录
日志有记录
短期也是不影响的
4.kafka 的数据积压问题
如果是 Kafka 消费能力不足,则可以考虑增加 Topic 的分区数,并且同时提升消费组的消费者数量,消费者数 = 分区数。(两者缺一不可)
如果是下游的数据处理不及时:提高每批次拉取的数量。批次拉取数据过少(拉取数据 / 处理时间 < 生产速度),使处理的数据小于生产的数据,也会造成数据积压。
8)多少个 Topic
通常情况:多少个日志类型就多少个 Topic。也有对日志类型进行合并的。
9)Kafka 丢不丢数据
Ack=0,producer 不等待 kafka broker 的 ack,一直生产数据。
Ack=1,leader 数据落盘就发送 ack,producer 收到 ack 才继续生产数据。
Ack=-1,ISR 中的所有副本数据罗盘才发送 ack,producer 收到 ack 才继续生产数据。
12)Kafka 中数据量计算
每天总数据量 100g,每天产生 1 亿条日志, 10000 万 /24/60/60=1150 条 / 每秒钟
平均每秒钟:1150 条
低谷每秒钟:400 条
高峰每秒钟:1150 条 *(2-20 倍)=2300 条 -23000 条
每条日志大小:0.5k-2k
每秒多少数据量:2.3M-20MB