千家信息网

Kafka 0.10问题点滴

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,15.如何消费内部topic: __consumer_offsets主要是要让它来格式化:GroupMetadataManager.OffsetsMessageFormatter最后用看了它的源码,把
千家信息网最后更新 2026年11月01日Kafka 0.10问题点滴

15.如何消费内部topic: __consumer_offsets

  • 主要是要让它来格式化:GroupMetadataManager.OffsetsMessageFormatter

  • 最后用看了它的源码,把这部分挑选出来,自己解析了得到的byte[]。核心代码如下:

// com.sina.mis.app.ConsumerInnerTopic            ConsumerRecords records = consumer.poll(512);            for (ConsumerRecord record : records) {                Object offsetKey = GroupMetadataManager.readMessageKey(ByteBuffer.wrap(record.key()));                if (offsetKey instanceof OffsetKey) {                    GroupTopicPartition groupTopicPartition = ((OffsetKey) offsetKey).key();                    OffsetAndMetadata value = GroupMetadataManager.readOffsetMessageValue(ByteBuffer.wrap(record.value()));                    LOG.info(groupTopicPartition.toString() + "---:---" + value);                } else {                    LOG.info("############:{}", offsetKey);                }            }
1.For Kafka 0.8.2.x
#Create consumer configecho "exclude.internal.topics=false" > /tmp/consumer.config#Only consume the latest consumer offsets./kafka-console-consumer.sh --consumer.config /tmp/consumer.config \--formatter "kafka.server.OffsetManager\$OffsetsMessageFormatter" \--zookeeper localhost:2181 --topic __consumer_offsets
2.For Kafka 0.9.x.x and 0.10.0.0
#Create consumer configecho "exclude.internal.topics=false" > /tmp/consumer.config#Only consume the latest consumer offsets./kafka-console-consumer.sh --consumer.config /tmp/consumer.config \--formatter "kafka.coordinator.GroupMetadataManager\$OffsetsMessageFormatter" \--zookeeper 10.39.40.98:2181/kafka10 --topic __consumer_offsets
  • Committing and fetching consumer offsets in Kafka : 使用Java API获取Consumer Offset。

Since version 0.8.2, kafka has had the ability to store consumer offsets in an internal compacted topic called __consumer_offsets

14.Kafka metrics

Kafka 用 Yammer Metrics来存储Server、Client的数据。可以使用插件式的方式获取这些数据,写入到CSV文件。

Kafka 实现了 KafkaCSVMetricsReporter.scala,可以 将metrics写入到CSV文件。

由于没有实现写入ganglia的实现类,所以无法直接从Kafka将metrics写入到ganglia。

document

13.snappy的压缩率

为什么某个topic的HDFS的数据多余Kafka自己统计的流量40%左右。

sina的KafkaProxy都使用了snappy压缩后入kafka。

  • 猜想 30%-40%

  • 需要测试一下:找一批HDFS的文件,写入Kafka,消费出来,写成文件,看看大小差别。

12.Kafka的Consumer读取数据的时候,读哪个partition

High level Consumer的API,默认以Range的方式分配,还有另外一个是RoundRobin。

11.Kafka的Producer发送数据的时候,发送给哪个partition

这是有DefaultPartitioner决定的。
If a partition is specified in the record, use it.

  • If no partition is specified but a key is present choose a partition based on a hash of the key

  • If no partition or key is present choose a partition in a round-robin fashion

中文:

  • 有key就hash

  • 没key就Round-robin

0.8.0 版本在没key的时候,是Random的方式。

10.Linkedin的集群GC情况

90%的broker GC暂停时间为21ms左右。每秒进行的young GC小于1次

9.解释一下什么是ZoroCopy(sendfile技术)

传统网络IO流程,一次传送过程:

  1. 从Disk把数据读到内核区的Read Buffer。

  2. 把数据从内核区到用户区Buffer。

  3. 再把数据写入到内核区的Socket Buffer上。

  4. 把数据从Socket Buffer复制到网卡的NIC Buffer上。


Kafka少了中间两步,这就是sendfile技术:


8.kafka如何做到大吞吐量、强大消息堆积能力等特性

  1. 依赖OS文件系统的页缓存 (当上层有写操作时,操作系统只是将数据写入PageCache,同时标记Page属性为Dirty。当读操作发生时,先从PageCache中查找,如果发生缺页才进行磁盘调度,最终返回需要的数据。实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用。同时如果有其他进程申请内存,回收PageCache的代价又很小。
    总结:依赖OS的页缓存能大量减少IO,高效利用内存来作为缓存)新航道雅思

  2. 不使用JVM缓存数据, 内存利用率高

  3. 顺序IO以及O(1)常量时间get、put消息

  4. sendfile技术(零拷贝)

