Kafka 0.10问题点滴
15.如何消费内部topic: __consumer_offsets
- 主要是要让它来格式化:
GroupMetadataManager.OffsetsMessageFormatter - 最后用看了它的源码,把这部分挑选出来,自己解析了得到的byte[]。核心代码如下:
// com.sina.mis.app.ConsumerInnerTopic
ConsumerRecords<byte[], byte[]> records = consumer.poll(512);
for (ConsumerRecord<byte[], byte[]> 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 config
echo "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 config
echo "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。
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流程,一次传送过程:
- 从Disk把数据读到内核区的Read Buffer。
- 把数据从内核区到用户区Buffer。
- 再把数据写入到内核区的Socket Buffer上。
- 把数据从Socket Buffer复制到网卡的NIC Buffer上。

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

8.kafka如何做到大吞吐量、强大消息堆积能力等特性
- 依赖OS文件系统的页缓存 (当上层有写操作时,操作系统只是将数据写入PageCache,同时标记Page属性为Dirty。当读操作发生时,先从PageCache中查找,如果发生缺页才进行磁盘调度,最终返回需要的数据。实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用。同时如果有其他进程申请内存,回收PageCache的代价又很小。
总结:依赖OS的页缓存能大量减少IO,高效利用内存来作为缓存) - 不使用JVM缓存数据, 内存利用率高
- 顺序IO以及O(1)常量时间get、put消息
- 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.)
Kafka 0.10问题点滴的更多相关文章
- Kafka 0.10.1版本源码 Idea编译
Kafka 0.10.1版本源码 Idea编译 1.环境准备 Jdk 1.8 Scala 2.11.12:下载scala-2.11.12.msi并配置环境变量 Gradle 5.6.4: 下载Grad ...
- Kafka 0.10.0
2.1 Producer API We encourage all new development to use the new Java producer. This client is produ ...
- Kafka 0.10 KafkaConsumer流程简述
ConsumerConfig.scala 储存Consumer的配置 按照我的理解,0.10的Kafka没有专门的SimpleConsumer,仍然是沿用0.8版本的. 1.从poll开始 消费的规则 ...
- Kafka 0.10.1.1 特点
1.Consumer优化:心跳线程可作为后台线程,提交offset,剥离出poll函数 问题:0.10新设计的consumer是单线程的,提交offset是在poll中.本次的poll调用,提交上次p ...
- kafka 0.10.2 消息消费者
package cn.xiaojf.kafka.consumer; import org.apache.kafka.clients.consumer.ConsumerConfig; import or ...
- kafka 0.10.2 消息生产者(producer)
package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.*; import org.apache.kafk ...
- kafka 0.10.2 消息生产者
package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.KafkaProducer; import org ...
- kafka 0.10.2 cetos6.5 集群部署
安装 zookeeper http://www.cnblogs.com/xiaojf/p/6572351.html安装 scala http://www.cnblogs.com/xiaojf/p/65 ...
- Kafka 0.10 Metadata的补充
什么是Metadata? Topic/Partion与broker的映射关系:每一个Topic的每一个Partion的Leader.Follower的信息. 它存在哪里?持久化在Zookeeper中: ...
随机推荐
- B01-java学习-阶段2-面向对象
对象内存分析 构造方法 类的深入解释 预定义类型和自定义类型深入分析和解释 预定义类源码的查看 预定义类和自定义类的对比 跨过类中使用自定义类型作为属性类型的门槛 构造方法的定义和执行过程 编译器提供 ...
- ajax跨域请求数据
最近开始接触ajax的跨域请求问题,相比网上说的一大堆,我这里就说得比较浅显了. 关于为什么要跨域这个问题,实际的需求是当网站项目部署在一个域名上的时候,分域可以很好地解决网站卡顿问题(拥有多台服务器 ...
- JVM EXCEPTION_ACCESS_VIOLATION
## A fatal error has been detected by the Java Runtime Environment:## EXCEPTION_ACCESS_VIOLATION (0x ...
- [转帖]TMD为你揭秘中国互联网下半场所有秘密
https://www.iyiou.com/p/35099.html 李安说,<比利.林恩的中场战事>是“一个成长的故事”.中国互联网也行至中场,下半场如何走,成长的方向在哪里,成当下关键 ...
- delphi 导出到excel的第1种方法
第一种方法delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery):bo ...
- Java之JSON操作(gson)
使用gson包操作JSON数据. 依赖包:gson-2.8.2.jar <dependency> <groupId>com.google.code.gson</group ...
- Educational Codeforces Round 25 A,B,C,D
A:链接:http://codeforces.com/contest/825/problem/A 解题思路: 一开始以为是个进制转换后面发现是我想多了,就是统计有多少个1然后碰到0输出就行,没看清题意 ...
- 自学Linux Shell3.5-目录处理命令mkdir rmdir
点击返回 自学Linux命令行与Shell脚本之路 3.5-目录处理命令mkdir rmdir 1. mkdir命令 创建一个或多个新的目录. mkdir 命令创建由 Directory 参数指定的一 ...
- Java -- JDBC 学习--数据库连接池
JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...
- centos6.5安装jdk(解压tar.gz)
0.说明 下载jdk文件包jdk-7u79-linux-x64.tar.gz. 1.环境清理(系统自带的OpenJDK) 1.1 查看OpenJDK的安装包 $ rpm -qa |grep java ...