Apache Kafka(十一)Topic 的配置与组成
Topic 的配置与组成
之前我们仅主要介绍了Kafka Producer与Kafka Consumer 的相关配置,而未详细介绍过有关topic的配置。Topic的配置在Kafka 使用中也至关重要,因为它的参数足以影响集群性能以及topic 的行为。
在一个topic被创建后,会有它默认的参数,不过有些topic的参数可能仍需要根据实际情况进行一些调整,例如:
- Replication Factor
- Partition数目
- Message Size
- Compression level
- Log Cleanup Policy
- Min Insync Replicas
- …
其中Replication Factor与Partition数目之前有被提及,所以我们主要关注之前未提及过的参数配置。
1. 如何配置一个 Kafka Topic
这里我们会简单地介绍如何使用kafka cli 为一个topic 修改配置。首先我们创建一个topic:
> kafka-topics.sh --zookeeper 172.31.24.148:2181 --create --topic configured-topic --partitions 3 --replication-factor 1
我们可以使用 kafka-configs cli 配置topic 的参数,例如:
kafka-configs.sh --zookeeper 172.31.24.148 --entity-type topics --entity-name configured-topic --add-config min.insync.replicas=2 --alter
然后describe 这个 topic:
kafka-topics.sh --zookeeper 172.31.24.148:2181 --describe --topic configured-topic
Topic:configured-topic PartitionCount:3 ReplicationFactor:1 Configs:min.insync.replicas=2
Topic: configured-topic Partition: 0 Leader: 0 Replicas: 0 Isr: 0
Topic: configured-topic Partition: 1 Leader: 0 Replicas: 0 Isr: 0
Topic: configured-topic Partition: 2 Leader: 0 Replicas: 0 Isr: 0
可以看到在Configs一栏,多出了一个配置。
也可以使用--delete-config 选项,删除一个配置:
kafka-configs.sh --zookeeper 172.31.24.148 --entity-type topics --entity-name configured-topic --delete-config min.insync.replicas --alter
Completed Updating config for entity: topic 'configured-topic'.
2. Partitions 与Segments
我们知道一个topic是由一个或多个partitions组成。而对于一个partition来说,它是由一个或多个segments (本质是文件)组成。如下图所示:

每个segment都会有一个starting offset以及一个ending offset。下一个segment的starting offset为前一个segment 的ending offset + 1。最后一个segment 称为active segment,意味着当前segment仍为“被写入”状态。也就是说,若是有新的record写入,则是写入到这个active segment中。在active segment中的offset达到预期值后,则此segment会被关闭,并开启一个新的segment。
所以在任何时刻,均只有一个segment为ACTIVE 状态(也就是数据被写入的segment)。
有关segment 的参数有两个:
- log.segment.bytes:单个segment可容纳的最大数据量,默认为1GB
- log.segment.ms:Kafka在commit一个未写满的segment前,所等待的时间(默认为7天)
3. Segment 与 Indexes
每个Segment 均有与之对应的两个index文件:
- Offset 与 Position 之间映射的索引:用于让Kafka通过offset在segment中找到一条message
- Timestamp 与 Offset之间的索引:用于让Kafka通过一个timestamp找到一条message
也是基于这些index文件,使得Kafka可以在一个常数时间内找到数据。在找到此条数据后,会继续顺序读取之后的数据。这也就是为什么Kafka仅适用于顺序读写,而不适用于随机读写。

我们进一步可以再查看真正对应到这些概念的文件。之前我们定义了kafka 的log.dirs 为:
/home/hadoop/kafka_2.12-2.3.0/data/kafka-logs
进入到此目录,可以看到所有列出来的topics,以及它们对应的partitions:

进入到kafka_demo-0 这个partition目录中可以看到:

其中.log 为存储message的文件,.index 为Offset与Position之间的索引文件,.timeindex为Timestamp与 Offset之间的索引文件。
4. Segment 配置
在进一步了解了segment后,再回头看看segment的两个配置log.segment.bytes与log.segment.ms。
若是将log.segment.bytes(大小,默认为1GB)调小,则意味着:
- 每个partition对应更多的segments
- Log Compaction发生的会更频繁
· Kafka 会维护更多的open files(报错:Too many open files)
在决定此参数的大小时,需要考虑到业务吞吐的大小。如果业务的数据量是每天一个GB的数据,则默认的配置即可适用此场景;而如果业务的数据量是一周一个GB,则可以适当调小此值。
而若是将 log.segment.ms(默认为一周)调小,则意味着:
- 更频繁的log compaction(触发的更频繁)
- 生成更多的文件
在决定此参数的大小时,需要考虑到:业务中需要log compaction 发生的频率。Log Compaction会在之后介绍。
Apache Kafka(十一)Topic 的配置与组成的更多相关文章
- Kafka中Topic级别配置
一.Kafka中topic级别配置 1.Topic级别配置 配置topic级别参数时,相同(参数)属性topic级别会覆盖全局的,否则默认为全局配置属性值. 创建topic参数可以设置一个或多个--c ...
- 【转】apache kafka技术分享系列(目录索引)
转自: http://blog.csdn.net/lizhitao/article/details/39499283 估计大神会不定期更新,所以还是访问这个链接看最新的目录list比较好 apa ...
- apache kafka技术分享系列(目录索引)--转载
原文地址:http://blog.csdn.net/lizhitao/article/details/39499283 kafka开发与管理: 1)apache kafka消息服务 2)kafak安装 ...
- Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十一)定制一个arvo格式文件发送到kafka的topic,通过Structured Streaming读取kafka的数据
将arvo格式数据发送到kafka的topic 第一步:定制avro schema: { "type": "record", "name": ...
- Apache Kafka使用默认配置执行一些负载测试来完成性能测试和基准测试
Kafka是一种分布式,分区,复制的提交日志服务.它提供了消息传递系统的功能. 我们先来看看它的消息传递术语: Kafka在称为主题的类别中维护消息的提要. 我们将调用向Kafka主题生成器发布消 ...
- Error when sending message to topic test with key: null, value: 2 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
windows下使用kafka遇到这个问题: Error when sending message to topic test with key: null, value: 2 bytes with ...
- CDH下集成spark2.2.0与kafka(四十一):在spark+kafka流处理程序中抛出错误java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)V
错误信息 19/01/15 19:36:40 WARN consumer.ConsumerConfig: The configuration max.poll.records = 1 was supp ...
- kafka删除topic后再创建同名的topic报错(ERROR org.apache.kafka.common.errors.TopicExistsException)
[hadoop@datanode3 logs]$ kafka-topics.sh --delete --zookeeper datanode1:2181 --topic firstTopic firs ...
- Kafka设计解析(十一)Kafka无消息丢失配置
转载自 huxihx,原文链接 Kafka无消息丢失配置 目录 一.Producer端二.Consumer端 Kafka到底会不会丢数据(data loss)? 通常不会,但有些情况下的确有可能会发生 ...
随机推荐
- Chocolaty
原文是用markdown格式写的,稍微改了下发了博客,格式可能会很奇怪.. Chocolaty官网 Chocolaty是一款Windows平台的包管理工具,类似于centos的yum或ubuntu的a ...
- STL与基本数据结构
目录 Vector list -- 链表 Stack -- 栈 queue -- 队列 优先队列 -- priority_ queue set -- 集合 multiset map 这是我第一次用Ma ...
- 关于全球唯一标识GUID的生成
1.c#生成GUID的几种方式 (1)生成标准的标志符 (36位标准) var strguid = Guid.NewGuid().ToString(); 结果:B2A5AB40-EE29-4791-9 ...
- JavaScript实现常见的数据结构
使用JavaScript实现栈.队列.链表.集合等常见数据结构.可能会有点用? 水 栈(Stack) 实际上JavaScript的Array本身就具有栈和队列的特性,所以我们可以借助Array来实现它 ...
- ContestHunter 1201 最大子序和
描述 输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...
- php7 安装redis拓展
配置之前应该是环境已经搭好了,phpinfo的页面可以加载出来. 使用git clone下载git上的phpredis扩展包 git clone https://github.com/phpre ...
- lampp ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'lepus'
解决方法: 在[mysqlld]段下增加如下代码:skip-grant-tables: 1.which mysql 查看mysql位置,例如:/opt/lampp/bin/mysql 2.进入配置my ...
- [CF235A] LCM Challenge - 贪心
找到3个不超过n的正整数(可以相同),使得它们的lcm(最小公倍数)最大. Solution 可以做得很优雅吧,但我喜欢(只会)暴力一点 根据质数密度分布性质,最后所取的这三个数一定不会比 \(n\) ...
- MySQL8.0.11解压版安装详细教程
1. 从官网下载zip包 官网网址(https://dev.mysql.com/downloads/mysql/) 2. 解压 将压缩包解压到一个目录(后续将此目录作为安装目录),我这里是解压到了D: ...
- linux - mysql - 新建用户
新建用户 使用如下命令创建一个用户名和密码分别为"myuser"和"mypassword"的用户,localhost在User表里是Host字段(主机). my ...