kafka专题篇

kafka概述

(1)定义:Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
(2)消息队列
传统消息队列的应用场景之MQ传统应用场景之异步处理
在这里插入图片描述
使用消息队列的好处
解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
可恢复性:系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
缓冲:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
灵活性 & 峰值处理能力:在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。
如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
(2)消息队列的两种模式
点对点模式:(一对一,消费者主动拉取数据,消息收到后消息清除
消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。消息被消费以后,queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
在这里插入图片描述
发布/订阅模式:一对多,消费者消费数据之后不会清除消息
消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费。
在这里插入图片描述
(3)Kafka 基础架构
在这里插入图片描述
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:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
9)follower:每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 follower。

kafka安装部署

(1)集群规划

hadoop102    hadoop103    hadoop104
      zk                     zk                 zk
    kafka               kafka              kafka

(2)jar包下载
http://kafka.apache.org/downloads.html
在这里插入图片描述
(3)集群部署
解压安装包

[hadoop@hadoop102 software]$ tar -zxvf kafka_2.11-0.11.0.0.tgz -C /opt/module/

修改解压后的文件名称
[hadoop@hadoop102 module]$ mv kafka_2.11-0.11.0.0/ kafka
在/opt/module/kafka 目录下创建 logs 文件夹
[hadoop@hadoop102 kafka]$ mkdir logs
修改配置文件
[hadoop@hadoop102 config]$ vi server.properties
输入以下内容:

#broker 的全局唯一编号,不能重复
broker.id=0
#删除 topic 功能使能
delete.topic.enable=true
#处理网络请求的线程数量
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 运行日志存放的路径
log.dirs=/opt/module/kafka/logs
#topic 在当前 broker 上的分区个数
num.partitions=1
#用来恢复和清理 data 下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment 文件保留的最长时间,超时将被删除
log.retention.hours=168
#配置连接 Zookeeper 集群地址
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181

配置环境变量
[hadoop@hadoop102 module]$ sudo vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH= P A T H : PATH: PATH:KAFKA_HOME/bin
[hadoop@hadoop102 module]$ source /etc/profile
分发安装包
[hadoop@hadoop102 module]$ xsync kafka/
注意:分发之后记得配置其他机器的环境变量
分别在 hadoop103 和 hadoop104 上修改配置文件/opt/module/kafka/config/server.properties
中的 broker.id=1、broker.id=2
注:broker.id 不得重复
启动集群
依次在 hadoop102、hadoop103、hadoop104 节点上启动 kafka

[hadoop@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon
config/server.properties
[hadoop@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon
config/server.properties
[hadoop@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon
config/server.properties

关闭集群
[hadoop@hadoop102 kafka]$ bin/kafka-server-stop.sh stop
[hadoop@hadoop103 kafka]$ bin/kafka-server-stop.sh stop
[hadoop@hadoop104 kafka]$ bin/kafka-server-stop.sh stop
kafka 群起脚本

for i in hadoop102 hadoop103 hadoop104
do
echo "========== $i =========="
ssh $i '/opt/module/kafka/bin/kafka-server-start.sh -daemon
/opt/module/kafka/config/server.properties'
done

kafka常用命令

(1)查看 Kafka Topic 列表

[hadoop@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper
hadoop102:2181/kafka --list

(2)创建 Kafka Topic
进入到/opt/module/kafka/目录下创建日志主题

[hadoop@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper
hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka --create
--replication-factor 1 --partitions 1 --topic topic_log

(3)删除 Kafka Topic

[hadoop@hadoop102 kafka]$ bin/kafka-topics.sh --delete
--zookeeper hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka
--topic topic_log

(4)Kafka 生产消息

[hadoop@hadoop102 kafka]$ bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 --topic topic_log
>hello world
>hadoop hadoop

(5)Kafka 消费消息

[hadoop@hadoop102 kafka]$ bin/kafka-console-consumer.sh \
--bootstrap-server hadoop102:9092 --from-beginning --topic
topic_log

–from-beginning:会把主题中以往所有的数据都读取出来。根据业务场景选择是否增加
该配置。
(6)查看 Kafka Topic 详情

[hadoop@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper
hadoop102:2181/kafka \
--describe --topic topic_log

项目经验之kafka压力测试

用 Kafka 官方自带的脚本,对 Kafka 进行压测。Kafka 压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络 IO)。一般都是网络 IO 达到瓶颈。

kafka-consumer-perf-test.sh
kafka-producer-perf-test.sh

(1)Kafka Producer 压力测试
在/opt/module/kafka/bin 目录下面有这两个文件。我们来测试一下

[hadoop@hadoop102 kafka]$ bin/kafka-producer-perf-test.sh
--topic test --record-size 100 --num-records 100000 --throughput
-1 --producer-props
bootstrap.servers=hadoop102:9092,hadoop103:9092,hadoop104:9092

说明:
record-size 是一条信息有多大,单位是字节。
num-records 是总共发送多少条信息。
throughput 是每秒多少条信息,设成-1,表示不限流,可测出生产者最大吞吐量。
Kafka 会打印下面的信息

100000 records sent, 95877.277085 records/sec (9.14 MB/sec),
187.68 ms avg latency, 424.00 ms max latency, 155 ms 50th, 411 ms
95th, 423 ms 99th, 424 ms 99.9th.

参数解析:本例中一共写入 10w 条消息,吞吐量为 9.14 MB/sec,每次写入的平均延迟为 187.68 毫秒,最大的延迟为 424.00 毫秒。
(2)Kafka Consumer 压力测试
Consumer 的测试,如果这四个指标(IO,CPU,内存,网络)都不能改变,考虑增加分区数来提升性能。

[hadoop@hadoop102 kafka]$ bin/kafka-consumer-perf-test.sh
--broker-list hadoop102:9092,hadoop103:9092,hadoop104:9092
--topic test --fetch-size 10000 --messages 10000000 --threads 1

参数说明:
–zookeeper 指定 zookeeper 的链接信息
–topic 指定 topic 的名称
–fetch-size 指定每次 fetch 的数据的大小
–messages 总共要消费的消息个数
测试结果说明:

start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec
2019-02-19 20:29:07:566, 2019-02-19 20:29:12:170, 9.5368, 2.0714, 100010, 21722.4153

开始测试时间,测试结束数据,共消费数据 9.5368MB,吞吐量 2.0714MB/s,共消费100010 条,平均每秒消费 21722.4153 条。

项目经验之kafka机器数量计算

Kafka 机器数量(经验公式)=2*(峰值生产速度副本数/100)+1
先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署 Kafka 的数量。
比如我们的峰值生产速度是 50M/s。副本数为 2。
Kafka 机器数量=2
(50*2/100)+ 1=3 台

项目经验之kafka分区数计算

1)创建一个只有 1 个分区的 topic
2)测试这个 topic 的 producer 吞吐量和 consumer 吞吐量。
3)假设他们的值分别是 Tp 和 Tc,单位可以是 MB/s。
4)然后假设总的目标吞吐量是 Tt,那么分区数=Tt / min(Tp,Tc)
例如:producer 吞吐量=20m/s;consumer 吞吐量=50m/s,期望吞吐量 100m/s;
分区数=100 / 20 =5 分区
https://blog.csdn.net/weixin_42641909/article/details/89294698
分区数一般设置为:3-10 个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值