概述
Kafka系列文章:
Kafka提供大量脚本,以Kafka_2.13-4.1.1版本为例,即Scala版本是2.13,Kafka版本是4.1.1:
- 在bin目录下面,可用于Unix平台(包括Linux和Mac),有多达43个sh脚本;
- 在
kafka_2.13-4.1.1\bin\windows目录下,即提供给Windows系统使用,也有多达36个bat脚本。

这些都是Kafka的命令行工具,主要包括服务和集群管理,配置,信息查看,Topic,客户端脚本: connect-distributed.sh:启动分布式Kafka Connect集群connect-mirror-maker.sh:connect-plugin-path.sh:connect-standalone.sh:启动单点Kafka Connect组件kafka-acls.sh:授权管理脚本kafka-broker-api-versions.sh:验证不同Kafka版本之间服务器和客户端的适配性kafka-client-metrics.sh:kafka-cluster.sh:kafka-configs.sh:配置管理脚本kafka-console-consumer.sh:消费者控制台kafka-console-producer.sh:生产者控制台kafka-consumer-groups.sh:消费者组相关信息kafka-consumer-perf-test.sh:消费者性能测试kafka-delegation-tokens.sh:管理Delegation Tokenkafka-delete-records.sh:删除低水位的日志文件kafka-dump-log.sh:查看Kafka消息文件内容kafka-e2e-latency.sh:kafka-features.sh:kafka-get-offsets.sh:获取偏移量kafka-jmx.sh:kafka-leader-election.sh:kafka-log-dirs.sh:Kafka消息日志目录信息kafka-metadata-quorum.sh:kafka-metadata-shell.sh:kafka-mirror-maker.sh:不同数据中心集群复制工具kafka-producer-perf-test.sh:生产者性能测试脚本kafka-reassign-partitions.sh:分区重分配,修改主题副本kafka-replica-verification.sh:kafka-run-class.sh:执行任何带main方法的Kafka类kafka-server-start.sh:启动Kafka服务kafka-server-stop.sh:停止Kafka服务kafka-storage.sh:kafka-streams-application-reset.sh:kafka-topics.sh:Topic管理脚本kafka-transactions.sh:kafka-verifiable-consumer.sh:可检验的Kafka消费者kafka-verifiable-producer.sh:可检验的Kafka生产者trogdor.sh:测试框架zookeeper-security-migration.sh:zookeeper-server-start.sh:启动ZK服务zookeeper-server-stop.sh:停止ZK服务zookeeper-shell.sh:ZK客户端
知道得越多,发现自己越无知。本文不可能列举所有脚本使用方式,必要时还是得看脚本输出的帮助文档或官方文档。
默认情况下,不加任何参数或携带--help运行脚本文件,会得到该脚本的使用方法说明。
通常可使用kafka-console-consumer.sh和kafka-console-producer.sh脚本来测试Kafka生产和消费,kafka-consumer-groups.sh可查看和管理集群中的Topic,kafka-topics.sh通常用于查看消费组情况。
connect-mirror-maker.sh和kafka-mirror-maker.sh
都用于在Kafka集群之间镜像数据的工具,但它们有不同的实现方式和功能集。
kafka-mirror-maker.sh是Kafka的旧版镜像工具,基于消费者和生产者进行数据复制。是一个简单的命令行工具,配置相对简单,基于Kafka的消费者和生产者API工作,通过消费源集群的消息并生产到目标集群实现镜像。常用于开发或简单的生产环境,不推荐用于复杂的生产环境。扩展性有限,不支持高级的Kafka Connect特性。
命令实例:
./kafka-mirror-maker.sh --consumer.config consumer.properties --producer.config producer.properties --whitelist=".*"
connect-mirror-maker.sh是Kafka Connect框架的一部分,提供更高级的功能和更好的扩展性。通过配置文件进行详细配置,支持多种配置选项,灵活性更强,扩展性更好,适合复杂的生产环境的企业级管理工具。
支持Kafka Connect提供的各种特性:
- 扩展插件
- 转换和错误处理
- 支持自动同步主题、消费组、ACL等配置
- 支持自动检测和同步新创建的主题
- 提供REST API式的更好用的监控和管理功能
命令实例:./connect-mirror-maker.sh --config mirror-maker.properties
基础
启动Kafka:
./kafka-server-start.sh server.properties
停止Kafka:
./kafka-server-stop.sh
配置
查看配置:
./kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name mytopic --describe
对指定entity-type添加配置,其可选项:topics、brokers、users、clients、ips、client-metrics、groups:
./kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name mytopic --add-config 'max.message.bytes=50000000,flush.message=5'
删除配置:
./kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name mytopic --delete-config 'flush.message'
主题
创建主题:
./kafka-topics.sh --zookeeper node01:2181 --create --topic t_cdr --partitions 30 --replication-factor 2
其中,partitions指定主题分区数,replication-factor指定主题每个分区的副本数
partitions分区数:
- 分区数,控制主题将分片成多少个log。可显式指定,若不指定则会使用Broker配置文件
server.properties中的num.partitions配置的数量 - 虽然增加分区数可以提供Kafka集群的吞吐量,但是过多的分区数或者或是单台服务器上的分区数过多,会增加不可用及延迟的风险。因为更多分区数,意味着需打开更多文件句柄、增加点到点的延时、增加客户端内存消耗。
- 分区数也限制consumer的并行度,即限制并行consumer消息的线程数不能大于分区数
- 分区数也限制producer发送消息是指定的分区。如创建主题时分区设置为1,producer发送消息时通过自定义的分区方法指定分区为2或以上的数都会出错的;这种情况可通过
alter --partitions来增加分区数。
replication-factor副本
- 控制消息保存在几个broker(服务器)上,一般情况下等于broker的个数。
- 如果没有在创建时显示指定或通过API向一个不存在的主题生产消息时会使用broker(server.properties)中的
default.replication.factor配置数量
查看所有主题列表:
./kafka-topics.sh --zookeeper node01:2181 --list
查看指定主题信息:
./kafka-topics.sh --zookeeper node01:2181 --describe --topic t_cdr
增加主题分区数
./kafka-topics.sh --zookeeper node01:2181 --alter --topic t_cdr --partitions 10
注意:分区数量只能扩大不能缩小。
删除主题:
./kafka-topics.sh --delete --zookeeper localhost:2181 --topic op_log
未设置delete.topic.enable=true时,是不会立即执行删除操作的,而是仅仅将指定主题标记为删除状态,之后会启动后台删除线程来删除。
分区
生成分区移动计划:
./kafka-reassign-partitions.sh --zookeeper localhost:2181 --broker-list "0" --topics-to-move-json-file ~/json/op_log_topic-to-move.json --generate
其中:
--broker-list:指定要挪动的Broker范围--topics-to-move-json-file:指定配置文件
执行分区移动计划,--reassignment-json-file指定再分区后Assigned Replica的分布情况:
./kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file ~/json/op_log_reassignment.json --execute
检查当前再分区进度:
./kafka-reassign-partitions.sh --zookeeper localhost:2181 --reassignment-json-file ~/json/op_log_reassignment.json --verify
消费者组
查看存储在ZK中的消费组信息
./kafka-consumer-groups.sh --zookeeper localhost:2181 --list
查看存储在Kafka中的消费组信息
./kafka-consumer-groups.sh --new-consumer --bootstrap-server localhost:9092 --list
查看指定Group的详细消费情况,如当前消费进度,消息积压量等
./kafka-consumer-groups.sh --zookeeper localhost:2181 --group console-consumer-11 --describe
性能测试
生产者:
./kafka-producer-perf-test.sh --topic test --num-records 1000000 --throughput 1 --record-size 512 --producer-props bootstrap.servers=kafka1:9091,kafka2:9092,kakfa3:9093 acks=-1 linger.ms=0 compression.type=lz4
消费者:
./kafka-consumer-perf-test.sh --broker-list kafka1:9091,kafka2:9092,kakfa3:9093 --messages 10000000 --topic test
控制台
控制台生产主题数据:
./kafka-console-producer.sh --broker-list node86:9092 --topic t_cdr --request-required-acks -1 --producer-property compression.type=lz4
控制台消费主题数据:
./kafka-console-consumer.sh --zookeeper node01:2181 --topic t_cdr --group test-group --from-beginning --consumer-property enable.auto.commit=false
--from-beginning表示从头开始消费,可消费到之前的消息。
运行类
查看主题某分区偏移量最大(小)值
./kafka-run-class.sh kafka.tools.GetOffsetShell --topic hive-mdatabase-hostsltable --time -1 --broker-list node86:9092 --partitions 0
其中time为-1时表示最大值,time为-2时表示最小值
删除主题,慎用,只会删除zookeeper中的元数据,消息文件须手动删除
./kafka-run-class.sh kafka.admin.DeleteTopicCommand --zookeeper node01:2181 --topic t_cdr
查看消费者组下主题消费进度,参数--group必须要指定,可以不指定--topic,默认为所有主题:
bash
./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group pv
参数解释:
- topic:创建主题名称
- pid:分区编号
- offset:表示该partition已经消费多少条message
- logSize:表示该partition已经写多少条message
- Lag:表示有多少条message没有被消费
- Owner:表示消费者
kafka-run-class.sh脚本调用ConsumerOffsetChecker的main方法,所以也可通过Java代码来访问scala的ConsumerOffsetChecker类:
java
import kafka.tools.ConsumerOffsetChecker;
/**
* ConsumerOffsetChecker能查看到消费者消费的情况, 将信息打印到标准输出流中
*/
public class RunClass {
public static void main(String[] args) {
// group-1是消费者的group名称,可以在zk中
String[] arr = new String[]{"--zookeeper=192.168.199.129:2181,192.168.199.130:2181,192.168.199.131:2181/kafka","--group=group-1"};
ConsumerOffsetChecker.main(arr);
}
}