我们需要创建紧凑的主题, 需要在一定大小(segment.bytes)之后进行压缩,但是在主题级别的配置中经过了一定时间(segment.ms)(即使没有达到segment.bytes)之后重要的是
现在,我们已经看到segment.bytes被兑现了,但是segment.ms没有兑现。 我已经用Confluent kafka 5.x发行版重现了这个问题
https://kafka.apache.org/documentation/#topicconfigs
这是我在apache kafka文档中阅读的有关segment.ms的内容,这使我相信 我们的理解是正确的-segment.ms将覆盖segment.bytes-当它出现时 kafka在一个主题上进行压缩。
segment.ms此配置控制之后的时间段 即使段文件未满,Kafka也会强制滚动日志 以确保保留可以删除或压缩旧数据。
我正在发送数据,键在0-20值之间旋转,并且字符串 “ Spring Kafka生产者和消费者示例”,我将键值附加到此字符串。
这是生产者代码
@Override
public void run(String... strings) throws Exception {
String data = "Spring Kafka Producer and Consumer Example";
for (int j = 0; j < 30000; j++) {
for (int i = 0; i < 20; i++) {
sender.send(new Integer(i).toString(), data + i);
}
}
}
代码示例在这里 https://github.com/leofoto/kafka-producer-consumer.git
我已经从中获取了代码示例(并对此测试用例进行了修改) https://memorynotfound.com/spring-kafka-consume-producer-example/
我首先创建了紧凑主题,在代理日志中,我看到以下内容
为/ tmp / kafka-logs中的my-topic-compact-0分区创建了以下日志: 属性{compression.type->生产者,message.format.version-> 2.0-IV1,file.delete.delay.ms-> 60000,最大消息字节-> 1000012,min.compaction.lag.ms-> 0,message.timestamp.type-> CreateTime, message.downconversion.enable-> true,最小不同步副本-> 1, segment.jitter.ms-> 0,预分配-> false, min.cleanable.dirty.ratio-> 0.5,index.interval.bytes-> 4096, unclean.leader.election.enable-> false,retention.bytes-> -1, delete.retention.ms-> 86400000,cleanup.policy-> [delete],flush.ms -> 9223372036854775807,segment.ms-> 604800000,segment.bytes-> 1073741824,retention.ms-> 604800000, message.timestamp.difference.max.ms-> 9223372036854775807, segment.index.bytes-> 10485760,flush.messages-> 9223372036854775807}。 (kafka.log.LogManager)[2018-09-17 21:28:00,110] INFO [分区my-topic-compact-0 broker = 0]没有检查点 找到分区my-topic-compact-0的高水印 (kafka.cluster.Partition)
然后当我更改配置以使主题紧凑时
./ kafka-configs --zookeeper localhost:2181-实体类型主题 --entity-name my-topic-compact --alter --add-config min.cleanable.dirty.ratio = 0.01,cleanup.policy = compact,segment.ms = 12000,delete.retention.ms = 100,segment。 bytes = 200000已完成实体:主题“ my-topic-compact”的更新配置。
代理日志再次显示它(现在正确报告其紧凑主题)
[2018-09-17 22:06:25,745]信息正在处理通知 / config / changes(kafka.common.ZkNodeChangeNotificationListener) [2018-09-17 22:06:25,746] INFO处理entityPath的覆盖: topic / my-topic-compact with config:Map(cleanup.policy-> compact, segment.ms-> 12000,最小cleanable.dirty.ratio-> 0.01,segment.bytes -> 200000,delete.retention.ms-> 100)(kafka.server.DynamicConfigManager)
kafka-config --describe命令也清楚地显示了它
./ kafka-configs --zookeeper localhost:2181-实体类型主题 --entity-name my-topic-compact --describe
主题“ my-topic-compact”的配置是主题的配置 “我的主题紧凑”是 segment.bytes = 200000,min.cleanable.dirty.ratio = 0.01,delete.retention.ms = 100,segment.ms = 12000,cleanup.policy = compact
启动kafka服务器时,我看到以下消息
<<以300000毫秒的周期开始日志清除>> [[我确定 300秒是代理配置值,主题级别值为12 在这种情况下的秒数]]
[2018-09-17 22:01:31,215]信息[日志分区= my-topic-non-compact-0, dir = / tmp / kafka-logs] 1段日志的完整加载,日志开始 偏移0和日志结束偏移20毫秒(2毫秒)(kafka.log.Log)[2018-09-17 22:01:31,218] INFO日志加载在378毫秒内完成。 (kafka.log.LogManager)[2018-09-17 22:01:31,224]信息开始日志 清理时间为300000毫秒。 (kafka.log.LogManager)[2018-09-17 22:01:31,225] INFO以默认时间段启动日志刷新程序 9223372036854775807毫秒(kafka.log.LogManager)[2018-09-17 22:01:31,439] INFO等待0.0.0.0:9092上的套接字连接。 (kafka.network.Acceptor)[2018-09-17 22:01:31,463] INFO [SocketServer brokerId = 0]已启动1个接受线程(kafka.network.SocketServer) [2018-09-17 22:01:31,478]信息[ExpirationReaper-0-Produce]:正在启动 (kafka.server.DelayedOperationPurgatory $ ExpiredOperationReaper) [2018-09-17 22:01:31,478]信息[ExpirationReaper-0-Fetch]:正在启动 (kafka.server.DelayedOperationPurgatory $ ExpiredOperationReaper) [2018-09-17 22:01:31,479]信息[ExpaationReaper-0-DeleteRecords]: 开始 (kafka.server.DelayedOperationPurgatory $ ExpiredOperationReaper) [2018-09-17 22:01:31,487]信息[LogDirFailureHandler]:正在启动 (kafka.server.ReplicaManager $ LogDirFailureHandler)[2018-09-17 22:01:31,537]信息创建/ brokers / ids / 0(是否安全?假) (kafka.zk.KafkaZkClient)[2018-09-17 22:01:31,541]信息的结果 在/ brokers / ids / 0处创建的znode是:OK(kafka.zk.KafkaZkClient) [2018-09-17 22:01:31,542]信息已在路径中注册经纪人0 / brokers / ids / 0,地址: ArrayBuffer(EndPoint(192.168.0.11,9092,ListenerName(PLAINTEXT),PLAINTEXT)) (kafka.zk.KafkaZkClient)
然后,当我编写大量数据时,我也看到分段也在滚动,我看到了很多活动, 促使压实发生。 [很好]我发送了30万条记录,压缩发生了 和一个使用消息的新使用者(在进行压缩之后),它可以看到约3225条记录。
[2018-09-17 22:09:21,602]信息[日志分区= my-topic-compact-0, dir = / tmp / kafka-logs]在4毫秒内以偏移185361滚动了新的日志段。 (kafka.log.Log)[2018-09-17 22:09:21,673] INFO [ProducerStateManager partition = my-topic-compact-0]在偏移处写入生产者快照 188897(kafka.log.ProducerStateManager)[2018-09-17 22:09:21,675]信息 [日志分区= my-topic-compact-0,dir = / tmp / kafka-logs]滚动了新日志 在3毫秒内偏移188897处的片段。 (kafka.log.Log)[2018-09-17 22:09:21,755]信息[ProducerStateManager partition = my-topic-compact-0] 在偏移量192348处写入生产者快照 (kafka.log.ProducerStateManager)[2018-09-17 22:09:21,758]信息[日志 partition = my-topic-compact-0,dir = / tmp / kafka-logs]滚动了新日志 在3毫秒内以192348偏移量分段。 (kafka.log.Log)[2018-09-17 22:09:21,831]信息[ProducerStateManager partition = my-topic-compact-0] 在偏移195846处写入生产者快照 (kafka.log.ProducerStateManager)[2018-09-17 22:09:21,834]信息[日志 partition = my-topic-compact-0,dir = / tmp / kafka-logs]滚动了新日志 在3毫秒内以195846偏移量分段。 (kafka.log.Log)[2018-09-17 22:09:21,879]信息[ProducerStateManager partition = my-topic-compact-0] 在偏移199461处写生产者快照 (kafka.log.ProducerStateManager)[2018-09-17 22:09:21,882]信息[日志 partition = my-topic-compact-0,dir = / tmp / kafka-logs]滚动了新日志 偏移量199461在3毫秒内的分段。 (kafka.log.Log)[2018-09-17 22:09:21,909]信息[ProducerStateManager partition = my-topic-compact-0] 在偏移量203134处写入生产者快照 (kafka.log.ProducerStateManager)[2018-09-17 22:09:21,915]信息[日志 partition = my-topic-compact-0,dir = / tmp / kafka-logs]滚动了新日志 在7毫秒内在偏移203134处分段。 (kafka.log.Log)[2018-09-17 22:09:21,980]信息[ProducerStateManager partition = my-topic-compact-0] 在偏移量206703处写入生产者快照 (kafka.log.ProducerStateManager)[2018-09-17 22:09:21,985]信息[日志 partition = my-topic-compact-0,dir = / tmp / kafka-logs]滚动了新日志 在6毫秒内在偏移206703处进行分段。 (kafka.log.Log)
现在无论等待多长时间(过去12秒),日志压缩都不会开始
无论我在运行以下命令之前每次等待多少时间(每次都有新的使用者组)
./ kafka-console-consumer --bootstrap-server localhost:9092 --topic my-topic-compact-从头开始--property print.key = true --group new-group16
每个新消费者都消费了3225条消息, 如果压缩是在主题级别segment.ms通过之后发生的, 它应该压缩到只有20个键及其最新值。 但是我们看不到这种行为。我错过了什么吗?
删除不起作用
最重要的是,当我为相同的键发送空有效载荷时,就像这样
@Override
public void run(String... strings) throws Exception {
String data = "Spring Kafka Producer and Consumer Example";
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 20; i++) {
sender.send(new Integer(i).toString(), null);
}
}
}
我们希望该消息最终在下一个压缩周期被删除。在segment.ms时间过去之后(对于我们而言,在主题级别的配置中为12秒),这对我们来说都是没有发生的
./ kafka-configs --zookeeper localhost:2181-实体类型主题 --entity-name my-topic-compact --describe
主题“ my-topic-compact”的配置是主题的配置 “我的主题紧凑”是 segment.bytes = 200000,min.cleanable.dirty.ratio = 0.01,delete.retention.ms = 100,segment.ms = 12000,cleanup.policy = compact
答案 0 :(得分:2)
kafka(apache kafka 2.x或confluent distribution 5.x)尚不支持基于时间的日志压缩,这是我从合流工程师那里获得的
目前,这对我们不起作用。 分享以下信息供他人参考
一次 https://cwiki.apache.org/confluence/display/KAFKA/KIP-354%3A+Add+a+Maximum+Log+Compaction+Lag 已完成且已实施,我鼓励您重新使用 情况。