【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门

【Kafka-3.x-教程】专栏:

【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门
【Kafka-3.x-教程】-【二】Kafka-生产者-Producer
【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft
【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer
【Kafka-3.x-教程】-【五】Kafka-监控-Eagle
【Kafka-3.x-教程】-【六】Kafka 外部系统集成 【Flume、Flink、SpringBoot、Spark】
【Kafka-3.x-教程】-【七】Kafka 生产调优、Kafka 压力测试

【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门

1)定义

试想这样一个场景,某宝或某东购物平台,上游通过 Flume 采集相关日志到 Hadoop 集群中,在平时流量小的时候,Hadoop 的写入速度在 100M/s,Flume 采集日志的速度也在 100M/s,这样下游的 Hadoop 上传速度可以和上游的 Flume 采集速度相匹配,没有问题。

那么现在到了促销季,假如双十一进行大促销,那么 Flume 采集到的数据量远超过平时的 100M/s(比如达到 200M/s),而下游的 Hadoop 速度的极限已经是 100M/s 了,此时如果不解决这个问题就会导致上游数据量无限度的堆积,导致日志服务器爆掉。

此时 Kafka 出现了,试想,如果将 Flume 采集到的数据先放入一个中间栈做保存,然后让 Hadoop 慢慢消化海量数据,那么就可以解决上述的问题。

Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。

目前企业中比较常见的消息队列产品主要有 Kafka、ActiveMQ 、RabbitMQ 、RocketMQ 等。

在大数据场景主要采用 Kafka 作为消息队列。在 JavaEE 开发中主要采用 ActiveMQ、RabbitMQ、RocketMQ。

2)应用场景

2.1.削峰

缓冲/消峰:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

2.2.解耦

解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

2.3.异步通信

异步通信:允许用户把一个消息放入队列,但并不立即处理它,然后在需要的时候再去处理它们

3)两种模式

1、点对点模式

  • 消费者主动拉取数据,消息收到后清除消息

2、发布/订阅模式

  • 可以有多个topic主题(浏览、点赞、收藏、评论等)

  • 消费者消费数据之后,不删除数据

  • 每个消费者相互独立,都可以消费到数据

3、对比

相对于点对点模式来说,发布订阅模式的优势有:

  • 消息被消费完不会被删除,可以提供给其他消费者继续消费
  • 可以有多个 topic 进行接收消息
  • 至于数据怎么删除,可以规定时间定期进行清理

4)基础架构

1、为方便扩展,并提高吞吐量,一个 topic 分为多个 partition。

2、配合分区的设计,提出消费者组的概念,组内每个消费者并行消费。

3、为提高可用性,为每个partition增加若干副本,类似 NameNode HA。

4、ZK 中记录谁是 leader,Kafka 2.8.0 以后也可以配置不采用 ZK。

(1)Producer:消息生产者,就是向 Kafka broker 发消息的客户端。

(2)Consumer:消息消费者,向 Kafka broker 取消息的客户端。

(3)Consumer Group(CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。

(4)Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。

(5)Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic。

(6)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。

(7)Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个 Follower。

(8)Leader:每个分区多个副本的"主",生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。

(9)Follower:每个分区多个副本中的"从",实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Leader。

5)安装部署

5.1.集群规划

5.2.集群部署

1、官方下载地址

2、解压安装包

shell 复制代码
tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/

3、修改解压后的文件名称

shell 复制代码
mv kafka_2.12-3.0.0/ kafka

4、进入到/opt/module/kafka目录,修改配置文件

shell 复制代码
cd config/
vim server.properties

输入以下内容:

shell 复制代码
#broker 的全局唯一编号,不能重复,只能是数字。
broker.id=0
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘 IO 的线程数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka 运行日志(数据)存放的路径,路径不需要提前创建,kafka 自动帮你创建,可以
配置多个磁盘路径,路径与路径之间可以用","分隔
log.dirs=/opt/module/kafka/datas
#topic 在当前 broker 上的分区个数
num.partitions=1
#用来恢复和清理 data 下数据的线程数量
num.recovery.threads.per.data.dir=1
# 每个 topic 创建时的副本数,默认时 1 个副本
offsets.topic.replication.factor=1
#segment 文件保留的最长时间,超时将被删除
log.retention.hours=168
#每个 segment 文件的大小,默认最大 1G
log.segment.bytes=1073741824
# 检查过期数据的时间,默认 5 分钟检查一次是否数据过期
log.retention.check.interval.ms=300000
#配置连接 Zookeeper 集群地址(在 zk 根目录下创建/kafka,方便管理)
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/ka
fka

5、分发安装包

shell 复制代码
xsync kafka/

xsync 脚本:

shell 复制代码
#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
    echo ====================  $host  ====================
    #3. 遍历所有目录,挨个发送

    for file in $@
    do
        #4. 判断文件是否存在
        if [ -e $file ]
            then
                #5. 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)

                #6. 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

6、分别在 hadoop103hadoop104 上修改配置文件/opt/module/kafka/config/server.properties中的 broker.id=1、broker.id=2

注:broker.id 不得重复,整个集群中唯一。

