ApacheKafka客户机(Java):列出主题并检查主题是否被日志压缩

ApacheKafka客户机(Java):列出主题并检查主题是否被日志压缩,java,apache-kafka,Java,Apache Kafka,背景 我们公司有由动物园管理员管理的阿帕奇·卡夫卡。我们的一个Spring引导应用程序需要检查所有可用主题的列表,并列出哪些主题启用了日志压缩(cleanup.policy=compact) 当前代码 @豆子 公共消费者工厂消费者工厂(){ Map props=newhashmap(); put(ConsumerConfig.BOOTSTRAP\u SERVERS\u CONFIG,kafkaBrokerList); props.put(ConsumerConfig.GROUP\u ID\u

背景

我们公司有由动物园管理员管理的阿帕奇·卡夫卡。我们的一个Spring引导应用程序需要检查所有可用主题的列表,并列出哪些主题启用了日志压缩(cleanup.policy=compact)

当前代码


@豆子
公共消费者工厂消费者工厂(){
Map props=newhashmap();
put(ConsumerConfig.BOOTSTRAP\u SERVERS\u CONFIG,kafkaBrokerList);
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,kafkaConsumerGroup);
put(ConsumerConfig.KEY\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
put(ConsumerConfig.VALUE\u反序列化程序\u类\u配置,StringDeserializer.CLASS);
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“最早”);
返回新的默认卡夫卡消费工厂(道具);
}
...
...
公共列表getTopics(){
映射主题=consumerFactory().CreateCummer().listTopics();
List topicList=新的ArrayList();
topics.keySet().remove(使用者偏移量);
topicList.addAll(topics.keySet());
返回主题列表;
}
问题

通过上面的代码,应用程序可以获得主题列表。是否有一种方法也可以了解各个主题是否被日志压缩?我要寻找的是某种“Java”方式,以获得与从终端运行以下ApacheKafka CLI命令时相同的响应

kafka主题——Zookeer localhost:2181——描述——主题TestTopicCompact
这是一个例子

主题:TestTopicCompact分区计数:1复制因子:1配置:清理。策略=压缩
主题:TestTopicCompact分区:0领导者:1001副本:1001 Isr:1001
您应该使用来检索该信息

  • 首先用于检索主题列表
  • 然后使用获取每个主题的配置
  • 最后,从您将获得的ConfigEntry对象中,您可以筛选具有
    compact
    作为
    cleanup.policy
    的主题
这就是
kafka主题
工具的基本功能,因此您可以查看其源代码。尽管它是Scala,但概念是相似的。

您应该使用来检索该信息

  • 首先用于检索主题列表
  • 然后使用获取每个主题的配置
  • 最后,从您将获得的ConfigEntry对象中,您可以筛选具有
    compact
    作为
    cleanup.policy
    的主题

这就是
kafka主题
工具的基本功能,因此您可以查看其源代码。即使是Scala,概念也很相似。

您首先需要创建一个带有属性文件的kafka管理客户端

import org.apache.kafka.clients.admin.AdminClient;
import java.util.*;
import org.apache.kafka.clients.admin.Config;
import org.apache.kafka.clients.admin.ConfigEntry;
import org.apache.kafka.clients.admin.DescribeConfigsResult;
import org.apache.kafka.common.config.ConfigResource;

admin = AdminClient.create(properties);
然后需要使用admin.descripebConfigs方法, 此方法将ConfigResources的集合作为参数,如下所述

Collection<ConfigResource> cr =  Collections.singleton( new ConfigResource(ConfigResource.Type.TOPIC, "<Your Topic Name>") 

DescribeConfigsResult ConfigsResult = admin.describeConfigs(cr));
然后需要遍历包含许多ConfigResource对象的all_configs数据类型。 下面的代码构建了一个迭代器,循环遍历并查找config for cleanup策略的配置值,您可以使用相同的逻辑查找其他字段的配置值

    Iterator ConfigIterator = all_configs.entries().iterator();

    while (ConfigIterator.hasNext()) 
    {
          ConfigEntry currentConfig = (ConfigEntry) ConfigIterator.next();
          if (currentConfig.name().equals("cleanup.policy")) {
                System.out.println(currentConfig.value());
          }
        }

您首先需要创建一个带有属性文件的kafka管理客户端

import org.apache.kafka.clients.admin.AdminClient;
import java.util.*;
import org.apache.kafka.clients.admin.Config;
import org.apache.kafka.clients.admin.ConfigEntry;
import org.apache.kafka.clients.admin.DescribeConfigsResult;
import org.apache.kafka.common.config.ConfigResource;

admin = AdminClient.create(properties);
然后需要使用admin.descripebConfigs方法, 此方法将ConfigResources的集合作为参数,如下所述

Collection<ConfigResource> cr =  Collections.singleton( new ConfigResource(ConfigResource.Type.TOPIC, "<Your Topic Name>") 

DescribeConfigsResult ConfigsResult = admin.describeConfigs(cr));
然后需要遍历包含许多ConfigResource对象的all_configs数据类型。 下面的代码构建了一个迭代器,循环遍历并查找config for cleanup策略的配置值,您可以使用相同的逻辑查找其他字段的配置值

    Iterator ConfigIterator = all_configs.entries().iterator();

    while (ConfigIterator.hasNext()) 
    {
          ConfigEntry currentConfig = (ConfigEntry) ConfigIterator.next();
          if (currentConfig.name().equals("cleanup.policy")) {
                System.out.println(currentConfig.value());
          }
        }

嗯。在我看来(通过CLI命令),AdminClient需要连接Zookeeper实例才能获得主题描述。(当我尝试使用代理列表执行此操作时,我得到以下执行选项“org.apache.kafka.common.errors.UnsupportedVersionException:代理不支持descripe_CONFIGS”)。问题是我在创建AdminClient时找不到指定zookeeper列表的方法,也就是说没有zookeeper.servers这样的配置属性,就像borker列表(bootstrap.servers)一样。事实上,当我执行“kafka broker api versions--bootstrap server”等操作时,我会得到以下“DescribeConfigs(32)”:不支持”。顺便说一下,我使用的客户端verison是kafka客户端:2.0.1,kafka群集版本是0.10DescribeConfigs支持是在0.11中添加的。0.11之前,主题配置仅在Zookeeper中可用。我真的建议升级到更新的卡夫卡版本,0.10是3年前发布的。在我看来(通过CLI命令),AdminClient需要连接Zookeeper实例才能获得主题描述。(当我尝试使用代理列表执行此操作时,我得到以下执行选项“org.apache.kafka.common.errors.UnsupportedVersionException:代理不支持descripe_CONFIGS”)。问题是我在创建AdminClient时找不到指定zookeeper列表的方法,也就是说没有zookeeper.servers这样的配置属性,就像borker列表(bootstrap.servers)一样。事实上,当我执行“kafka broker api versions--bootstrap server”等操作时,我会得到以下“DescribeConfigs(32)”:不支持”。顺便说一下,我使用的客户端verison是kafka客户端:2.0.1,kafka群集版本是0.10DescribeConfigs支持是在0.11中添加的。0.11之前,主题配置仅在Zookeeper中可用。我真的建议升级到更新的卡夫卡版本,0.10是3年前发布的。