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性能测试实例的更多相关文章

  1. 【运维技术】kafka三实例集群环境搭建及测试使用

    kafka三实例集群环境搭建及测试使用 单机搭建分为两部分:1. 软件安装启动 2. 软件配置 软件安装启动: # 切换到目录 cd /app # 获取kafka最新安装包,这边使用的是镜像地址,可以 ...

  2. .net core kafka 入门实例 一篇看懂

      kafka 相信都有听说过,不管有没有用过,在江湖上可以说是大名鼎鼎,就像天龙八部里的乔峰.国际惯例,先介绍生平事迹   简介 Kafka 是由 Apache软件基金会 开发的一个开源流处理平台, ...

  3. springboot + kafka 入门实例 入门demo

    springboot + kafka 入门实例 入门demo 版本说明 springboot版本:2.3.3.RELEASE kakfa服务端版本:kafka_2.12-2.6.0.tgz zooke ...

  4. Go语言学习之12 etcd、contex、kafka消费实例、logagent

    本节内容:    1. etcd介绍与使用    2. ElastcSearch介绍与使用 1. etcd介绍与使用    概念:高可用的分布式key-value存储,可以使用配置共享和服务发现    ...

  5. kafka producer实例

    1. 定义要发送的消息User POJO package lenmom.kafkaproducer; public class User { public String name; public in ...

  6. kafka 性能测试脚本

    [参考文章]:Kafka自带的性能测试脚本 1. 生产消息压测脚本 1.1 脚本及参数 bin/kafka-producer-perf-test.sh  --topic kafka-test-0 -- ...

  7. kafka java实例

    生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...

  8. 《OD大数据实战》Kafka入门实例

    官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...

  9. JMeter简单的性能测试实例

    JMeter基础之——一个简单的性能测试 我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站 ...

随机推荐

  1. scrapy递归解析和post请求

    递归解析 递归爬取解析多页页面数据 每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析. 实现方案: 1.将每一个页码 ...

  2. 动态规划——Frog Jump

    题目大意就是,给定一个数组,数组中数字从小到大排列,第一个元素一定是0,青蛙的初始位置就在0,后面依次从小到大排列,表示第几个石子,青蛙只有跳到最后一个石子上才算成功过河,而且青蛙第一次从0位置只能跳 ...

  3. tar解压到指定目录

    对于tar.gz的压缩包,压缩参数是tar xvzf 指定解压路径为/tmp则为: tar xzvf xxx.tar.gz -C /tmp 注意/文件夹必须存在.

  4. Do-Now—团队冲刺博客三

    Do-Now-团队 冲刺博客三 作者:仇夏 前言 不知不觉我们的项目已经做了三个多礼拜了,团队冲刺博客也写到了这第三篇,看着一个基本成型的APP安装在自己的手机上,一种喜悦感油然而生.好了,现在来看看 ...

  5. VB读写进程的内存

    在窗体部分简单测试了ReadProcessMemory和WriteProcessMemory对另一个程序进程的读写. 由于临时项目变动,又不需要了,所以直接封类,删工程.以下代码没有一个函数经过测试, ...

  6. Mem系列函数介绍及案例实现

      昨天导师甩给我们一个项目案例,让我们自己去看一看熟悉一下项目内容,我看到了这个项目里面大量使用memset(sBuf,0,sizeof(sBuf));这一块内存填充的代码,于是回想起以前查过Mem ...

  7. 反沙箱——SetErrorMode

    目录 1.前言 2.原理讲解 3.代码实现 4.参考 1.前言 利用SetErrorMode进行反沙箱的技术,在2010年就有被提出,但是之前搜了很久都没有相关内容,这里简单的说一下这个反沙箱的实现. ...

  8. java课程之团队开发冲刺阶段1.7

    一.总结昨天进度 1.昨天学习了对数据库增删改查的基本操作,并且可以使用代码实现操作 二.遇到的问题 1.由于是学习阶段,没有遇到太大阻碍,但是最终需要实现的是联网进行数据库的读写或者是对本地数据库的 ...

  9. Java使用BufferedImage修改图片内容

    1.修改图片的架包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io& ...

  10. CentOS 5.9裸机编译安装搭建LAMP

    Linux系统:CentOS 5.9,查看CentOS版本,命令如下: [root@localhost /]# cat /etc/redhat-release CentOS release 5.9 ( ...