shell 复制代码
vim kafka/config/server.properties
修改:
# The id of the broker. This must be set to a unique integer for 
each broker.
broker.id=1
[atguigu@hadoop104 module]$ vim kafka/config/server.properties
修改:
# The id of the broker. This must be set to a unique integer for 
each broker.
broker.id=2

7、配置环境变量

(1)在/etc/profile.d/my_env.sh文件中增加 kafka 环境变量配置

shell 复制代码
sudo vim /etc/profile.d/my_env.sh

增加如下内容:

shell 复制代码
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=$PATH:$KAFKA_HOME/bin

(2)刷新一下环境变量。

shell 复制代码
source /etc/profile

(3)分发环境变量文件到其他节点,并 source。

shell 复制代码
sudo /home/atguigu/bin/xsync 
/etc/profile.d/my_env.sh
source /etc/profile
source /etc/profile

8、启动集群

(1)先启动 Zookeeper 集群,然后启动 Kafka。

shell 复制代码
zk.sh start

zk.sh 脚本:

shell 复制代码
#!/bin/bash

case $1 in
"start"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo  ------------- zookeeper $i 启动 ------------
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"
	done
}
;;
"stop"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo  ------------- zookeeper $i 停止 ------------
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
	done
}
;;
"status"){
	for i in hadoop102 hadoop103 hadoop104
	do
		echo  ------------- zookeeper $i 状态 ------------
		ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
	done
}
;;
esac

(2)依次在 hadoop102、hadoop103、hadoop104 节点上启动 Kafka。

shell 复制代码
bin/kafka-server-start.sh -daemon config/server.properties

注意:配置文件的路径要能够到 server.properties。

9、关闭集群

shell 复制代码
bin/kafka-server-stop.sh

5.3.集群启停脚本

1、在/home/atguigu/bin目录下创建文件kf.sh脚本文件

shell 复制代码
vim kf.sh

脚本如下:

shell 复制代码
#! /bin/bash
case $1 in
"start"){
 for i in hadoop102 hadoop103 hadoop104
 do
 echo " --------启动 $i Kafka-------"
 ssh $i "/opt/module/kafka/bin/kafka-server-start.sh -
daemon /opt/module/kafka/config/server.properties"
 done
};;
"stop"){
 for i in hadoop102 hadoop103 hadoop104
 do
 echo " --------停止 $i Kafka-------"
 ssh $i "/opt/module/kafka/bin/kafka-server-stop.sh "
 done
};;
esac

2、添加执行权限

shell 复制代码
chmod +x kf.sh

3、启动集群命令

shell 复制代码
kf.sh start

4、停止集群命令

shell 复制代码
kf.sh stop

注意:停止 Kafka 集群时,一定要等 Kafka 所有节点进程全部停止后再停止 Zookeeper 集群。因为 Zookeeper 集群当中记录着 Kafka 集群相关信息,Zookeeper 集群一旦先停止,Kafka 集群就没有办法再获取停止进程的信息,只能手动杀死 Kafka 进程了。

6)Kafka 命令行操作

6.1.主题命令行操作

1、查看操作主题命令参数

shell 复制代码
bin/kafka-topics.sh

2、查看当前服务器中的所有 topic

shell 复制代码
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --list

3、创建 first topic

shell 复制代码
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --partitions 1 --replication-factor 3 --topic first

选项说明:

--topic 定义 topic 名

--replication-factor 定义副本数

--partitions 定义分区数

4、查看 first 主题的详情

shell 复制代码
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic first

5、修改分区数(注意:分区数只能增加,不能减少)

shell 复制代码
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --alter --topic first --partitions 3

6、再次查看 first 主题的详情

shell 复制代码
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --describe --topic first

7、删除 topic

shell 复制代码
bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --delete --topic first

6.2.生产者命令行操作

1、查看操作生产者命令参数

shell 复制代码
bin/kafka-console-producer.sh

2、发送消息

shell 复制代码
bin/kafka-console-producer.sh --bootstrap-server hadoop102:9092 --topic first

6.3.消费者命令行操作

1、查看操作消费者命令参数

shell 复制代码
bin/kafka-console-consumer.sh


2、消费消息

(1)消费 first 主题中的数据。

shell 复制代码
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic first

(2)把主题中所有的数据都读取出来(包括历史数据)。

shell 复制代码
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --from-beginning --topic first
相关推荐
zquwei2 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
道一云黑板报6 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes
qq_5470261796 小时前
Kafka 常见问题
kafka
core5126 小时前
flink sink kafka
flink·kafka·sink
飞来又飞去7 小时前
kafka sasl和acl之间的关系
分布式·kafka
MZWeiei8 小时前
Zookeeper的监听机制
分布式·zookeeper
莹雨潇潇9 小时前
Hadoop完全分布式环境部署
大数据·hadoop·分布式
浩哲Zhe9 小时前
RabbitMQ
java·分布式·rabbitmq
明达技术10 小时前
分布式 IO 模块:赋能造纸业,革新高速纸机主传动
分布式
Allen Bright10 小时前
RabbitMQ中的Topic模式
分布式·rabbitmq