Kafka入门教程
1. 概述
1.1 消息队列
总的来说,消息队列可以分为点对点模式、发布订阅模式
(1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)
点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息, 而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者 接收处理,即使有多个消息监听者也是如此。
(2)发布订阅模式(一对多,数据生产后,推送给所有订阅者)
发布订阅模型则是一个基于推送的消息传送模型。发布订阅模型可以有多种不同的订阅 者,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息,即 使当前订阅者不可用,处于离线状态。
1.2 什么是Kafka
在流式计算中,Kafka 一般用来缓存数据,作为大数据处理系统中的一个中间件。
(1)Apache Kafka 是一个开源消息系统,由 Scala 写成。是由 Apache 软件基金会开发的 一个开源消息系统项目。
(2)Kafka 最初是由 LinkedIn 公司开发,并于 2011 年初开源。2012 年 10 月从 Apache Incubator 毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
(3))Kafka 是一个分布式消息队列。Kafka 对消息保存时根据 Topic 进行归类,发送消息 者称为 Producer,消息接受者称为 Consumer,此外 Kafka 集群有多个 Kafka 实例组成,每个实例(server)称为 broker。
(4)无论是 Kafka 集群,还是 consumer 都依赖于 zookeeper 集群保存一些 meta 信息, 来保证系统可用性。
1.3 Kafka架构
(1)Producer :消息生产者,就是向 Kafka broker 发消息的客户端;
(2)Consumer :消息消费者,向 Kafka broker 取消息的客户端;
(3)Topic :可以理解为一个队列;
(4)Consumer Group:这是Kafka用来实现一个topic消息的广播(发给所有的consumer) 和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个 CG。topic 的消息会复制 (不是真的复制,是概念上的)到所有的 CG,但每个 partition 只会把消息发给该 CG 中的一 个 consumer。如果需要实现广播,只要每个 consumer 有一个独立的 CG 就可以了。要实现 单播只要所有的 consumer 在同一个 CG。用 CG 还可以将 consumer 进行自由的分组而不需 要多次发送消息到不同的 topic;
(5)Broker :一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic;
(6)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息 都会被分配一个有序的 id(offset)。Kafka 只保证按一个 partition 中的顺序将消息发给 consumer,不保证一个 topic 的整体(多个 partition 间)的顺序;
(7)Offset:Kafka 的存储文件都是按照 offset.kafka 来命名,用 offset 做名字的好处是方便查 找。例如你想找位于 2049 的位置,只要找到 2048.kafka 的文件即可。当然 the first offset 就 是 00000000000.kafka。
2. Kafka集群部署
Kafka集群依赖ZooKeeper,因此,启动Kafka集群前,应启动zookeeper集群。否则会报错。
2.1 集群部署
(1)修改配置文件
下载好对应的tar包并解压后,找到config
目录下的server.propertites
文件,修改log.dirs
配置项,即配置Kafka运行日志的存放路径。
(2)启动
1 | bin/kafka-server-start.sh config/server.properties & |
&
指后台启动。
(3)关闭
1 | bin/kafka-server-stop.sh stop |
(4)发生错误日志检查
当启动或运行时发生故障后,可以检查logs/server.log
文件进行故障排查。
2.2 Kafka命令行操作
(1)查看当前服务器中所有topic
1 | bin/kafka-topics.sh --zookeeper localhost:2181 --list |
(2)创建topic
1 | bin/kafka-topics.sh --zookeeper localhost:2181 \ |
选项说明:
—topic 定义 topic 名
—replication-factor 定义副本数
—partitions 定义分区数
(3)删除topic
1 | bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic first |
注意:需要server.properties
中设置delete.topic.enable=true
否则只是标记删除或者直接重启。
(4)发送(生产)消息
1 | bin/kafka-console-producer.sh \ |
(5)消费消息
1 | bin/kafka-console-consumer.sh \ |
(6)查看某个topic的详情
1 | bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic first |
3. Kafka工作流程分析