Kafka设计解析(十七)Kafka 0.11客户端集群管理工具AdminClient
转载自 huxihx,原文链接 Kafka 0.11客户端集群管理工具AdminClient
很多用户都有直接使用程序API操作Kafka集群的需求。在0.11版本之前,kafka的服务器端代码(即添加kafka_2.**依赖)提供了AdminClient和AdminUtils可以提供部分的集群管理操作,但社区官网主页并没有给出这两个类的使用文档。用户只能自行查看源代码和测试用例才能了解具体的使用方法。倘若使用客户端API的话(即添加kafka_clients依赖),用户必须构造特定的请求并自行编写代码向指定broker创建Socket连接并发送请求,同样是十分繁琐。故Kafka 0.11版本引入了客户端的AdminClient工具。注意,虽然和原先服务器端的AdminClient类同名,但这个工具是属于客户端的,因此需要在程序中添加kafka_clients依赖,比如Gradle的话则增加 compile group: 'org.apache.kafka', name: 'kafka-clients', version: '0.11.0.0'
该工具提供的所有功能包括:
- 创建topic
- 查询所有topic
- 查询单个topic详情
- 删除topic
- 修改config(包括BROKER和TOPIC资源的config)
- 查询资源config详情
- 创建ACL
- 查询ACL详情
- 删除ACL
- 查询整个集群详情
用户使用该类的方式与Java clients的使用方式一致,不用连接Zookeeper,而是直接给定集群中的broker列表。另外该类是线程安全的,因此可以放心地在多个线程中使用该类的实例。AdminClient的实现机制与《Java API方式调用Kafka各种协议》一文中的方式完全一样:都是在后台自行构建Kafka的各种请求然后发送,只不过所有的细节AdminClient都帮用户实现了,用户不再自己编写底层的各种功能代码了。
下面给出一个该类的测试实例,列出了除ACL操作之外的所有操作样例代码,如下所示:
public class AdminClientTest {
private static final String TEST_TOPIC = "test-topic";
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092,localhost:9093");
try (AdminClient client = AdminClient.create(props)) {
describeCluster(client);
createTopics(client);
listAllTopics(client);
describeTopics(client);
alterConfigs(client);
describeConfig(client);
deleteTopics(client);
}
}
/**
* describe the cluster
* @param client
* @throws ExecutionException
* @throws InterruptedException
*/
public static void describeCluster(AdminClient client) throws ExecutionException, InterruptedException {
DescribeClusterResult ret = client.describeCluster();
System.out.println(String.format("Cluster id: %s, controller: %s", ret.clusterId().get(), ret.controller().get()));
System.out.println("Current cluster nodes info: ");
for (Node node : ret.nodes().get()) {
System.out.println(node);
}
}
/**
* describe topic's config
* @param client
*/
public static void describeConfig(AdminClient client) throws ExecutionException, InterruptedException {
DescribeConfigsResult ret = client.describeConfigs(Collections.singleton(new ConfigResource(ConfigResource.Type.TOPIC, TEST_TOPIC)));
Map<ConfigResource, Config> configs = ret.all().get();
for (Map.Entry<ConfigResource, Config> entry : configs.entrySet()) {
ConfigResource key = entry.getKey();
Config value = entry.getValue();
System.out.println(String.format("Resource type: %s, resource name: %s", key.type(), key.name()));
Collection<ConfigEntry> configEntries = value.entries();
for (ConfigEntry each : configEntries) {
System.out.println(each.name() + " = " + each.value());
}
}
}
/**
* alter config for topics
* @param client
*/
public static void alterConfigs(AdminClient client) throws ExecutionException, InterruptedException {
Config topicConfig = new Config(Arrays.asList(new ConfigEntry("cleanup.policy", "compact")));
client.alterConfigs(Collections.singletonMap(
new ConfigResource(ConfigResource.Type.TOPIC, TEST_TOPIC), topicConfig)).all().get();
}
/**
* delete the given topics
* @param client
*/
public static void deleteTopics(AdminClient client) throws ExecutionException, InterruptedException {
KafkaFuture<Void> futures = client.deleteTopics(Arrays.asList(TEST_TOPIC)).all();
futures.get();
}
/**
* describe the given topics
* @param client
* @throws ExecutionException
* @throws InterruptedException
*/
public static void describeTopics(AdminClient client) throws ExecutionException, InterruptedException {
DescribeTopicsResult ret = client.describeTopics(Arrays.asList(TEST_TOPIC, "__consumer_offsets"));
Map<String, TopicDescription> topics = ret.all().get();
for (Map.Entry<String, TopicDescription> entry : topics.entrySet()) {
System.out.println(entry.getKey() + " ===> " + entry.getValue());
}
}
/**
* create multiple sample topics
* @param client
*/
public static void createTopics(AdminClient client) throws ExecutionException, InterruptedException {
NewTopic newTopic = new NewTopic(TEST_TOPIC, 3, (short)3);
CreateTopicsResult ret = client.createTopics(Arrays.asList(newTopic));
ret.all().get();
}
/**
* print all topics in the cluster
* @param client
* @throws ExecutionException
* @throws InterruptedException
*/
public static void listAllTopics(AdminClient client) throws ExecutionException, InterruptedException {
ListTopicsOptions options = new ListTopicsOptions();
options.listInternal(true); // includes internal topics such as __consumer_offsets
ListTopicsResult topics = client.listTopics(options);
Set<String> topicNames = topics.names().get();
System.out.println("Current topics in this cluster: " + topicNames);
}
}
最后提一句,由于该类本质上是异步发送请求然后等待操作处理结果,因此每个返回的结果都使用了KafkaFuture进行了封装——KafkaFuture实现了Java的Future接口。既然是Future,那么用户在具体实现上便可以自行决定是异步接收结果还是同步等待。本例中大量使用了KafkaFuture.get(),即同步等待结果。
Kafka设计解析(十七)Kafka 0.11客户端集群管理工具AdminClient的更多相关文章
- Kafka 0.11客户端集群管理工具AdminClient
很多用户都有直接使用程序API操作Kafka集群的需求.在0.11版本之前,kafka的服务器端代码(即添加kafka_2.**依赖)提供了AdminClient和AdminUtils可以提供部分的集 ...
- Kafka集群管理工具kafka-manager的安装使用
一.kafka-manager简介 kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作.具体支持以下内容: 管理多个集群 ...
- Linux Kafka集群管理工具kafka-manager的安装使用
一.kafka-manager简介 kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作.具体支持以下内容: 管理多个集群 ...
- Kafka集群管理工具kafka-manager
一.kafka-manager简介 kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作.具体支持以下内容: 管理多个集群 ...
- kafka集群管理工具kafka-manager部署安装
一.kafka-manager 简介 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 Kafka Manager.这个管理工具可以很 ...
- Kafka设计解析:Kafka High Availability
Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永远不能再恢复,亦 ...
- Kafka设计解析(十六)Kafka 0.11消息设计
转载自 huxihx,原文链接 [原创]Kafka 0.11消息设计 目录 一.Kafka消息层次设计 1. v1格式 2. v2格式 二.v1消息格式 三.v2消息格式 四.测试对比 Kafka 0 ...
- Kafka设计解析(一)- Kafka背景及架构介绍
本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅 ...
- Kafka设计解析(八)- Exactly Once语义与事务机制原理
原创文章,首发自作者个人博客,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本 ...
随机推荐
- 用数组指针遍历数组,FOR/FOREACH遍历数组
1. 用数组指针遍历一维数组 <?php header("Content-type:text/html;charset=utf-8"); /*用数组指针遍历一位数组的值*/ ...
- 简洁php的MVC框架
一.文件结构 建立3个文件夹 controller文件夹存放控制器文件 view文件夹存放视图文件 model文件夹存放数据文件 建立1个index.php 作为唯一入口 二.控制器 我们在contr ...
- 原 java调整数据顺序是奇数位于偶数的前面(思路与实现)
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路一: 首先这 ...
- JavaScript中==和===的区别(面试题目)
==用于一般比较,===用于严格比较;==在比较的时候可以转换数据类型,===严格比较,只要类型不匹配就返回flase. 举例说明: "1" == true; //true 类型不 ...
- 解决移动端touch事件(touchstart/touchend) 的穿透问题
情景: 我们在移动端点击事件click对比touchend会有很明显的300ms的延迟,为啥? 浏览器在 click 后会等待约300ms去判断用户是否有双击行为(手机需要知道你是不是想双击放大网页内 ...
- LeetCode 527---Word Abbreviation
527. Word Abbreviation Given an array of n distinct non-empty strings, you need to generate minimal ...
- Android Studio最全插件整理
在Android开发中,合理的使用Android Studio插件不但可以提高开发效率,还能从整体上提高代码的质量.下面就Android开发中常见的一些插件做一个整理. 1,GsonFormatGso ...
- CVE-2017-17215 - 华为HG532命令注入漏洞分析
前言 前面几天国外有个公司发布了该漏洞的详情.入手的二手 hg532 到货了,分析测试一下. 固件地址:https://ia601506.us.archive.org/22/items/RouterH ...
- pytts3语音合成遇到的中文问题
在使用pytts3语音合成时,遇到中文语音错乱.程序代码本身很简单,也是网上公认的一种写法: #coding: UTF-8import pyttsx3; engine = pyttsx3.init() ...
- leetCode题解之Product of Array Except Self
1.题目描述 2.题目分析 每个元素对应的积应该是 它 前面的每个元素的积,和后面的每个元素的积 3.代码 vector<int> productExceptSelf(vector< ...