kafka学习笔记二

课程地址: 【尚硅谷】Kafka3.x教程(从入门到调优,深入全面)_哔哩哔哩_bilibili

讲解版本:kafka3.x ;时长13小时

官网:Apache Kafka

Kafka2.8.0以后也可以配置不采用zookeeper,之前是必须采用zk的。(启动kafka前须启动zk)

说明:资料已下载,非常全!很赞!

第一二章 kafka概述&快速入门

kafka学习笔记二_第1张图片

1. kafka定义

传统上用作分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域; 同时,Kafka是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

2. 常见MQ有哪些?

目前企业中比较常见的消息队列产品主要有 Kafka、ActiveMQ、RabbitMQ、RocketMQ等。在大数据场景主要采用 Kafka 作为消息队列。在 JavaEE 开发中主要采用 ActiveMQ、RabbitMQ、RocketMQ。

3. 传统消息队列的应用场景

缓存/ 消峰、 解耦和 异步通信。

4. kafka基础架构

kafka学习笔记二_第2张图片kafka学习笔记二_第3张图片

5. kafka的下载、安装、启动/停止

到官网下载:

kafka学习笔记二_第4张图片

第一步:将下载的压缩包拖到虚拟机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改个名字:

kafka学习笔记二_第5张图片

第三步:修改配置文件;

进入/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。

kafka学习笔记二_第6张图片

我亲自下载搭建了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学习笔记二_第7张图片

第六步:停止服务时,须先关闭kafka再关闭zookeeper。老师写了批量启动停止的shell脚本。

kafka学习笔记二_第8张图片

kafka学习笔记二_第9张图片

保存退出后,执行 chmod 777 kf.sh 命令进行赋权。

kafka关闭命令:

[root@centos104 kafka]# bin/kafka-server-stop.sh

6. kafka命令行操作

注意:任何操作首先须启动服务端,即通过jps检查启动的服务,如果没有启动kafka时,须对集群的每台服务器执行命令启动kafka:

开启服务(在kafka根目录下执行):

bin/kafka-server-start.sh -daemon config/server.properties

6.1 主题命令行操作

相关命令都保存在kafka/bin/kafka-topics.sh这个文件中。

对Topic进行操作时,首先得使用--bootstrap-server参数连接上kafka broker主机名称和端口号。

对Topic进行操作,一般指增删改查。

kafka学习笔记二_第10张图片

zk集群启动的前提下,执行kafka主题命令行启动命令时,报错:could not be established. Broker may not be available. 一直在尝试连接。百度原因为:

kafka/config/server.properties文件中,需要进行如下配置:

kafka学习笔记二_第11张图片

操作了几次都无法成功,过了好几天,从头到尾,从克隆虚拟机开始重新操作了一遍,可以了,没有那个错误了!但上图中这个配置并没有改哦!我猜想可能是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  

kafka学习笔记二_第12张图片

6.2 生产者命令行操作

在6.1中我们创建了一个主题为topic1的主题,接下来创建一个生产者往topic1中发送数据。

生产者相关命令保存在bin/kafka-console-producer.sh中。

kafka学习笔记二_第13张图片

kafka学习笔记二_第14张图片

6.3 消费者命令行操作

消费者命令使用与生产者类似,可执行bin/kafka-console-consumer.sh回车进行求助。

第三章 生产者

3.1 生产者消息发送流程

3.1.1 发送原理

在消息发送的过程中,涉及到了 两个线程 ——main线程和Sender线程。在main线程
中创建了一个双端列队列RecordAccumulator。main线程将消息发送给RecordAccumulator,
Sender线程不断从RecordAccumulator中拉取消息发送到 Kafka Broker。 

kafka学习笔记二_第15张图片

3.1.2 生产者重要参数

略,详见讲义。

3.2 异步发送API

3.2.1 普通异步发送

需求:创建 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();
    }
}

3.2.2 带回调函数的异步发送

你可能感兴趣的:(分布式,kafka)