一、下载镜像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
二、先启动zookeeper
#单机方式
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
三、启动kafka
#单机方式
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.43.110:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.43.110:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
-e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
-e KAFKA_ZOOKEEPER_CONNECT=10.9.44.11:2181 /kafka 配置zookeeper管理kafka的路径10.9.44.11:2181/kafka
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.9.44.11:9092 把kafka的地址端口注册给zookeeper
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
-v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间
————————————————
四、创建一个topic(使用代码次步可省略)
#进入容器
docker exec -it kafka /bin/bash ----->docker exec -it 10b83334f181 /bin/sh
cd /opt/kafka_2.13-2.7.1/bin
#单机方式:创建一个主题
kafka-topics.sh --create --zookeeper 192.168.43.110:2181 --replication-factor 1 --partitions 1 --topic mykafka
查询主题列表
kafka-topics.sh --list --zookeeper 192.168.43.110:2181
主题描述
kafka-topics.sh --describe --zookeeper 192.168.43.110:2181 --topic mykafka
删除主题
kafka-topics.sh --delete --zookeeper 192.168.43.110:2181 --topic topicname
#运行一个生产者
kafka-console-producer.sh --broker-list 192.168.43.110:9092 --topic mykafka
kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic mykafka --from-beginn
ing
#运行一个消费者
kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic mykafka --from-beginn
ing
五、kafka设置分区数量
#分区数量的作用:有多少分区就能负载多少个消费者,生产者会自动分配给分区数据,每个消费者只消费自己分区的数据,每个分区有自己独立的offset
#进入kafka容器
vi /opt/kafka/config/server.properties
修改run.partitions=2
#退出容器
ctrl+p+q
#重启容器
docker restart kafka
#修改指定topic
kafka-topics.sh --zookeeper 192.168.43.110:2181 --alter --partitions 3 --topic mykafka2
以上是单个服务kafka
https://www.cnblogs.com/angelyan/p/14445710.html 参考
六、集群
准备配置文件 如果不是docker安装的配置
[root@along kafka_2.11-2.1.0]# cd /data/kafka_2.11-2.1.0/
[root@along kafka_2.11-2.1.0]# cp config/server.properties config/server-1.properties
[root@along kafka_2.11-2.1.0]# cp config/server.properties config/server-2.properties
[root@along kafka_2.11-2.1.0]# vim config/server-1.properties
broker.id=1
listeners=PLAINTEXT://:9093
log.dirs=/tmp/kafka-logs-1
[root@along kafka_2.11-2.1.0]# vim config/server-2.properties
broker.id=2
listeners=PLAINTEXT://:9094
log.dirs=/tmp/kafka-logs-2
注:该broker.id属性是群集中每个节点的唯一且永久的名称。我们必须覆盖端口和日志目录,因为我们在同一台机器上运行这些,并且我们希望让所有代理尝试在同一端口上注册或覆盖彼此的数据。
docker方式
docker run -d --name kafka3 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.43.110:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.43.110:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 wurstmeister/kafka
docker run -d --name kafka4 -p 9094:9094 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.43.110:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.43.110:9094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 wurstmeister/kafka
-e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己 唯一*修改
-e KAFKA_ZOOKEEPER_CONNECT=10.9.44.11:2181 /kafka 配置zookeeper管理kafka的路径10.9.44.11:2181/kafka
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT ://10.9.44.11:9092 把kafka的地址端口注册给zookeeper *修改
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口 * 修改
端口:端口 ***映射需要跟着改 name 自定义也需要 唯一 *修改
ss -nutl 查看端口的使用情况
1)现在创建一个复制因子为3的新主题my-replicated-topic
cd /opt/kafka_2.13-2.7.1/bin
kafka-topics.sh --create --zookeeper 192.168.43.110:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
Created topic "my-replicated-topic".
2)在一个集群中,运行“describe topics”命令查看哪个broker正在做什么
kafka-topics.sh --describe --zookeeper 192.168.43.110:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
注释:第一行给出了所有分区的摘要,每个附加行提供有关一个分区的信息。由于我们只有一个分区用于此主题,因此只有一行。
“leader”是负责给定分区的所有读取和写入的节点。每个节点将成为随机选择的分区部分的领导者。
“replicas”是复制此分区日志的节点列表,无论它们是否为领导者,或者即使它们当前处于活动状态。
“isr”是“同步”复制品的集合。这是副本列表的子集,该列表当前处于活跃状态并且已经被领导者捕获。
请注意,Leader: 2,在我的示例中,节点2 是该主题的唯一分区的Leader。
3)可以在我们创建的原始主题(单kafka创建的主题)上运行相同的命令,以查看它的位置
kafka-topics.sh --describe --zookeeper 192.168.43.110:2181 --topic mykafka
Topic:along PartitionCount:1 ReplicationFactor:1 Configs:
Topic: mykafkaPartition: 0 Leader: 0 Replicas: 0 Isr: 0
4)向我们的新主题发布一些消息: 生产者
kafka-console-producer.sh --broker-list 192.168.43.110:9092 --topic my-replicated-topic
>my test message 1
>my test message 2
5)现在让我们使用这些消息: 消费者
kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --from-beginning --topic my-replicated-topic
my test message 1
my test message 2
七、测试集群的容错性
停止一个服务
如果不是docker
查询pid ps aux | grep server-2.properties |awk '{print $2}'
kill -9 106737
用docker
docker stop kafka4
2)leader 已切换到其中一个从属节点,节点2不再位于同步副本集中:
kafka-topics.sh --describe --zookeeper 192.168.43.110:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 0 Replicas: 2,0,1 Isr: 0,1
3) 即使最初接受写入的leader 已经失败,这些消息仍可供消费:
kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --from-beginning --topic my-replicated-topic
my test message 1
my test message 2
八、使用Kafka Connect导入/导出数据 其它源导入数据到Kafka数据流(指定Topic中),也可以方便的从Kafka数据流(指定Topic中)导出数据到其它源。
从控制台写入数据并将其写回控制台是一个方便的起点,但有时候可能希望使用其他来源的数据或将数据从Kafka导出到其他系统。对于许多系统,您可以使用Kafka Connect导入或导出数据,而不是编写自定义集成代码。
Kafka Connect是Kafka附带的工具,用于向Kafka导入和导出数据。它是一个可扩展的工具,运行连接器,实现与外部系统交互的自定义逻辑。在本快速入门中,我们将了解如何使用简单的连接器运行Kafka Connect,这些连接器将数据从文件导入Kafka主题并将数据从Kafka主题导出到文件。
(1)首先创建一些种子数据进行测试:
[root@along ~]# echo -e "foo\nbar" > test.txt
或者在Windows上:
> echo foo> test.txt
> echo bar>> test.txt
2)接下来,启动两个以独立模式运行的连接器,这意味着它们在单个本地专用进程中运行。提供三个配置文件作为参数。
第一个始终是Kafka Connect流程的配置,包含常见配置,例如要连接的Kafka代理和数据的序列化格式。
其余配置文件均指定要创建的连接器。这些文件包括唯一的连接器名称,要实例化的连接器类以及连接器所需的任何其他配置。
cd /opt/kafka_2.13-2.7.1
bin/connect-standalone.sh config/connect-standalone.properties config/connect-file-source.properties config/connect-file-sink.properties
注:Kafka附带的这些示例配置文件使用您之前启动的默认本地群集配置并创建两个连接器:第一个是源连接器,它从输入文件读取行并生成每个Kafka主题,第二个是宿连接器从Kafka主题读取消息并将每个消息生成为输出文件中的一行。
出现这个错误1 kafka提交connect-standalone.properties遇到connection to node -1 could not be established.Broker may not
发现是connect-standalone.properties里面的"bootstrap.servers="和kafka目录下的/config/server.properties里面的"zookeeper.connect="里面不一致导致。其实connect-standalone.properties和connect-file-source.propertiesl两个文件相当于kafka生产者。不管kafka的消费者和生产者,"bootstarp.servers="一定要和kafaka集群的zookeeper.connect里面的配置要一致,否则连接不上kafka集群。
出现错误2 Couldn't find file test.txt for FileStreamSourceTask,
出现下方错误,是因为文件位置不对,默认应将test.txt文件建立在Kafka目录下,和bin目录同级。
cd /opt/kafka_2.13-2.7.1
echo -e "foo\nbar" > test.txt
3) 、验证是否导入成功(另起终端)
在启动过程中,您将看到许多日志消息,包括一些指示正在实例化连接器的日志消息。
① 一旦Kafka Connect进程启动,源连接器应该开始从test.txt主题读取行并将其生成到主题connect-test,并且接收器连接器应该开始从主题读取消息connect-test 并将它们写入文件test.sink.txt。我们可以通过检查输出文件的内容来验证数据是否已通过整个管道传递:
进入 cd /opt/kafka_2.13-2.7.1
查看 cat test.txt
foo
bar
② 请注意,数据存储在Kafka主题中connect-test,因此我们还可以运行控制台使用者来查看主题中的数据(或使用自定义使用者代码来处理它): 消费者 topic( connect-test)
kafka-console-consumer.sh --bootstrap-server 192.168.43.110:9092 --topic connect-test --from-beginning
{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}
(4)继续追加数据,验证
echo Another line>> test.txt
5) 查看导出文件,test.sink.txt,可以看到消费到的消息。
cat test.sink.txt
foo
bar
Another line
[root@along ~]# kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic connect-test --from-beginning
{"schema":{"type":"string","optional":false},"payload":"foo"}
{"schema":{"type":"string","optional":false},"payload":"bar"}
{"schema":{"type":"string","optional":false},"payload":"Another line"}
说明新消息可以实时的消费