7.一个队列最重要的就是消息丢失问题,kafka是如何处理的

每次发送数据时,Producer都是send()之后就认为已经发送出去了,但其实大多数情况下消息还在内存的MessageSet当中,尚未发送到网络,这时候如果Producer挂掉,那就会出现丢数据的情况。

解决办法: ack机制,一般设置为acks=1,消息只需要被Leader接受并确认即可,这样同时保证了可靠性和效率。

6.Kafka 0.10的Producer做了什么优化

  • MessageSet手段批量顺序写入

  • 数据支持压缩

  • 异步发送

5.为什么kafka是pull模型

push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。

4.底层的LogSegment、Index是怎么存储的

  • log:字节流,sendfile、zero copy技术

  • index:稀疏索引,mmap的数据结构-本质是个类,二分查找寻找到offset。

3.一个很重要的问题是当Leader宕机了,怎样在Follower中选举出新的Leader

一种非常常用的选举leader的方式是"Majority Vote"("少数服从多数")。

刚创建的topic一般"preferred replica"是leader。在ZooKeeper中动态维护了一个ISR(in-sync replicas),这个ISR里的所有Replica都跟上了leader,只有ISR里的成员才有被选为Leader的可能。

所有Partition的Leader选举都由controller决定。controller会将Leader的改变直接通过RPC的方式,通知需要做此修改的Broker。

那么Controller是如何选举leader的?

  • 如果当前ISR中有至少一个Replica还幸存,则选择其中一个作为新Leader。

  • 如果replica都不在ISR列表里面,选择该Partition中任意一个幸存的Replica作为新的Leader以及ISR(该场景下可能会有潜在的数据丢失)。

  • 如果该Partition的所有Replica都宕机了,则将新的Leader设置为-1。

2. Partition的leader选举是怎么样的

  • Producer在发布消息到某个Partition时,先通过ZooKeeper找到该Partition的Leader,然后写入数据。

  • Consumer(0.8)通过zk找到leader,读取数据。

  • Consumer(0.10)通过Coordinator找到Leader,读取数据。

1. reassign一个topic,Producer、Consumer是否会丢失数据

不会。扩容的时候,新的leader需要从旧有的broker复制数据,跟上以后,会切换成leader。

这个时间期间,Producer、Consumer会向旧有的leader通信。

内部topic:__consumer_offsets
这个topic是用来管理所有的consumer的进度的,这样避免了把消费进度存zk上面影响扩展性。它是由Coordinator来管理的。

如果请求过来的topic是__consumer_offsets,那就启动OffsetManager的异步读
这个异步读会一直读取__consumer_offsets并把消息解码成消费进度放入缓存

queued.max.requests=16

I/O线程可以处理请求的队列大小,若实际请求数超过此大小,网络线程将停止接收新的请求。

confluence

  • 单机partition数的最大值:100 * broker * replica (if you care about latency, it's probably a good idea to limit the number of partitions per broker to 100 x b x r, where b is the number of brokers in a Kafka cluster and r is the replication factor.)



数据 消息 缓存 消费 内存 文件 方式 选举 技术 时候 网络 内核 同时 大小 就是 情况 时间 进度 问题 重要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 奇酷互联网科技公司 紫鲸互联网科技 互联网科技排名 互联网金融科技创新 互联网科技的未来发展 互联网高科技企业 盛创互联网科技有限公司 滨湖区互联网智能科技产品供应 上海电发互联网科技有限公司 福州新华互联网科技学校 知乎 速维有品互联网信息科技(苏州)有限公司 河南住房之家互联网科技 吉林省码上互联网科技电话 互联网时代科技型公司的机会 广西科技产业互联网是什么 广州智享互联网科技 互联网科技和医药行业 恒生互联网科技趋势 利用互联网等科技手段 河南云网互联网络科技有限公司 金融科技 互联网金融 广州宏创互联网科技 顺玮阁互联网科技 互联网高科技股票 汽车互联网创新科技园 本届互联网博览会上的黑科技 翼展科技 首家互联网医院 福州德业互联网科技 恒生科技指数 中概互联网
0