Kafka

本文全面介绍Kafka,从定义、消息队列模式到Kafka的核心概念、架构深入,涵盖安装部署、命令行操作、生产者与消费者的详细机制,以及Kafka在大数据实时处理中的应用。此外,还探讨了自定义Interceptor和监控工具,如Kafka Manager与Kafka Monitor,以及Flume对接Kafka的配置实例。
摘要由CSDN通过智能技术生成

Kafka

第1章 Kafka概述

1.1 定义

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

1.2 消息队列

1.2.1 传统消息队列的应用场景

 

1.2.2 消息队列的两种模式

(1)点对点模式一对一,消费者主动拉取数据,消息收到后消息清除)

消息生产者生产消息发送到Queue中,然后消息消费者从Queue中取出并且消费消息。

消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

(2)发布/订阅模式一对多,消费者消费数据之后不会清除消息)

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。

 

1.3 Kafka简介

1.3.1 什么是Kafka

       Kafka是一个分布式的数据流式传输平台。

在流式计算中,Kafka一般用来缓存数据,Spark通过消费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.4 Kafka的特点

作为一个数据流式传输平台,kafka有以下三大特点:

  1. 类似于消息队列和商业的消息系统,kafka提供对流式数据的发布和订阅
  2. kafka提供一种持久的容错的方式存储流式数据
  3. kafka拥有良好的性能,可以及时地处理流式数据

 

基于以上三种特点,kafka在以下两种应用之间流行:

       ①需要在多个应用和系统间提供高可靠的实时数据通道

    ②一些需要实时传输数据及及时计算的应用

此外,kafka还有以下特点:

    1. Kafka主要集群方式运行在一个或多个可跨多个数据中心的服务器上
    2. Kafka集群将数据按照类别记录存储,这种类别在kafka中称为主题
    3. 每条记录由一个键,一个值和一个时间戳组成

1.4 Kafka核心概念

1.4.0 Broker

一台kafka服务器就是一个broker。一个集群由多个broker组成。

1.4.1 Topic

       Topic 就是数据主题,kafka建议根据业务系统将不同的数据存放在不同的topic中!Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。一个大的Topic可以分布式存储在多个kafka broker中!Topic可以类比为数据库中的库!

 

1.4.2 Partition

       每个topic可以有多个分区,通过分区的设计,topic可以不断进行扩展!即一个Topic的多个分区分布式存储在多个broker!

此外通过分区还可以让一个topic被多个consumer进行消费!以达到并行处理!分区可以类比为数据库中的表!

kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。

1.4.3 Offset

       数据会按照时间顺序被不断第追加到分区的一个结构化的commit log中!每个分区中存储的记录都是有序的,且顺序不可变!

这个顺序是通过一个称之为offset的id来唯一标识!因此也可以认为offset是有序且不可变的!

在每一个消费者端,会唯一保存的元数据是offset(偏移量),即消费在log中的位置.偏移量由消费者所控制。通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。

这些细节说明Kafka 消费者是非常廉价的—消费者的增加和减少,对集群或者其他消费者没有多大的影响。比如,你可以使用命令行工具,对一些topic内容执行 tail操作,并不会影响已存在的消费者消费数据。

 

 

图1 Topic拓扑结构

 

 

图2 数据流

1.4.4 持久化

Kafka 集群保留所有发布的记录—无论他们是否已被消费—并通过一个可配置的参数——保留期限来控制。举个例子, 如果保留策略设置为2天,一条记录发布后两天内,可以随时被消费,两天过后这条记录会被清除并释放磁盘空间。

Kafka的性能和数据大小无关,所以长时间存储数据没有什么问题。

1.4.5 副本机制

日志的分区partition (分布)在Kafka集群的服务器上。每个服务器在处理数据和请求时,共享这些分区。每一个分区都会在已配置的服务器上进行备份,确保容错性。

每个分区都有一台 server 作为 “leader”,零台或者多台server作为 follwers 。leader server 处理一切对 partition (分区)的读写请求,而follwers只需被动的同步leader上的数据。当leader宕机了,followers 中的一台服务器会自动成为新的 leader。通过这种机制,既可以保证数据有多个副本,也实现了一个高可用的机制!

基于安全考虑,每个分区的Leader和follower一般会错在在不同的broker!

1.4.6 Producer

消息生产者,就是向kafka broker发消息的客户端。生产者负责将记录分配到topic的指定 partition(分区)中

 

