第一章 Kafka概述
1.1 定义
- Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
1.2 消息队列
1.2.1 传统消息队列的应用场景
1.2.2 消息队列的两种模式
- 点对点模式:一对一,消费者主动拉取数据,消息收到后消息清除。消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
- 发布/订阅模式:一对多,消费者消费数据之后不会清除消息。消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
1.3 Kafka简介
1.3.1 什么是Kafka
- Kafka是一个分布式的数据流式传输平台。
- 在流式计算中,Kafka一般用来缓存数据,Spark通过消费Kafka的数据进行计算。
- Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目
- Kafka最初是由LinkedIn公司开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
- Kafka是一个分布式消息队列。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
- 无论是kafka集群,还是consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。
1.3.2 kafka的特点
- 类似于消息队列和商业的消息系统,kafka提供对流式数据的发布和订阅
- kafka提供一种持久的容错的方式存储流式数据
- kafka拥有良好的性能,可以及时地处理流式数据
- Kafka主要集群方式运行在一个或多个可跨多个数据中心的服务器上
- Kafka集群将数据按照类别记录存储,这种类别在kafka中称为主题
- 每条记录由一个键,一个值和一个时间戳组成
- kafka主要应用于
- 需要在多个应用和系统间提供高可靠的实时数据通道
- 一些需要实时传输数据及及时计算的应用
1.4 kafka核心概念
- broker:一台kafka服务器就是一个broker。一个集群由多个broker组成。
- topic:Topic 就是数据主题,kafka建议根据业务系统将不同的数据存放在不同的topic中,Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。一个大的Topic可以分布式存储在多个kafka broker中,Topic可以类比为数据库中的库。
- parition:每个topic可以有多个分区,通过分区的设计,topic可以不断进行扩展。即一个Topic的多个分区分布式存储在多个broker。此外通过分区还可以让一个topic被多个consumer进行消费,以达到并行处理,分区可以类比为数据库中的表。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。
- offset:数据会按照时间顺序被不断第追加到分区的一个结构化的commit log中。每个分区中存储的记录都是有序的,且顺序不可变。这个顺序是通过一个称之为offset的id来唯一标识。因此也可以认为offset是有序且不可变的。在每一个消费者端,会唯一保存的元数据是offset(偏移量),即消费在log中的位置.偏移量由消费者所控制。通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。
- 持久化:Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制。Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题。
- 副本机制:日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性。每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。通过这种机制,既可以保证数据有多个副本,也实现了一个高可用的机制。基于安全考虑,每个分区的Leader和follower一般会错在在不同的broker。
- producer:消息生产者,就是向kafka broker发消息的客户端。生产者负责将记录分配到topic的指定 partition(分区)中。
- consumer:消息消费者,向kafka broker取消息的客户端。每个消费者都要维护自己读取数据的offset。低版本0.9之前将offset保存在Zookeeper中,0.9及之后保存在Kafka“__consumer_offsets”主题中。
- consumer group:每个消费者都会使用一个消费组名称来进行标识。同一个组中的不同的消费者实例,可以分布在多个进程或多个机器上。如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例(单播)。即每个消费者可以同时读取一个topic的不同分区。如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程(广播)。如果需要实现广播,只要每个consumer有一个独立的组就可以了。要实现单播只要所有的consumer在同一个组。一个topic可以有多个consumer group。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。
第二章 kafka快速入门
2.1 安装部署
- kafka的元数据是保存在zookeeper中的所以要先,安装zookeeper
- 在kafka目录下创建logs文件夹
mkdir logs
- 修改配置文件,在kafka目录下的config目录下,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=刚刚创建的logs文件夹
#topic在当前broker上的分区个数
num.partitions=1
#用来恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment文件保留的最长时间,超时将被删除
log.retention.hours=168
#配置连接Zookeeper集群地址
zookeeper.connect=启动了zookeeper的机器,以逗号隔开(hostname:2181)
- 配置环境变量
#KAFKA_HOME
export KAFKA_HOME=kafka目录
export PATH=$PATH:$KAFKA_HOME/bin
- 刷新环境变量
source /etc/profile
- 将配置好的kafka分发的其他机器上,并且修改其他机器的kafka的配置文件server.properties文件中的broker.id,broker.id不能重复。
2.2 kafaka操作
- 启动集群
kafka-server-start.sh -daemon config/server.properties
- 关闭集群
kafka-server-stop.sh stop
2.2.1 kafka命令操作
- 创建主题方法一
- 必须指定分区数和副本数
- 每个broker最多存储一份副本,所以在创建主题时,副本数不能超过当前可用的broker的数量
- kafka集群根据负载均衡的策略,自动将分区分配到对应的broker实例中
kafka-topics.sh --zookeeper master:2181 --create --topic hello --partitions 2 --replication-factor 2
- 创建主题方法二
- 明确告诉kafka,创建多少个分区,以及每个分区的副本到底选择哪个broker
kafka-topics.sh --zookeeper master:2181 --create --topic hello2 --replica-assignment 101:102,102:103
- 查询所有的主题
kafka-topics.sh --zookeeper master:2181 --list
- 查看某个主题详细信息
kafka-topics.sh --zookeeper hadoop102:2181 --describe --topic hello
- 修改主题
- 只能修改分区数(只允许增加)和副本的放置策略
# 修改分区数
kafka-topics.sh --zookeeper master:2181 --alter --topic hello2 --partitions 3
- 删除主题
kafka-topics.sh --zookeeper master:2181 --delete --topic hello1
kafka-topics.sh --zookeeper master:2181 --delete --topic hello1
未完待续。。。。