ApacheKafka®是一个分布式流平台
目录
一、下载包,并解压
yum -y install wget vim net-tools nc
wget https://mirror.bit.edu.cn/apache/kafka/2.4.1/kafka_2.12-2.4.1.tgz
tar -xzf kafka_2.12-2.4.1.tgz
-
安装jdk
tar -xzf jdk-8u241-linux-x64.tar.gz
mv jdk1.8.0_241 /usr/local/java
#添加环境
# vim /etc/profile
#java环境变量
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
#使其生效
source /etc/profile
二、启动服务器
Kafka使用ZooKeeper,因此如果您还没有,请首先启动ZooKeeper服务器。您可以使用kafka随附的便利脚本来获取快速且肮脏的单节点ZooKeeper实例
- 启动zookeeper服务
cd kafka_2.12-2.4.1
./bin/zookeeper-server-start.sh config/zookeeper.properties
#开新终端,查看zookeeper默认端口
# netstat -anpt|grep java
tcp6 0 0 :::38652 :::* LISTEN 8060/java
tcp6 0 0 :::2181 :::* LISTEN 8060/java
- 配置服务【此处暂时不操作作为补充内容】
# vim /root/kafka_2.12-2.4.1/config/server.properties
36 #advertised.listeners=PLAINTEXT://your.host.name:9092
改为
36 advertised.listeners=PLAINTEXT://:192.168.30.202:9092
-
启动kafka服务器
cd kafka_2.12-2.4.1
./bin/kafka-server-start.sh config/server.properties
- 查看kafka默认端口
# netstat -anpt|grep java
tcp6 0 0 :::38652 :::* LISTEN 8060/java
tcp6 0 0 :::38078 :::* LISTEN 8415/java
tcp6 0 0 :::9092 :::* LISTEN 8415/java
tcp6 0 0 :::2181 :::* LISTEN 8060/java
tcp6 0 0 127.0.0.1:40798 127.0.0.1:9092 ESTABLISHED 8415/java
tcp6 0 0 127.0.0.1:9092 127.0.0.1:40798 ESTABLISHED 8415/java
tcp6 0 0 ::1:2181 ::1:51918 ESTABLISHED 8060/java
tcp6 0 0 ::1:51918 ::1:2181 ESTABLISHED 8415/java
- 启动Kafka Broker后,在ZooKeeper终端上键入命令 jps,效果如下:
# jps
14099 QuorumPeerMain
15192 Jps
14797 Kafka
三、建立主题
- 新开一终端,让我们用一个分区和一个副本创建一个名为“ test”的主题:
cd kafka_2.12-2.4.1
./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
- 现在,如果我们运行list topic命令,我们可以看到该主题(查询topic列表):
./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
test
或者
./bin/kafka-topics.sh --list --zookeeper localhost:2181
test
或者,除了手动创建主题外,还可以将代理配置为在发布不存在的主题时自动创建主题。
- 查看topic信息
./bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic test
Topic: test PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
- 删除topic【此处暂时不操作,作为补充内容】
./bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test
四、发送一些消息
Kafka带有一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到Kafka集群。默认情况下,每行将作为单独的消息发送。
- 运行生产者,然后在控制台中键入一些消息以发送到服务器。
#启动生产者
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
#启动消费者,开新终端
cd kafka_2.12-2.4.1
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
- 生产者终端(发送消息):君问归期未有期,巴山夜雨涨秋池。 ——李商隐(唐代)-《夜雨寄北》
# ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>君问归期未有期,巴山夜雨涨秋池。 ——李商隐(唐代)-《夜雨寄北》
- 消费者终端(接收消息):君问归期未有期,巴山夜雨涨秋池。 ——李商隐(唐代)-《夜雨寄北》
# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
君问归期未有期,巴山夜雨涨秋池。 ——李商隐(唐代)-《夜雨寄北》
五、建立多经济商丛集
到目前为止,我们一直在与一个经纪人竞争,但这并不有趣。对于Kafka来说,单个代理只是一个大小为1的集群,因此除了启动更多的代理实例之外,没有什么太大的变化。但是,只是为了感受一下,让我们将集群扩展到三个节点(仍然全部在本地计算机上)。
首先,我们为每个代理创建一个配置文件(在Windows上,使用copy
命令代替):
cd /root/kafka_2.12-2.4.1
cp ./config/server.properties ./config/server-1.properties
cp ./config/server.properties ./config/server-2.properties
- 现在编辑这些新文件并设置以下属性:
# vim ./config/server-1.properties
21 broker.id=0
31 #listeners=PLAINTEXT://:9092
60 log.dirs=/tmp/kafka-logs
改为
21 broker.id=1
31 listeners=PLAINTEXT://:9093
60 log.dirs=/tmp/kafka-logs-1
# vim ./config/server-2.properties
21 broker.id=0
31 #listeners=PLAINTEXT://:9092
60 log.dirs=/tmp/kafka-logs
改为
21 broker.id=2
31 listeners=PLAINTEXT://:9094
60 log.dirs=/tmp/kafka-logs-2
该broker.id
属性是集群中每个节点的唯一且永久的名称。我们只需要覆盖端口和日志目录,这是因为我们都在同一台计算机上运行它们,并且希望所有代理都不要试图在同一端口上注册或覆盖彼此的数据。
- 我们已经有Zookeeper并启动了单个节点,因此我们只需要启动两个新节点:
./bin/kafka-server-start.sh ./config/server-1.properties &
./bin/kafka-server-start.sh ./config/server-2.properties &
- 创建一个具有三个复制因子的新主题:my-replicated-topic
./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 1 --topic my-replicated-topic
查看创建的主题
# ./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
__consumer_offsets
my-replicated-topic
test
- 好的,但是现在有了集群,我们如何知道哪个经纪人在做什么?要查看该命令,请运行“描述主题”命令:
# ./bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
Topic: my-replicated-topic PartitionCount: 1 ReplicationFactor: 3 Configs:
segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 1,0,2 Isr: 1,0,2
这是输出的说明。第一行给出了所有分区的摘要,每一行都给出了有关一个分区的信息。由于该主题只有一个分区,因此只有一行。
- “领导者”是负责给定分区的所有读取和写入的节点。每个节点将成为分区的随机选择部分的领导者。
- “副本”是为该分区复制日志的节点列表,无论它们是引导者还是当前处于活动状态。
- “ isr”是“同步”副本的集合。这是副本列表的子集,当前仍处于活动状态并追随领导者。
请注意,在我的示例中,节点1是主题唯一分区的领导者。
- 我们可以在创建的原始主题上运行相同的命令,以查看其位置:
# ./bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
Topic: test PartitionCount: 1 ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
因此,这里没有任何惊喜-原始主题没有副本,并且位于服务器0上,这是我们创建群集时集群中唯一的服务器。
- 让我们向我们的新主题发布一些消息:
# ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
>海上生明月,天涯共此时
>^C
- 现在让我们使用(接收)这些消息:
# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
海上生明月,天涯共此时
- 现在让我们测试一下容错能力。经纪人1扮演领导者的角色,所以让我们杀死它:
# ps aux | grep server-1.properties
root 22561 3.8 15.8 3225640 157392 pts/4 Sl 10:49 1:25 /usr/local/java/bin/java......
# kill -9 22561
在Windows上使用:
1个
2
3
4
|
> wmic process where "caption = 'java.exe' and commandline like '%server-1.properties%'" get processid
ProcessId
6016
> taskkill /pid 6016 /f
|
- 领导层已切换为关注者之一,并且节点1不再位于同步副本集中:my-replicated-topic
# ./bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
Topic: my-replicated-topic PartitionCount: 1 ReplicationFactor: 3 Configs: segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 0 Replicas: 1,0,2 Isr: 0,2
- 但是,即使最初进行写操作的领导者已经下线,消息仍然可供使用:
# ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic
海上生明月,天涯共此时
海上生明月,天涯共此时
六、使用kafka connect导入/导出数据
从控制台写入数据并将其写回到控制台是一个方便的起点,但是您可能要使用其他来源的数据或将数据从Kafka导出到其他系统。对于许多系统,可以使用Kafka Connect导入或导出数据,而无需编写自定义集成代码。
Kafka Connect是Kafka附带的工具,用于将数据导入和导出到Kafka。它是运行连接器的可扩展工具,该 连接器实现用于与外部系统进行交互的自定义逻辑。在本快速入门中,我们将看到如何使用简单的连接器运行Kafka Connect,该连接器将数据从文件导入到Kafka主题,并将数据从Kafka主题导出到文件。
- 首先,我们将从创建一些种子数据开始进行测试:
cd kafka_2.12-2.4.1
echo -e "foo\nbar" > test.txt
或在Windows上:
1个
2
|
> echo foo> test .txt
> echo bar>> test .txt
|
接下来,我们将启动两个以独立模式运行的连接器,这意味着它们将在单个本地专用进程中运行。我们提供了三个配置文件作为参数。第一个始终是Kafka Connect流程的配置,其中包含通用配置,例如要连接的Kafka代理和数据的序列化格式。其余的配置文件均指定要创建的连接器。这些文件包括唯一的连接器名称,要实例化的连接器类,以及连接器所需的任何其他配置。
./bin/connect-standalone.sh ./config/connect-standalone.properties ./config/connect-file-source.properties ./config/connect-file-sink.properties
这些样本配置文件(随Kafka一起提供)使用您先前启动的默认本地集群配置并创建两个连接器:第一个是源连接器,该连接器从输入文件中读取行并将每个行生成到Kafka主题,第二个是接收器连接器从Kafka主题读取消息,并在输出文件中将它们作为一行显示。
在启动过程中,您将看到许多日志消息,其中包括一些表明正在实例化连接器的消息。Kafka Connect进程启动后,源连接器应开始从test.txt
主题中读取行并将其生成到主题connect-test
,而接收器连接器应开始从主题中读取消息connect-test
并将其写入文件test.sink.txt
。
- 我们可以通过检查输出文件的内容来验证数据已通过整个管道传递:
# cd kafka_2.12-2.4.1
# more test.sink.txt
foo
bar
- 请注意,数据存储在Kafka主题中
connect-test
,因此我们也可以运行控制台使用者以查看该主题中的数据(或使用自定义使用者代码进行处理):
# ./bin/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"}
- 连接器继续处理数据,因此我们可以将数据添加到文件中,并查看它在管道中的移动情况:
# cd kafka_2.12-2.4.1
# echo Another line>> test.txt
- 您应该看到该行出现在控制台使用者输出和接收器文件中。
# ./bin/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"}
七、使用kafka Streams处理数据
Kafka Streams是用于构建关键任务实时应用程序和微服务的客户端库,其中输入和/或输出数据存储在Kafka集群中。Kafka Streams结合了在客户端编写和部署标准Java和Scala应用程序的简便性以及Kafka服务器端集群技术的优势,使这些应用程序具有高度可伸缩性,弹性,容错性,分布式等等。此快速入门示例将演示如何运行此库中编码的流应用程序。
八、相关问题
问题1:引导代理本地主机:9092(id:-1 rack:null)已断开连接
# ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>[2020-03-30 18:11:40,496] WARN [Producer clientId=console-producer] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
原因:启动生产者时,迟迟没有启动消费者导致的警告,
解决:此时启动消费者即可解决
问题2:在消费者终端接收的消息中莫名出现特殊�
- 生产者终端(发送消息):君问归期未有期,巴山夜雨涨秋池。 ——李商隐(唐代)-《夜雨寄北》
# ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>君问归期未有期,巴山夜雨涨秋池。 ——李商隐(唐代)-《夜雨寄北》
- 消费者终端(接收消息):君问归期未有期,巴山夜雨涨秋池。 ——李商隐(�唐代)-�《夜雨寄北》
# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
君问归期未有期,巴山夜雨涨秋池。 ——李商隐(�唐代)-�《夜雨寄北》
原因:直接在生产者终端编辑发送消息,输入()或者《》符号时多次按回车键导致的
解决:提前编辑好信息,复制粘贴就不会出现以上问题
参考 :官网