课程地址: 【尚硅谷】Kafka3.x教程(从入门到调优,深入全面)_哔哩哔哩_bilibili
讲解版本:kafka3.x ;时长13小时
官网:Apache Kafka
Kafka2.8.0以后也可以配置不采用zookeeper,之前是必须采用zk的。(启动kafka前须启动zk)
说明:资料已下载,非常全!很赞!
传统上用作分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域; 同时,Kafka是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。
目前企业中比较常见的消息队列产品主要有 Kafka、ActiveMQ、RabbitMQ、RocketMQ等。在大数据场景主要采用 Kafka 作为消息队列。在 JavaEE 开发中主要采用 ActiveMQ、RabbitMQ、RocketMQ。
缓存/ 消峰、 解耦和 异步通信。
到官网下载:
第一步:将下载的压缩包拖到虚拟机centos102的/opt/software/目录下;
第二步:解压缩到指定目录/opt/module/下;
[root@centos102 software]# mkdir -p /opt/module
[root@centos102 software]# tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module
由于kafka压缩包是免安装包,故解压命令中参数为-zxvf
给解压的kafka改个名字:
第三步:修改配置文件;
进入/opt/module/kafka/config目录修改server.properties文件,具体如下:
#broker 的全局唯一编号,不能重复,只能是数字。
broker.id=0#kafka 运行日志(数据)存放的路径,路径不需要提前创建,kafka 自动帮你创建,可以配置多个磁盘路径,路径与路径之间可以用","分隔
log.dirs=/opt/module/kafka/datas#配置连接 Zookeeper 集群地址(在 zk 根目录下创建/kafka,方便管理)
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka
第四步:分发kafka并修改配置broker.id
正确的分发命令:rsync -av kafka [email protected]:/opt/module
而不是:rsync -av kafka/ [email protected]:/opt/module (注意有没有/的区别)
第五步:java -version检查JDK是否安装成功并配置了环境变量;配置kafka的环境变量;启动;
/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties
[root@centos104 kafka]# bin/kafka-server-start.sh -daemon config/server.properties
老师说,启动kafka前须启动zk,但是我没有启动zk也能启动成功kafka。
我亲自下载搭建了zk集群,发现:
[root@centos102 zookeeper]# bin/zkServer.sh start 这是启动zk命令,必须是在zookeeper这个目录下才能启动,否则就报错;还有,zookeeper的配置文件zookeeper/conf/zoo.cfg中这个必须写绝对路径dataDir=/opt/module/zookeeper/data,(data这个目录是新建的,需要在这个目录下创建名称为 myid 的文件)否则zookeeper/data目录下的my.id文件读取不到,zk不能启动,从zookeeper/logs/下的日志中看到报错信息为myid文件读取不到:
第六步:停止服务时,须先关闭kafka再关闭zookeeper。老师写了批量启动停止的shell脚本。
保存退出后,执行 chmod 777 kf.sh 命令进行赋权。
kafka关闭命令:
[root@centos104 kafka]# bin/kafka-server-stop.sh
注意:任何操作首先须启动服务端,即通过jps检查启动的服务,如果没有启动kafka时,须对集群的每台服务器执行命令启动kafka:
开启服务(在kafka根目录下执行):
bin/kafka-server-start.sh -daemon config/server.properties
相关命令都保存在kafka/bin/kafka-topics.sh这个文件中。
对Topic进行操作时,首先得使用--bootstrap-server参数连接上kafka broker主机名称和端口号。
对Topic进行操作,一般指增删改查。
zk集群启动的前提下,执行kafka主题命令行启动命令时,报错:could not be established. Broker may not be available. 一直在尝试连接。百度原因为:
kafka/config/server.properties文件中,需要进行如下配置:
操作了几次都无法成功,过了好几天,从头到尾,从克隆虚拟机开始重新操作了一遍,可以了,没有那个错误了!但上图中这个配置并没有改哦!我猜想可能是zookeeper没有真正启动,因为我只是执行了启动命令后jps查看启动的进程,但并没有执行命令bin/zkServer.sh status检查其是否真正启动!
当然,还有一种情况,就是你没有启动kafka的服务而直接执行如下命令,也会是一直连不上的情况:
kafka服务启动命令:
bin/kafka-server-start.sh -daemon config/server.properties
而直接执行:
bin/kafka-topics.sh --bootstrap-server centos102:9092 --list
练习
查看集群中的所有主题:
bin/kafka-topics.sh --bootstrap-server centos102:9092,centos103:9092,centos104:9092 --list
创建Topic命令:
bin/kafka-topics.sh --bootstrap-server centos102:9092,centos103:9092,centos104:9092 --create --topic topic1 --partitions 1 --replication-factor 3
在6.1中我们创建了一个主题为topic1的主题,接下来创建一个生产者往topic1中发送数据。
生产者相关命令保存在bin/kafka-console-producer.sh中。
消费者命令使用与生产者类似,可执行bin/kafka-console-consumer.sh回车进行求助。
在消息发送的过程中,涉及到了 两个线程 ——main线程和Sender线程。在main线程
中创建了一个双端列队列RecordAccumulator。main线程将消息发送给RecordAccumulator,
Sender线程不断从RecordAccumulator中拉取消息发送到 Kafka Broker。
略,详见讲义。
需求:创建 Kafka生产者,采用异步的方式发送到 Kafka Broker。
java代码编写,可参考讲义。运行下面代码前,记得将Linux虚拟机集群开启消费消息,观察数据变化。
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
public class TestProducter {
public static void main(String[] args) {
// 1. 创建 kafka 生产者的配置对象
Properties properties = new Properties();
// 2. 给 kafka 配置对象添加配置信息:bootstrap.servers
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"centos102:9092,centos103:9092,centos104:9092");
// key,value 序列化(必须):key.serializer,value.serializer
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
// 3. 创建 kafka 生产者对象
KafkaProducer kafkaProducer = new KafkaProducer<>(properties);
// 4. 调用 send 方法,发送消息
for (int i = 0; i < 5; i++) {
kafkaProducer.send(new ProducerRecord<>("topic1","test_data"+i));
}
// 5. 关闭资源
kafkaProducer.close();
}
}