1.前期准备:
(1)首先先从我给的百度网盘链接上面获取到这个资料
通过百度网盘分享的文件:lab2-data.zip
链接:https://pan.baidu.com/s/1viTre9oIVEyCJashhSPUjw?pwd=2586
提取码:2586
lab2-data.zip中有老师给的两个csv文件,这两个文件之后要上传到虚拟机上面。
(2)同时,确保已经安装好docker和docker-compose,最好zookeeper也已经搭建过,
如果这几项任务还没有完成的话,可以去看看我之前的文章:
在linux虚拟机上面配置Docker时所踩过的坑-CSDN博客
基于docker-compose来搭建zookeeper集群-CSDN博客
(3)最好把Finalshell也下载好,具体下载教程详见如下文章:
保姆级教程下载finalshell以及连接云服务器基础的使用教程_finalshell下载安装-CSDN博客
2.开始搭建kafka集群
(1)首先打开虚拟机(如node2)和Finalshell,然后使用Finalshell连接上虚拟机,同时为node2打开两个页面,如下图所示:
(2)在node2的第一个窗口,依次输入以下代码:
# 启动 Docker 服务
systemctl start docker
# 拉取 Bitnami Kafka 版本为 3.6.1 的镜像
docker pull bitnami/kafka:3.6.1
# 创建 Kafka1 的数据存储目录
mkdir -p /export/server/dockerkafka/kafka1
# 创建 Kafka2 的数据存储目录
mkdir -p /export/server/dockerkafka/kafka2
# 创建 Kafka3 的数据存储目录
mkdir -p /export/server/dockerkafka/kafka3
# 进入 Kafka1 的目录
cd /export/server/dockerkafka/kafka1
[root@node2 ~]# systemctl start docker
[root@node2 ~]# docker pull bitnami/kafka:3.6.1
3.6.1: Pulling from bitnami/kafka
cb2854289c03: Pull complete
Digest: sha256:9f05290493ab7f6e7a9b37bd8f2ea22ce0a1a78ebfe14f136ec38eb9fcfcb7dd
Status: Downloaded newer image for bitnami/kafka:3.6.1
docker.io/bitnami/kafka:3.6.1
[root@node2 ~]# mkdir -p /export/server/dockerkafka/kafka1
[root@node2 ~]# mkdir -p /export/server/dockerkafka/kafka2
[root@node2 ~]# mkdir -p /export/server/dockerkafka/kafka3
[root@node2 ~]# cd /export/server/dockerkafka/kafka1
(3)接着输入两次rz命令来上传两个csv文件到当前的kafka1的目录下
[root@node2 kafka1]# rz
[root@node2 kafka1]# rz
[root@node2 kafka1]# ls
stock-part1.csv stock-part2.csv
如上述代码所示,显然已经上传成功了,接着我们要把这两个csv的格式修改为utf-8。
# 使用 iconv 工具将文件从 gb18030 编码转换为 utf-8 编码,并忽略无法转换的字符
# -f gb18030: 指定源文件的编码是 gb18030
# -t utf-8: 指定目标编码是 utf-8
# //IGNORE: 忽略无法转换的字符(不报错,直接跳过这些字符)
执行一下这两行代码:
iconv -f gb18030 -t utf-8//IGNORE /export/server/dockerkafka/kafka1/stock-part1.csv > /export/server/dockerkafka/kafka1/stock-part10.csv
iconv -f gb18030 -t utf-8//IGNORE /export/server/dockerkafka/kafka1/stock-part2.csv > /export/server/dockerkafka/kafka1/stock-part20.csv
然后使用head命令检查一下
[root@node2 kafka1]# head -n 5 stock-part20.csv
time,stock_code,stock_name,price,trade_volume,trade_type,trade_place,trade_platform,industry_type
2023-11-14 10:35:14,261858,股票1,4.564377630724546,6700,买入,上海市,长城证券,综合
2023-11-14 10:35:14,261858,股票1,4.564377630724546,2200,卖出,广东省,银河证券,综合
2023-11-14 10:35:14,261858,股票1,4.564377630724546,3600,卖出,上海市,通达信,综合
2023-11-14 10:35:14,378187,股票5,3.6943814059570523,2000,卖出,河南省,通达信,农林牧渔业
[root@node2 kafka1]# head -n 5 stock-part10.csv
time,stock_code,stock_name,price,trade_volume,trade_type,trade_place,trade_platform,industry_type
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,3100,卖出,云南省,通达信,综合
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,1300,买入,湖北省,国泰君安证券,综合
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,4700,卖出,黑龙江省,同花顺,综合
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,4600,卖出,上海市,国泰君安证券,综合
[root@node2 kafka1]#
(4)配置kafka.yml文件
注意:
修改宿主机ip(要改3次,就是有三个地方要改)
192.168.88.102改为读者自己的主机IP(比如我这里是node2的,因为我的kafka集群是搭建在node2上面的)
就是这里面的主机IP(我已经标红了),kafka1,kafka2,kafka3 都要修改为自己的IP
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.88.102:19092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.88.102:29092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.88.102:39092
可以先复制我的配置文件然后到时候再修改,至于挂载路径不用改,只要你之前按照我上面的代码把目录创建好了就行。
首先执行如下代码
[root@node2 kafka1]# cd /export/server
[root@node2 server]# vim kafka.yml
接着将以下配置文件代码先复制到一个空的文本文档,然后将三个kafka的主机IP修改后,就可以复制到 kafka.yml 里面去了,记得按 “i”键进入插入模式,再鼠标右键选择粘贴,接着点击“esc”键退出插入模式,然后输入“:wq”保存并且退出。
version: "3.6"
services:
kafka1:
container_name: kafka1
image: 'bitnami/kafka:3.6.1'
user: root
ports:
- '19092:9092'
- '19093:9093'
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.88.102:19092
- KAFKA_CFG_NODE_ID=1
- KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI
- [email protected]:9093,[email protected]:9093,[email protected]:9093
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
volumes:
- /export/server/dockerkafka/kafka1:/bitnami/kafka:rw
networks:
netkafka:
ipv4_address: 172.23.0.11
kafka2:
container_name: kafka2
image: 'bitnami/kafka:3.6.1'
user: root
ports:
- '29092:9092'
- '29093:9093'
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.88.102:29092
- KAFKA_CFG_NODE_ID=2
- KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI
- [email protected]:9093,[email protected]:9093,[email protected]:9093
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
volumes:
- /export/server/dockerkafka/kafka2:/bitnami/kafka:rw
networks:
netkafka:
ipv4_address: 172.23.0.12
kafka3:
container_name: kafka3
image: 'bitnami/kafka:3.6.1'
user: root
ports:
- '39092:9092'
- '39093:9093'
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.88.102:39092
- KAFKA_CFG_NODE_ID=3
- KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI
- [email protected]:9093,[email protected]:9093,[email protected]:9093
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
volumes:
- /export/server/dockerkafka/kafka3:/bitnami/kafka:rw
networks:
netkafka:
ipv4_address: 172.23.0.13
networks:
netkafka:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.23.0.0/25
gateway: 172.23.0.1
(5)启动kafka集群
启动docker(如果docker还没有启动的话)
systemctl start docker
有注释版本:
# 切换到指定目录 /export/server
# 该目录通常包含 Docker Compose 配置文件 kafka.yml
cd /export/server
# 使用 docker-compose 启动 Docker 容器,基于 kafka.yml 配置文件
# -f kafka.yml: 指定要使用的 Docker Compose 配置文件(kafka.yml)
# up: 启动所有在 kafka.yml 中定义的服务
# -d: 以后台模式启动容器(即不阻塞终端,容器在后台运行)
docker-compose -f kafka.yml up -d
# 显示当前正在运行的 Docker 容器的列表
# docker ps: 列出所有正在运行的容器信息,包括容器ID、镜像、状态等
docker ps
无注释版本
cd /export/server
docker-compose -f kafka.yml up -d
docker ps
效果如下
[root@node2 server]# cd /export/server/
[root@node2 server]# docker-compose -f kafka.yml up -d
/usr/local/lib/python3.6/site-packages/paramiko/transport.py:32: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
from cryptography.hazmat.backends import default_backend
Creating network "server_netkafka" with driver "bridge"
Creating kafka3 ... done
Creating kafka2 ... done
Creating kafka1 ... done
[root@node2 server]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6476e53970b bitnami/kafka:3.6.1 "/opt/bitnami/script…" 8 seconds ago Up 3 seconds 0.0.0.0:39092->9092/tcp, :::39092->9092/tcp, 0.0.0.0:39093->9093/tcp, :::39093->9093/tcp kafka3
0f11ce74c681 bitnami/kafka:3.6.1 "/opt/bitnami/script…" 8 seconds ago Up 3 seconds 0.0.0.0:19092->9092/tcp, :::19092->9092/tcp, 0.0.0.0:19093->9093/tcp, :::19093->9093/tcp kafka1
41d3910fe6c9 bitnami/kafka:3.6.1 "/opt/bitnami/script…" 8 seconds ago Up 4 seconds 0.0.0.0:29092->9092/tcp, :::29092->9092/tcp, 0.0.0.0:29093->9093/tcp, :::29093->9093/tcp kafka2
[root@node2 server]#
到这里kafka集群算是成功启动了,下面是对 Kafka 案例-生产者、消费者 的探索。
3.对 Kafka 案例-生产者、消费者 的探索
(1)还是在node2的第一个窗口,依次输入以下命令
# 进入名为 kafka1 的容器并启动交互式终端
# -i: 启动交互式会话
# -t: 分配一个伪终端(tty),确保能够输入命令
docker exec -it kafka1 /bin/bash
# 切换到 Kafka 安装目录下的 bin 目录
# 这个目录通常包含 Kafka 的各种脚本工具,例如 kafka-topics.sh
cd /opt/bitnami/kafka/bin
# 使用 kafka-topics.sh 脚本创建一个新的 Kafka topic 名为 "foo"
# --create: 创建一个新 topic
# --topic foo: 指定 topic 的名称为 "foo"
# --partitions 5: 设置 topic 的分区数为 5
# --replication-factor 3: 设置副本因子为 3,意味着每个分区会有 3 个副本
# --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092: 指定 Kafka 集群的 broker 地址
./kafka-topics.sh --create --topic foo --partitions 5 --replication-factor 3 --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
# 使用 kafka-topics.sh 脚本来查看并描述已创建的 topic "foo"
# --describe: 显示指定 topic 的详细信息
# --topic foo: 指定要查看的 topic 名称为 "foo"
# --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092: 指定 Kafka 集群的 broker 地址
./kafka-topics.sh --describe --topic foo --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
后两个命令比较长,为了方便复制,单独写出来
# 使用 kafka-topics.sh 脚本创建一个新的 Kafka topic 名为 "foo"
./kafka-topics.sh --create --topic foo --partitions 5 --replication-factor 3 --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
# 使用 kafka-topics.sh 脚本来查看并描述已创建的 topic "foo"
./kafka-topics.sh --describe --topic foo --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
效果如下
[root@node2 server]# docker exec -it kafka1 /bin/bash
root@0f11ce74c681:/# cd /opt/bitnami/kafka/bin
root@0f11ce74c681:/opt/bitnami/kafka/bin# ./kafka-topics.sh --create --topic foo --partitions 5 --replication-factor 3 --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
Created topic foo.
root@0f11ce74c681:/opt/bitnami/kafka/bin# ./kafka-topics.sh --describe --topic foo --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092
Topic: foo TopicId: nE7m123PQYqgXy8B5u4RgQ PartitionCount: 5 ReplicationFactor: 3 Configs:
Topic: foo Partition: 0 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Topic: foo Partition: 1 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: foo Partition: 2 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
Topic: foo Partition: 3 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: foo Partition: 4 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
root@0f11ce74c681:/opt/bitnami/kafka/bin#
(2)接着还是在node2的第一个窗口,输入以下命令来创建生产者(此时仍然在这个目录root@0f11ce74c681:/opt/bitnami/kafka/bin# )
在这个目录root@0f11ce74c681:/opt/bitnami/kafka/bin# 输入以下命令来创建生产者
kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
上述代码注释如下:
# 使用 kafka-console-producer.sh 脚本将消息发送到 Kafka 的 "foo" topic
# --broker-list: 指定 Kafka 集群中一个或多个 broker 的地址
# 这里列出了三个 Kafka broker 的地址,分别是 172.23.0.11:9092, 172.23.0.12:9092 和 172.23.0.13:9092
# --topic foo: 指定要发送消息的 Kafka topic 名称为 "foo"
# 该命令启动了一个生产者进程,等待用户输入消息,并将这些消息发送到指定的 Kafka topic(foo)
效果如下
root@0f11ce74c681:/opt/bitnami/kafka/bin# kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
>
如上图所示,生产者已经创建成功。
(3)在node2的第二个窗口,输入以下命令来创建消费者
# 进入名为 kafka2 的容器并启动交互式终端
# -i: 启动交互式会话
# -t: 分配一个伪终端(tty),确保能够输入命令
docker exec -it kafka2 /bin/bash
# 切换到 Kafka 安装目录下的 bin 目录
# 这个目录通常包含 Kafka 的各种脚本工具,例如 kafka-console-consumer.sh
cd /opt/bitnami/kafka/bin
# 使用 kafka-console-consumer.sh 脚本从 Kafka 中的 "foo" topic 中消费消息
# --bootstrap-server: 指定 Kafka 集群的一个或多个 broker 地址,用于连接到 Kafka 集群
# 这里列出了三个 Kafka broker 的地址,分别是 172.23.0.11:9092, 172.23.0.12:9092 和 172.23.0.13:9092
# --topic foo: 指定要消费消息的 Kafka topic 名称为 "foo"
# 该命令启动了一个消费者进程,实时消费并显示 "foo" topic 中的消息
kafka-console-consumer.sh --bootstrap-server 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
最后1个命令比较长,为了方便复制,单独写出来
# 该命令启动了一个消费者进程,实时消费并显示 "foo" topic 中的消息
kafka-console-consumer.sh --bootstrap-server 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
效果如下(记住,这是在node2的第二个窗口)
[root@node2 ~]# docker exec -it kafka2 /bin/bash
root@41d3910fe6c9:/# cd /opt/bitnami/kafka/bin
root@41d3910fe6c9:/opt/bitnami/kafka/bin# kafka-console-consumer.sh --bootstrap-server 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
记得在输入创建消费者的命令后要等一会儿(十几秒左右),再进行下面第四步。
(4)先在生产者那里(在node2的第一个窗口)依次输入以下一些信息,效果如下
root@0f11ce74c681:/opt/bitnami/kafka/bin# kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
>Hello Kafka!
>This is a test message.
>Another message.
>ni
>你好,kafka
>熊老师很帅!
>
(5)接着在消费者那里(在node2的第二个窗口)查看是否收到了这些信息,效果如下
root@41d3910fe6c9:/opt/bitnami/kafka/bin# kafka-console-consumer.sh --bootstrap-server 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
Hello Kafka!
This is a test message.
Another message.
ni
你好,kafka
熊老师很帅!
显然信息是收到了的。
(6)先在生产者那里(在node2的第一个窗口)输入ctrl+C,来终止生产者进程,回到bin目录,接着依次输入以下代码
head -n 5 /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
上述代码注释如下:
# 使用 head 命令获取 /bitnami/kafka/stock-part10.csv 文件中的前 5 行,并将这些行传递给 kafka-console-producer.sh 命令
# head -n 5: 从文件 /bitnami/kafka/stock-part10.csv 中读取前 5 行内容
# --broker-list: 指定 Kafka 集群中一个或多个 broker 的地址,用于连接到 Kafka 集群
# 这里列出了三个 Kafka broker 的地址,分别是 172.23.0.11:9092, 172.23.0.12:9092 和 172.23.0.13:9092
# --topic foo: 指定将要发送消息的 Kafka topic 名称为 "foo"
head -n 5 /bitnami/kafka/stock-part20.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
上述代码注释如下:
# 使用 head 命令获取 /bitnami/kafka/stock-part20.csv 文件中的前 5 行,并将这些行传递给 kafka-console-producer.sh 命令
# head -n 5: 从文件 /bitnami/kafka/stock-part20.csv 中读取前 5 行内容
# --broker-list: 指定 Kafka 集群中一个或多个 broker 的地址,用于连接到 Kafka 集群
# 这里列出了三个 Kafka broker 的地址,分别是 172.23.0.11:9092, 172.23.0.12:9092 和 172.23.0.13:9092
# --topic foo: 指定将要发送消息的 Kafka topic 名称为 "foo"
效果如下
root@0f11ce74c681:/opt/bitnami/kafka/bin# head -n 5 /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
root@0f11ce74c681:/opt/bitnami/kafka/bin# head -n 5 /bitnami/kafka/stock-part20.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
root@0f11ce74c681:/opt/bitnami/kafka/bin#
当然也可以试试查看更多的数据
head -n 1000 /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
cat /bitnami/kafka/stock-part10.csv | kafka-console-producer.sh --broker-list 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
(7)接着在消费者那里(在node2的第二个窗口)查看是否收到了这些信息,效果如下
root@41d3910fe6c9:/opt/bitnami/kafka/bin# kafka-console-consumer.sh --bootstrap-server 172.23.0.11:9092,172.23.0.12:9092,172.23.0.13:9092 --topic foo
Hello Kafka!
This is a test message.
Another message.
ni
你好,kafka
熊老师很帅!
quit(这个quit是之前在生产者那里不小心输进去的)
time,stock_code,stock_name,price,trade_volume,trade_type,trade_place,trade_platform,industry_type
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,3100,卖出,云南省,通达信,综合
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,1300,买入,湖北省,国泰君安证券,综合
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,4700,卖出,黑龙江省,同花顺,综合
2023-11-14 10:35:14,429947,股票6,3.3566089655441576,4600,卖出,上海市,国泰君安证券,综合
time,stock_code,stock_name,price,trade_volume,trade_type,trade_place,trade_platform,industry_type
2023-11-14 10:35:14,261858,股票1,4.564377630724546,6700,买入,上海市,长城证券,综合
2023-11-14 10:35:14,261858,股票1,4.564377630724546,2200,卖出,广东省,银河证券,综合
2023-11-14 10:35:14,261858,股票1,4.564377630724546,3600,卖出,上海市,通达信,综合
2023-11-14 10:35:14,378187,股票5,3.6943814059570523,2000,卖出,河南省,通达信,农林牧渔业
显然信息是收到了的。
4.总结:
至此,本文已经基本完成。感谢您耐心阅读并关注本篇内容。希望通过本文,您对 Kafka 数据流传输的基本操作和相关命令有了更加清晰的理解。如果您有任何疑问或进一步的问题,欢迎随时交流。
再次感谢您的阅读,祝您工作顺利,学习进步!