arm上的kafka测试

arm上的kafka测试

    • [1. 我的任务](#1. 我的任务)
    • [2. 前置知识](#2. 前置知识)
      • [2.1 消息队列](#2.1 消息队列)
      • [2.2 Kafka简介](#2.2 Kafka简介)
    • [3. ARM架构](#3. ARM架构)
      • [3.1 安装**Kafka和Zookeeper**](#3.1 安装Kafka和Zookeeper)
      • [3.2 运行Kafka](#3.2 运行Kafka)
      • [3.3 **性能测试**](#3.3 性能测试)
        • [3.3.1 测试结果](#3.3.1 测试结果)
      • [3.4 功能测试](#3.4 功能测试)
        • [3.4.1 测试结果](#3.4.1 测试结果)
      • [3.5 问题与解决](#3.5 问题与解决)
    • [4. RISC-V架构](#4. RISC-V架构)
      • [4.1 问题](#4.1 问题)
      • [4.2 部分解决](#4.2 部分解决)
    • [5. 实验总结](#5. 实验总结)

1. 我的任务

我的任务是进行大数据组件Kafka在ARM架构Kunpeng 920服务器和RISC-V架构SG2042服务器上的功能支持与性能测试。我完成了Kafka在Kunpeng 920服务器上的性能测试,记录了表格中要求的所有性能数据,并进行了Topic相关的功能测试;然而在RISC-V架构遇见了JDK环境问题导致Kafka无法运行,没有进行性能测试和功能测试。

2. 前置知识

2.1 消息队列

kafka是一个分布式的基于发布/订阅模式的消息队列,我通过阅读博客和实践,重点了解了消息队列概念、Kafka简介和在性能测试中使用到的逻辑概念topic,内容如下:

消息队列就是将需要传输的数据存放在队列中,可用于解耦复杂系统,属于生产者-消费者模型,有以下两种模式:

  1. 点对点模式:每个消息只有一个接收者(Consumer)(即一旦被消费,消息就不再在消息队列中);发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;

  2. 发布/订阅模式:每个消息可以有多个订阅者;发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。为了消费消息,订阅者需要提前 订阅该角色主题,并保持在线运行;

2.2 Kafka简介

我们通常将Apache Kafka用在两类程序:1. 建立实时数据管道,以可靠地在系统或应用程序之间获取数据;2. 构建实时流应用程序,以转换或响应数据流。模型如下:

  1. Producers:可以有很多的应用程序,将消息数据放入到Kafka集群中。

  2. Consumers:可以有很多的应用程序,将消息数据从Kafka集群中拉取出来。

  3. Connectors:Kafka的连接器可以将数据库中的数据导入 到Kafka,也可以将Kafka的数据导出到数据库中。

  4. Stream Processors:流处理器可以Kafka拉取 数据,也可以将数据写入到Kafka中。

Kafka 的 topic 是一个逻辑概念,用于对消息进行分类。在 Kafka 中,消息以流的形式组织,而 topic 就是这些消息流的名称。每个 topic 可以被视为一个消息类别或者消息队列。用途如下:

  1. 消息分类:topic 允许你将消息按照某种特定的类别进行分组。例如,一个公司的 Kafka 集群可能会有多个 topic,分别用于存储用户行为日志、系统监控数据、交易记录等。

  2. 数据持久化:Kafka 是一个持久化的消息系统,存储在 topic 中的消息会保留在磁盘上,直到它们被消费或者超过了设置的保留策略。

  3. 分区:为了能够横向扩展和并行处理,每个 Kafka topic 可以被分割成多个分区(partitions)。分区允许多个生产者和消费者并发地读写数据,提高了系统的吞吐量。

  4. 复制:为了提高数据的可靠性和可用性,每个分区可以被复制到多个 broker 上。Kafka 通过复制因子(replication factor)来定义每个分区的副本数量。

  5. 消费者组:Kafka 支持消费者组(consumer groups)的概念,允许多个消费者实例协调工作,共同消费同一个 topic 中的消息。

  6. 消息顺序:在同一个分区内,Kafka 保证消息的顺序。如果应用需要严格的顺序保证,可以通过单分区或者有序的分区键来实现。

  7. 保留策略:Kafka 允许你设置消息的保留时间或大小,超过这个时间或大小的消息将被删除。这有助于控制存储使用。

  8. 创建和删除:你可以使用 Kafka 提供的命令行工具或 API 来创建和删除 topic。

  9. 配置:topic 可以有自己的配置,如保留时间、清理策略、最小和最大消息大小等。

3. ARM架构

3.1 安装Kafka和Zookeeper

  1. 安装与解压
shell 复制代码
wget https://archive.apache.org/dist/kafka/2.2.0/kafka_2.12-2.2.0.tgz
tar -zxvf kafka_2.12-2.2.0.tgz
#openjdk使用的毕昇自带的8u412
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz
  1. 在~/.bash_profile中添加环境变量
shell 复制代码
export KAFKA_HOME=~/kafka_2.12-2.2.0
export PATH=$KAFKA_HOME/bin:$PATH
export ZOOKEEPER_HOME=~/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$PATH
  1. 配置config/server.properties,修改的内容如下

3.2 运行Kafka

  1. 先启动Zookeeper:bin/zookeeper-server-start.sh config/zookeeper.properties

  2. 然后启动Kafka服务:bin/kafka-server-start.sh config/server.properties

  1. 测试是否成功启动:在服务器上打开一个生产者,然后把输入的每行数据发送到Kafka中,再打开一个消费者,当有数据往Kafka的test主题发送消息,这边就会进行消费。

    shell 复制代码
    bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
    #后面光标提示数据数据,然后回车就会发送到kafka中了
    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

3.3 性能测试

参考教程

  1. 创建topic:创建名为test-rep-one,分区为6,复制因子为1的主题。数据的保留时间为1小时。

    bash 复制代码
    $ bin/kafka-topics.sh \
    --create \
    --topic test-rep-one \
    --partitions 6 \
    --replication-factor 1 \
    --config retention.ms=86400000 \
    --bootstrap-server localhost:9092
  2. 使用不同的生产者性能测试脚本。以下示例将使用上面创建的主题来存储300万条数据,每条消息的大小为1KB。-throughput设为-1时表示消息会尽快生成。

    bash 复制代码
    $ bin/kafka-producer-perf-test.sh \
    --topic test-rep-one \
    --throughput -1 \
    --num-records 3000000 \
    --record-size 1024 \
    --producer-props acks=all bootstrap.servers=localhost:9092
  3. 测试消费者性能。

    bash 复制代码
    $ bin/kafka-consumer-perf-test.sh \
    --topic test-rep-one \
    --broker-list localhost:9092 \
    --messages 3000000
  1. 加入公共指标:对于kafka-producer-perf-test.sh和kafka-consumer-perf-test.sh,将第2、3步的命令添加在脚本后即可;而对于kafka-topics.sh,我选择了列举topics的命令进行测试:performance_counter_920.sh "bin/kafka-topics.sh --list --bootstrap-server localhost:9092" ./。因为每次测试的结果都不同,我未记录第2、3步中的结果,公共和非公共性能指标均记录自本次结果,运行截图如下:

    1. kafka-topics.sh

    2. kafka-producer-perf-test.sh

    3. kafka-consumer-perf-test.sh

因为组长在bash_profile配了这个,所以系统 会在该路径找sh脚本,就无需进入performance目录下执行了

3.3.1 测试结果
比较类目 CPU ARM(鲲鹏920-7260)
kafka-topics.sh duration_time 1780170866
kafka-topics.sh task-clock 3267.100
kafka-topics.sh cycles 7202976617
kafka-topics.sh instructions 7892467747
kafka-topics.sh cache-references 2260246244
kafka-topics.sh cache-misses 35076202
kafka-topics.sh branches <not
kafka-topics.sh branch-misses 55787680
kafka-topics.sh L1-dcache-loads 2260246244
kafka-topics.sh L1-dcache-load-misses 35076202
kafka-topics.sh LLC load misses 1992446
kafka-topics.sh LLC load 31061877
kafka-topics.sh IPC 1.095
kafka-producer-perf-test.sh duration_time 20618526199
kafka-producer-perf-test.sh task-clock 65506.01
kafka-producer-perf-test.sh cycles 150698855761
kafka-producer-perf-test.sh instructions 151115983122
kafka-producer-perf-test.sh cache-references 40041625736
kafka-producer-perf-test.sh cache-misses 590104492
kafka-producer-perf-test.sh branches <not
kafka-producer-perf-test.sh branch-misses 373990050
kafka-producer-perf-test.sh L1-dcache-loads 40041625736
kafka-producer-perf-test.sh L1-dcache-load-misses 590104492
kafka-producer-perf-test.sh LLC load misses 146267539
kafka-producer-perf-test.sh LLC load 482275224
kafka-producer-perf-test.sh IPC 1.002
kafka-producer-perf-test.sh records sent 3000000 records sent
kafka-producer-perf-test.sh average throughput 155771.327691 records/sec
kafka-producer-perf-test.sh throughput rate 152.12MB/sec
kafka-producer-perf-test.sh avg latency 191.20ms
kafka-producer-perf-test.sh max latency 350.00ms
kafka-producer-perf-test.sh 50th latency 182ms
kafka-producer-perf-test.sh 95th latency 272ms
kafka-producer-perf-test.sh 99th latency 316ms
kafka-producer-perf-test.sh 99.9th latency 348ms
kafka-consumer-perf-test.sh duration_time 8571797759
kafka-consumer-perf-test.sh task-clock 36013.13
kafka-consumer-perf-test.sh cycles 78698107896
kafka-consumer-perf-test.sh instructions 45077685143
kafka-consumer-perf-test.sh cache-references 13658220619
kafka-consumer-perf-test.sh cache-misses 26480514
kafka-consumer-perf-test.sh branches <not
kafka-consumer-perf-test.sh branch-misses 235871806
kafka-consumer-perf-test.sh L1-dcache-loads 13658220619
kafka-consumer-perf-test.sh L1-dcache-load-misses 264580514
kafka-consumer-perf-test.sh LLC load misses 59076086
kafka-consumer-perf-test.sh LLC load 300456781
kafka-consumer-perf-test.sh IPC 0.572
kafka-consumer-perf-test.sh average throughput 428877.7698 records/sec
kafka-consumer-perf-test.sh throughput rate 418.8259MB/sec

3.4 功能测试

因为时间的原因,我只测试了topic相关的部分功能,运行截图如下:

3.4.1 测试结果
CPU功能测试项 introduction note command PASS ARM-result
topics
topics alter 修改topic 修改分区数时,仅能增加分区个数。若是用其减少 partition 个数,则会报错 bin/kafka-topics.sh --alter --bootstrap-server localhost:9092 --topic test-rep-one --partitions 8 Y 没有返回值,则说明修改成功
topics config 创建topic的覆盖配置 bin/kafka-topics.sh --create --topic test-rep-one --partitions 6 --replication-factor 1 --config retention.ms=86400000 --bootstrap-server localhost:9092 Y
topics create 创建topic bin/kafka-topics.sh --create --topic test-rep-one --partitions 6 --replication-factor 1 --config retention.ms=86400000 --bootstrap-server localhost:9092 Y 没有返回值,则说明创建成功
topics delete 删除topic bin/kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic test-rep-two Y 没有返回值,则说明删除成功
topics delete-config 删除topic的覆盖配置 bin/kafka-topics.sh --zookeeper localhost:9092 --alter --topic test-rep-one --delete-config retention.ms Y
topics describe 查看指定topic明细 bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test-rep-one Y Topic:test-rep-one PartitionCount:6 ReplicationFactor:1 Configs:segment.bytes=1073741824,retention.ms=86400000 Topic: test-rep-one Partition: 0 Leader: 1 Replicas: 1 Isr: 1 Topic: test-rep-one Partition: 1 Leader: 1 Replicas: 1 Isr: 1 Topic: test-rep-one Partition: 2 Leader: 1 Replicas: 1 Isr: 1 Topic: test-rep-one Partition: 3 Leader: 1 Replicas: 1 Isr: 1 Topic: test-rep-one Partition: 4 Leader: 1 Replicas: 1 Isr: 1 Topic: test-rep-one Partition: 5 Leader: 1 Replicas: 1 Isr: 1
topics help 显示kafka-topics.sh的帮助信息 bin/kafka-topics.sh --help Y 太长了,为了格式已删除
topics list 查看 Topic 列表 bin/kafka-topics.sh --list --bootstrap-server localhost:9092 Y __consumer_offsets test test-rep-one
topics partitions 指定分区数 bin/kafka-topics.sh --create --topic test-rep-one --partitions 6 --replication-factor 1 --config retention.ms=86400000 --bootstrap-server localhost:9092 Y 没有返回值,则说明创建成功
topics replica-assignment
topics replication-factor 指定复制因子 bin/kafka-topics.sh --create --topic test-rep-one --partitions 6 --replication-factor 1 --config retention.ms=86400000 --bootstrap-server localhost:9092 Y 没有返回值,则说明创建成功
topics topic
topics topics-with-overrides
topics unavailable-partitions
topics under-replicated-partitions
topics zookeeper bin/kafka-topics.sh --zookeeper localhost:9092 --alter --topic test-rep-one --delete-config retention.ms Y

3.5 问题与解决

  1. 安装完kafka集群后,程序创建topic时报错could not be established. Broker may not be available:https://www.cnblogs.com/charkey/p/16143422.html

  2. kafka启动出错:原因是没有杀死进程https://blog.csdn.net/qq_38612955/article/details/81206284

4. RISC-V架构

4.1 问题

环境配置上除了config/server.properties中的IP地址不同,其他都一样。

在运行时首先遇见了"egrep is obsolescent using grep -e"的报错信息,将kafka-run-class.sh中的egrep替换成了grep -E后解决。

然后就一直有cannot execute binary file: Exec format error的报错,使用su root无法解决。应该是使用了其他架构编译好的二进制包的问题,试图下载gradle编译源代码,发现gradle也有环境不兼容的问题。可以看到是因为RV上的jdk环境有问题。

发现虽然有自带的jdk环境,但是使用不了:

试图安装欧拉镜像的jdk,然后替换环境变量,但是安装rpm有问题,最后失败,未配置好Kafka环境。

4.2 部分解决

4.1 问题与解决

  1. rv环境下用不了ls等命令:直接执行:export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

  2. 使用grep查找文件内容,定位问题:

5. 实验总结

我的心得是在不同架构下部署同一框架是困难的,不同指令集与体系架构都有不同的特性,这也是做对比实验的意义所在。

我的不足是对RISC-V环境下软件的部署与运行依然较陌生,比如交叉编译;以及时间管理有问题,导致功能测试只做了一小部分,也没有写自动化脚本。

TODO:以后学习shell自动化脚本编写,可参考https://gitee.com/LearningEulixOS/pages/tree/main/src/content/posts/2024-01

相关推荐
huaqianzkh29 分钟前
了解Hadoop:大数据处理的核心框架
大数据·hadoop·分布式
jlting1951 小时前
Kafka--关于broker的夺命连环问
分布式·kafka
菜菜-plus2 小时前
分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign
java·分布式·微服务·nacos·gateway·springcloud·openfeign
好奇的菜鸟3 小时前
RabbitMQ 通道(Channel)详解:方法使用、消息确认与拒绝
分布式·rabbitmq
黄小耶@3 小时前
python如何使用Rabbitmq
分布式·后端·python·rabbitmq
超级无敌暴龙战士(solider)3 小时前
如何保证RabbitMQ的可靠性传输
分布式·rabbitmq
烬奇小云5 小时前
使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行,并实现多个钩子(hook)来监控代码执行、系统调用和内存读写操作(二)
java·arm开发·python
东方巴黎~Sunsiny11 小时前
当kafka消费的数据滞后1000条时,打印告警信息
分布式·kafka·linq
东方巴黎~Sunsiny12 小时前
⚙️ 如何调整重试策略以适应不同的业务需求?
java·数据库·kafka
sj116373940312 小时前
Kafka新节点加入集群操作指南
分布式·kafka