1.4.7 Consumer

       消息消费者,向kafka broker取消息的客户端。每个消费者都要维护自己读取数据的offset。低版本0.9之前将offset保存在Zookeeper中,0.9及之后保存在Kafka的“__consumer_offsets”主题中。

 

1.4.8 Consumer Group

每个消费者都会使用一个消费组名称来进行标识。同一个组中的不同的消费者实例,可以分布在多个进程或多个机器上!

如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例(单播)。即每个消费者可以同时读取一个topic的不同分区!

如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程(广播)。

如果需要实现广播,只要每个consumer有一个独立的组就可以了。要实现单播只要所有的consumer在同一个组。

一个topic可以有多个consumer group。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。

1.5 Kafka基础架构

 

第2章 Kafka快速入门

2.1 安装部署

2.1.1 集群规划

hadoop102                                hadoop103                         hadoop104

zk                                              zk                                       zk

kafka                                         kafka                                  kafka

2.1.2 jar包下载

http://kafka.apache.org/downloads.html

 

2.1.3 集群部署

1)解压安装包

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

2)修改解压后的文件名称

[jack@hadoop102 module]$ mv kafka_2.11-0.11.0.0/ kafka

3)在/opt/module/kafka目录下创建logs文件夹

[jack@hadoop102 kafka]$ mkdir logs

4)修改配置文件

[jack@hadoop102 kafka]$ cd config/

[jack@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

log.dirs=/opt/module/kafka/datas

#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

5)配置环境变量

[jack@hadoop102 module]$ sudo vi /etc/profile

 

#KAFKA_HOME

export KAFKA_HOME=/opt/module/kafka

export PATH=$PATH:$KAFKA_HOME/bin

 

[jack@hadoop102 module]$ source /etc/profile

6)分发安装包

[jack@hadoop102 module]$ xsync kafka/

       注意:分发之后记得配置其他机器的环境变量

7)分别在hadoop103和hadoop104上修改配置文件/opt/module/kafka/config/server.properties中的broker.id=1、broker.id=2

       注:broker.id不得重复

8)启动集群

依次在hadoop102、hadoop103、hadoop104节点上启动kafka

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

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

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

9)关闭集群

[jack@hadoop102 kafka]$ bin/kafka-server-stop.sh stop

[jack@hadoop103 kafka]$ bin/kafka-server-stop.sh stop

[jack@hadoop104 kafka]$ bin/kafka-server-stop.sh stop

10)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'

echo $?

done

2.2 Kafka命令行操作

1)查看当前服务器中的所有topic

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

2)创建topic

[jack@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --create --replication-factor 3 --partitions 1 --topic first

选项说明:

--topic 定义topic名

--replication-factor  定义副本数

--partitions  定义分区数

3)删除topic

[jack@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --delete --topic first

需要server.properties中设置delete.topic.enable=true否则只是标记删除。

4)发送消息

[jack@hadoop102 kafka]$ bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first

>hello world

>jack  jack

5)消费消息

[jack@hadoop102 kafka]$ bin/kafka-console-consumer.sh \

--zookeeper hadoop102:2181 --topic first

 

[jack@hadoop102 kafka]$ bin/kafka-console-consumer.sh \

--bootstrap-server hadoop102:9092 --topic first

 

[jack@hadoop102 kafka]$ bin/kafka-console-consumer.sh \

--bootstrap-server hadoop102:9092 --from-beginning --topic first

--from-beginning:会把主题中以往所有的数据都读取出来。

6)查看某个Topic的详情

[jack@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --describe --topic first

7)修改分区数

[jack@hadoop102 kafka]$ bin/kafka-topics.sh --zookeeper hadoop102:2181 --alter --topic first --partitions 6

第3章 Kafka架构深入

3.1 Kafka工作流程及文件存储机制

 

Kafka中消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。

topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log文件,该log文件中存储的就是producer生产的数据。Producer生产的数据会被不断追加到该log文件末端,且每条数据都有自己的offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

 

由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,Kafka采取了分片索引机制,将每个partition分为多个segment。

每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等的segment(段)数据文件中(每个segment 文件中消息数量不一定相等),这种特性也方便old segment的删除,即方便已被消费的消息的清理,提高磁盘的利用率。每个partition只需要支持顺序读写就行,segment的文件生命周期由服务端配置参数(log.segment.bytes,log.roll.{ms,hours}等若干参数)决定。

每个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值