Kafka性能测试实例
1.概述
在分布式实时数据流场景下,随着数据量的增长,对Kafka集群的性能和稳定性的要求也很高。本篇博客将从生产者和消费者两方面来做性能测试,针对具体的业务和数据量,来调优Kafka集群。
2.内容
2.1 测试环境
本次测试的环境信息由三台物理机组成,具体信息如下所示:
2.2 测试工具
Kafka系统提供了测试工具kafka-producer-perf-test.sh和kafka-consumer-perf-test.sh,通过该工具可以对生产者性能和消费者性能进行测试,获取一组最佳的参数值,进而提升生产者的发送效率和消费者的读取效率。这里如果需要实现带有线程参数功能的工具,可以修改工具源代码,新建一个kafka-producer-perf-test-0.8.sh脚本,实现内容如下:
# 使用老版本的ProducerPerformance工具类
exec $(dirname $)/kafka-run-class.sh kafka.tools.ProducerPerformance "$@"
2.2.1 生产者测试参数
2.2.2 消费者测试参数
3.生产者测试
生产者测试,分别从线程数、分区数、副本数、Broker数、同步与异步模式、批处理大小、消息长度大小、数据压缩等维度来进行。
3.1 线程数
创建一个拥有6个分区、1个副本的Topic,设置不同的线程数并发送相同的数据量,查看性能变化。测试脚本如下:
# 创建主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_producer_perf --partitions --replication-factor # 设置1个线程数
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf --threads --broker-list dn1:, dn2:,
dn3: # 设置10个线程数
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf --threads --broker-list dn1:,
dn2:, dn3: # 设置20个线程数
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf --threads --broker-list dn1:,
dn2:, dn3: # 设置25个线程数
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf --threads --broker-list dn1:,
dn2:, dn3: # 设置30个线程数
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf --threads --broker-list dn1:,
dn2:, dn3:
3.1.1 测试结果
3.1.2 结论
向一个拥有6个分区、1个副本的Topic中,发送500万条消息记录时,随着线程数的增加,每秒发送的消息记录会逐渐增加。在线程数为25时,每秒发送的消息记录达到最佳值,随后再增加线程数,每秒发送的消息记录数反而会减少。
3.2 分区数
(1)新建一个拥有12个分区、1个副本的主题;
(2)新建一个拥有24个分区、1个副本的主题;
(3)向拥有12个分区、1个副本的主题中发送相同数量的消息记录,查看性能变化;
(4)向拥有24个分区、1个副本的主题中发送相同数量的消息记录,查看性能变化。
执行命令如下:
# 创建一个拥有12个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_producer_perf_p12 --partitions
--replication-factor
# 创建一个拥有24个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_producer_perf_p24 --partitions
--replication-factor # 用一个线程发送数据到拥有12个分区的主题中
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_p12 --threads --broker-list dn1:,
dn2:, dn3: # 用一个线程发送数据到拥有24个分区的主题中
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_p24 --threads --broker-list dn1:,
dn2:, dn3:
3.2.1 测试结果
3.2.2 结论
从测试结果来看,分区数越多,单线程生产者的吞吐量越小。
3.3 副本数
(1)创建一个拥有两个副本、6个分区的主题;
(2)创建一个拥有3个副本、6个分区的主题;
(3)向拥有两个副本、6个分区的主题中发送相同数量的消息记录,查看性能变化;
(4)向拥有3个副本、6个分区的主题中发送相同数量的消息记录,查看性能变化;
执行命令如下:
# 创建一个拥有两个副本、6个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_producer_perf_r2 --partitions
--replication-factor # 创建一个拥有3个副本、6个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_producer_perf_r3 --partitions
--replication-factor # 用3个线程发送数据到拥有两个副本的主题中
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_r2 --threads --broker-list dn1:,
dn2:, dn3: # 用3个线程发送数据到拥有3个副本的主题中
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_r3 --threads --broker-list dn1:,
dn2:, dn3:
3.3.1 测试结果
3.3.2 结论
从测试结果来看,副本数越多,吞吐量越小。
3.4 Broker数量
通过增加Broker节点数量来查看性能变化,脚本如下:
# Kafka节点数为4个时,异步发送消息记录
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_b3 --threads --broker-list dn1:,
dn2:, dn3:, dn4: --batch-size --request-timeout-ms
3.4.1 测试结果
3.4.2 结论
从测试结果来看,增加Kafka Broker数量,吞吐量会增加。
3.5 同步与异步模式
分别使用同步和异步模式发送相同数量的消息记录,查看性能变化。执行脚本如下:
# 创建一个有用3个副本、6个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_producer_perf_s2 --partitions
--replication-factor # 使用同步模式发送消息数据
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --sync # 使用异步模式发送消息记录
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3:
3.5.1 测试结果
3.5.2 结论
从测试结果来看,使用异步模式发送消息数据,比使用同步模式发送消息数据,吞吐量是同步模式的3倍左右。
3.6 批处理大小
使用异步模式发送相同数量的消息数据,改变批处理量的大小,查看性能变化,执行脚本如下:
# 以批处理模式发送,大小为1000条
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms # 以批处理模式发送,大小为3000条
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms # 以批处理模式发送,大小为5000条
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms # 以批处理模式发送,大小为7000条
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms
3.6.1 测试结果
3.6.2 结论
从测试的结果来看,发送的消息随着批处理大小增加而增加。当批处理大小增加到3000~5000时,吞吐量达到最佳值。而后再增加批处理大小,吞吐量的性能会下降。
3.7 消息长度的大小
改变消息的长度大小,查看性能变化,执行脚本如下:
# 发送消息,长度为100字节
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms
--message-size # 发送消息,长度为200字节
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms
--message-size # 发送消息,长度为500字节
[hadoop@dn1 ~]$ kafka-producer-perf-test-0.8.sh --messages
--topics test_producer_perf_s2 --threads --broker-list dn1:,
dn2:, dn3: --batch-size --request-timeout-ms
--message-size
3.7.1 测试结果
3.7.2 结论
从测试结果来看,随着消息长度的增加,每秒所能发送的消息数量逐渐减少(nMsg/sec)。但是,每秒发送的消息的总大小(MB/sec),会随着消息长度的增加而增加。
4.消费者测试
消费者测试,可以从线程数、分区数、副本数等维度来进行测试。
4.1 线程数
创建一个拥有6个分区、1个备份的Topic,用不同的线程数读取相同的数据量,查看性能变化。测试脚本如下:
# 创建主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_consumer_perf --partitions --replication-factor # 设置1个线程数
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper
dn1:,dn2:,dn3: --messages --topic test_consumer_perf
--group g1 --threads # 设置3个线程数
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper
dn1:,dn2:,dn3: --messages --topic test_consumer_perf
--group g2 --threads # 设置6个线程数
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper
dn1:,dn2:,dn3: --messages --topic test_consumer_perf
--group g3 --threads
4.1.1 测试结果
4.1.2 结论
随着线程数的增加,每秒读取的消息记录会逐渐增加。在线程数与消费主题的分区相等时,吞吐量达到最佳值。随后,再增加线程数,新增的线程数将会处于空闲状态,对提升消费者程序的吞吐量没有帮助。
4.2 分区数
新建一个Topic,改变它的分区数,读取相同数量的消息记录,查看性能变化,执行脚本如下:
# 创建一个拥有12个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_consumer_perf_p12 --partitions
--replication-factor
# 创建一个拥有24个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: --topic test_consumer_perf_p24 --partitions
--replication-factor # 用一个线程读取数据到拥有12个分区的主题中
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper
dn1:,dn2:,dn3: --messages –topic
test_consumer_perf_p12_--group g2 --threads # 用一个线程读取数据到拥有12个分区的主题中
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper
dn1:,dn2:,dn3: --messages –topic
test_consumer_perf_p24_--group g3 --threads
4.2.1 测试结果
4.2.2 结论
当分区数增加时,如果线程数保持不变,则消费者程序的吞吐量性能会下降。
4.3 副本数
新建Topic,改变Topic的副本数,读取相同数量的消息记录,查看性能变化,执行脚本如下:
# 创建一个有用两个副本、6个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: –topic test_consumer_perf_r2 --partitions
--replication-factor # 创建一个有3个副本、6个分区的主题
[hadoop@dn1 ~]$ kafka-topics.sh --create --zookeeper dn1:, dn2:,
dn3: –topic test_consumer_perf_r3 --partitions
--replication-factor # 用3个线程读取数据到拥有两个副本的主题中
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh –zookeeper dn1:
,dn2:,dn3: --messages –topic
test_consumer_perf_r2_--group g2 --threads # 用3个线程读取数据到拥有3个副本的主题中
[hadoop@dn1 ~]$ kafka-consumer-perf-test.sh --zookeeper dn1:
,dn2:,dn3: --messages –topic
test_consumer_perf_r3_--group g3 --threads
4.3.1 测试结果
4.3.2 结论
副本数对消费者程序的吞吐量影响较小,消费者程序是从Topic的每个分区的Leader上读取数据的,而与副本数无关。
5.总结
Kafka性能测试步骤并不复杂,大家可以根据实际的测试环境、数据量,通过对生产者和消费者不同维度的测试,来获取一组最佳的调优参数值。
6.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
另外,博主出书了《Kafka并不难学》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。
Kafka性能测试实例的更多相关文章
- 【运维技术】kafka三实例集群环境搭建及测试使用
kafka三实例集群环境搭建及测试使用 单机搭建分为两部分:1. 软件安装启动 2. 软件配置 软件安装启动: # 切换到目录 cd /app # 获取kafka最新安装包,这边使用的是镜像地址,可以 ...
- .net core kafka 入门实例 一篇看懂
kafka 相信都有听说过,不管有没有用过,在江湖上可以说是大名鼎鼎,就像天龙八部里的乔峰.国际惯例,先介绍生平事迹 简介 Kafka 是由 Apache软件基金会 开发的一个开源流处理平台, ...
- springboot + kafka 入门实例 入门demo
springboot + kafka 入门实例 入门demo 版本说明 springboot版本:2.3.3.RELEASE kakfa服务端版本:kafka_2.12-2.6.0.tgz zooke ...
- Go语言学习之12 etcd、contex、kafka消费实例、logagent
本节内容: 1. etcd介绍与使用 2. ElastcSearch介绍与使用 1. etcd介绍与使用 概念:高可用的分布式key-value存储,可以使用配置共享和服务发现 ...
- kafka producer实例
1. 定义要发送的消息User POJO package lenmom.kafkaproducer; public class User { public String name; public in ...
- kafka 性能测试脚本
[参考文章]:Kafka自带的性能测试脚本 1. 生产消息压测脚本 1.1 脚本及参数 bin/kafka-producer-perf-test.sh --topic kafka-test-0 -- ...
- kafka java实例
生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...
- 《OD大数据实战》Kafka入门实例
官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...
- JMeter简单的性能测试实例
JMeter基础之——一个简单的性能测试 我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站 ...
随机推荐
- 电梯模拟系统——BUAA OO第二单元作业总结
需求分析 官方需求 本次作业需要模拟一个多线程实时多电梯系统,从标准输入中输入请求信息,程序进行接收和处理,模拟电梯运行,将必要的运行信息通过输出接口进行输出. 本次作业电梯系统具有的功能为:上下行, ...
- PHP常用日期加减计算方法实例
PHP常用日期加减计算方法实例 实例总结了PHP常用日期加减计算方法.分享给大家供大家参考,具体如下: PHP 标准的日期格式 date("Y-m-d H:i:s"); PHP 简 ...
- js判断pc还是移动端
if (!/windows phone|iphone|android/ig.test(window.navigator.userAgent)) { //pc }else{ //h5 }
- Elasticsearch 滚动重启 必读
关键词:elasticsearch , es , 滚动重启 , 禁止分片 由于之前es GC没有怎么调优,结果今天被大量scroll查询查挂了,GC 卡死了.然后为了先恢复给业务使用,也没什么其他办法 ...
- curl命令行请求
curl -H "Content-Type: application/json" -X POST --data 'json post数据' -i http://xxx
- linux下tomcat服务器的启动和关闭以及查看实时打印日志
本页面中的操作都在tomcat的bin目录下 <一> 一般我都是使用: ./shutdom.sh //关闭tomcat ./startup.sh //开启tomcat服务 <二> ...
- Spring源码工程导入Eclsipse缺少两个jar文件
按照<Spring源码深度解析>所述,使用gradle cleanidea eclipse将Spring源码转为eclipse工程后,导入eclipse,最后发现还是缺少spring-cg ...
- EF Core中避免贫血模型的三种行之有效的方法(翻译)
Paul Hiles: 3 ways to avoid an anemic domain model in EF Core 1.引言 在使用ORM中(比如Entity Framework)贫血领域模型 ...
- Java提高篇(一):区分引用变量与对象
我们有代码: New A=new New(); 下面是这个New的类: class New { public New() { System.out.println("这是New类当中的构造方 ...
- SQL 查询当前时间
Mysql: select date_format(now(),'%Y-%m-%d'); Oracle: Oracle中如何获取系统当前时间进行语句的筛选是SQL语句的常见功能 获取系统当前时间dat ...