大数据课程I2——Kafka的架构

news2025/2/27 21:38:28

文章作者邮箱:yugongshiye@sina.cn              地址:广东惠州

 ▲ 本章节目的

⚪ 掌握Kafka的架构;

⚪ 掌握Kafka的Topic与Partition;

一、Kafka核心概念及操作

 

1. producer生产者,可以是一个测试线程,也可以是某种技术框架(比如flume)。

2. producer向kafka生产数据,必须指定向哪个主题去生产数据。

3. 主题topic,主题是由用户(程序员)自己来创建的。

4. 创建主题的指令:

sh kafka-topics.sh --create ---zookeeper hadoop01:2181

--replication-factor 1 --partitions 1 --topic enbook

5. 查看kafka集群的所有主题:

sh kafka-topics.sh --list --zookeeper hadoop01:2181

6. 创建一个主题,需要指定:

①主题名

②主题的分区数量

③分区的副本数量

7. 主题的分区:本质上就是一个分区文件目录。

分区目录的命名规则:主题名 - 分区编号(分区编号从0开始)。

思考:kafka主题引入分区机制的作用?

回答:可以分布式的对一个主题的数据进行存储和管理。

补充:主题的分区数量可以远大于kafka broker 服务器数量。kafka底层尽可能确保分区目录的负载均衡。比如:一个主题有10个分区,有3个broker服务器,则分区目录的数量分配:3-3-4。

8. 启动一个生产者线程。

sh kafka-console-producer.sh --broker-list

hadoop01:9092, hadoop02:9092, hadoop03:9092 --topic enbook

9. producer向kafka指定的主题生产数据,数据最终是存到了分区目录下的log文件中。此外kafka底层会确保每个分区目录的数据达到负载均衡的效果(轮询发送给每个分区目录)。

10. Kafka支持数据的容错机制,即分区数据丢失后,可以恢复。通过副本冗余机制来实现的。即我们在创建主题时,可以指定每个分区有多个副本。

补充:如果出现kafka创建主题分区异常。主要检查zookeeper状态。

sh /home/software/zookeeper-3.4.8/bin/zkServer.sh status

如果报错:Error Start,查看zookeeper.out文件。

11. 分区的副本机制,是为了数据容错。

sh kafka-topics.sh --create --zookeeper hadoop01:2181

--replication-factor 2 --partitions 1 --topic frbook

补充:

①分区副本的数量不能broker服务器数量。

②分区的副本数不宜过多。副本数量越多,集群磁盘的利用率越低。比如3副本,集群利用率就只有33%。

在实际生产环境下,一般3个副本足够了,2个副本也可以。如果是1个副本则没有容错机制,所有一般需要2个或3个副本即可。

综上,Kafka最基础和核心的概念就是topic主题。因为无论是向kafka生产数据,还是从kafka消费数据,都需要指定主题。

主题topic的属性:

①主题名 topic name

②分区数量 partition

③分区的副本数量 replication

12. 从kafka消费数据,消费者可以是一个测试线程,也可以是某种技术框架(Spark,Flink)。

sh kafka-console-consumer.sh --zookeeper hadoop01:2181

--topic enbook --from-beginning

13. kafka的特点:kafka的数据无论消费与否,会一直存在,不会删除。

14. 在调用kafka相关指令时,如果涉及到zookeeper的,写一台即可。如果涉及kafka的,有几个写几个。

二、Kafka主题分区的副本相关补充

 1. kafka是有Leader和Follower概念的,注意:是针对分区的副本而言的,不是针对broker来说的。kafka集群,broker没有主从之分。

2. 分区的副本Leader的作用:无论是生产数据还是消费数据,都是和分区副本的Leader交互的。

3. 如果分区副本的Leader挂掉了,Kafka会从剩余的Follower中选出新Leader。

三、Kafka架构

1. Kafka拓扑结构

1.producer:

消息生产者,发布消息到 kafka 集群的终端或服务。

2.broker:

kafka 集群中包含的服务器。broker (经纪人,消费转发服务)

3.topic:

每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。

4.partition:

partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。

5.consumer:

从 kafka 集群中消费消息的终端或服务。以一个测试线程也可以是某种技术框架(Spark和Flink)。

6.Consumer group:

high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。

即组间数据是共享的,组内数据是竞争的。

7.replica:

partition 的副本,保障 partition 的高可用。

副本数量不宜过多,因为降低进群磁盘的利用率。

比如3副本,磁盘利用率1/3.

8.leader:

replica 中的一个角色, producer 和 consumer 只跟 leader 交互。

9.follower:

replica 中的一个角色,从 leader 中复制数据。

10.controller:

kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。

11.zookeeper:

kafka 通过 zookeeper 来存储集群的 meta 信息。负责管理和监控Kafka集群运行(临时节点+监听机制),包括存储一些元数据信息(比如主题名,主题的分区数,分区的副本数,副本Leader的位置信息,Controller位置等)。

2. 核心APIs

Producer API:也叫做生产者API,应用程序通过这些API可以发布记录的数据流到一个或多个topic上。

Consumer API:消费者API,应用程序可以通过消费者API订阅一个或多个topic上的记录,并对这些记录进行处理。

Streams API:通过调用Streams API,应用程序可以对一个或多个Topic上的记录进行转换处理,同时将处理后的记录发布到一个或多个Topic上。

Connector API:通过Connector API可以构建和运行可重用的生产者和消费者,能够把topic连接到现有的应用程序或数据库。比如,一个数据库连接器可以捕获每个表的变化。

kafka客户端与服务端的通信是基于一个简单的、高性能的、语言无关的TCP协议。这个协议是向下兼容的。我们提供了一个java语言的客户端,并且还有很多语言版本的客户端。

3. Kafka集群结构

分布式(distribution)

Partition分布在kafka集群的服务器上,每个分区配置一定数量的副本在集群服务器上提供容错能力,每个服务器会共享分区进行数据请求的处理。

每个分区都有一个对应的“leader”服务器,同时具有0个或多个“followers”服务器。leader服务器处理分区上的所有读写请求,follower服务器被动的复制leader服务器上的数据。如贵leader失败了,其中一个follower将自动变成leader。每个服务器都会从当分布在其上的分区的某些分区的领导则,而其他分区会在follower服务器上均匀分布。

生产者(producers)

生产者将数据发布到他选择的topic中,生产者负责指定将数据发送到topic中的那个partition上。可以通过简单的循环方式来实现负载均衡,也可以通过一些复杂的语义算法来实现(例如:根据记录中的一些Key)。

消费者(consumers)

每个消费者都隶属于某个消费群,每个发布到topic的记录都会被发送给一个订阅消费者组中的一个消费者实例上。消费则实例可以是一个单独的进程也可以是单独的一台机器。

如果所有的消费者实例都属于同一个消费者组,那么记录将被均匀的发送给消费者实例。

如果消费者实例在不同的消费群中,那么记录将被广播给所有的消费者进程。

如上图,两台服务器的kafka集群上分布四个partition(P0-P3),两个消费群,消费群A有两个消费者实例,消费群B有四个

四、Topic与Partition

1. 基础概念:

 

如上图所示,像一个主题生产数据。数据最终是存储到哥哥分区中。

分区从逻辑上来看,实际上是一个队列。

分区从物理上来看,实际上是一个分区目录。

向分区中存储数据,最终是存到的分区目录下的log文件中。

 

底层实际上是数据磁盘的顺序写操作(往文件末尾追加),所以Kafka的写入性能较高。

如上图所示,从分区中消费数据。Kafka底层有一个offset机制。

Kafka会记录消费者的offset(消费的位置偏移量),便于下一次从正确的位置进行消费。

Kafka记录offset分为两个版本:

旧版本:Kafka是将offset存到zookeeper上的。存在的问题是:会频繁的和zookeeper进行通信交互,即可能会为Zookeeper带来较高的访问负载。

新版本:Kafka自己来管理offset,以消费者组为单位进行管理。

2. 验证思路:

1. 启动一个消费者线程(需要带有消费者属性)

sh kafka-console-consumer.sh --bootstrap-server

hadoop01:9092,hadoop02:9092,hadoop03:9092 --topic enbook

--from-beginning --new-consumer

2. 会发现多出一些目录

__consumer_offsets-11

__consumer_offsets-14

__consumer_offsets-17

3. 即Kafka底层是通过一个主题来进行管理的。

主题名是__consumer_offsets,分区是50个。

__consumer_offsets-0

__consumer_offsets-49

4. 某个消费者组的offset就存在这个50个分区目录中的其中一个中。

存储位置规则:groupId.hashcode%50= 取余结果就是对应的分区目录。

sh kafka-consumer-groups.sh --bootstrap-server

hadoop01:9092,hadoop02:9092,hadoop03:9092 --list --new-consumer

3. Topic和Partition的关系

Topic

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic(主题)。

Partition

Parition是物理上的概念,每个Topic包含一个或多个Partition.。

Topic在逻辑上可以被认为是一个queue,每条消息都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。

为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区,如下图所示。

因为每条消息都被append到该Partition中,属于顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/869292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

青大数据结构【2014】

一、单选 二、简答 为了解决顺序队列的假溢出问题,提出了循环队列,即把存储队列的表从逻辑上看成一个环 判别队列空和满有三种方法: 1)采用计数器判别,空时,计数器为0;满时,计数器为maxsize; 2)另设一个布尔变量以匹配队列的满和空; 3)少用一个元素的空间,约…

无向图邻接矩阵(C++ 代码)

#include<iostream>//无向图邻接矩阵 #define mvnum 100 using namespace std; typedef char Vertextype;//顶点数据类型 typedef int Arctype;//边权值类型 typedef struct {Vertextype vexs[mvnum];//顶点表Arctype arcs[mvnum][mvnum];//邻接矩阵int vexnum, arcnum;/…

解决macOS执行fastboot找不到设备的问题

背景 最近准备给我的备用机Redmi Note 11 5G刷个类原生的三方ROM&#xff0c;MIUI实在是用腻了。搜罗了一番&#xff0c;在XDA上找到了一个基于Pixel Experience开发的ROM&#xff1a;PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal)&#xf…

JavaScript激活严格模式

在JavaScript中&#xff0c;严格模式是一种特殊的模式&#xff0c;通过’use strict’;去激活严格模式&#xff01;在 JavaScript 中&#xff0c;“use strict” 是一种指令&#xff0c;表示在代码运行时启用严格模式&#xff0c;从而禁止使用一些不安全或者不规范的语法&#…

MFC第三十天 通过CToolBar类开发文字工具栏和工具箱、GDI+边框填充以及基本图形的绘制方法、图形绘制过程的反色线模型和实色模型

文章目录 CControlBar通过CToolBar类开发文字工具栏和工具箱CMainFrame.hCAppCMainFrm.cppCMainView.hCMainView.cppCEllipse.hCEllipse.cppCLine.hCLine.cppCRRect .hCRRect .cpp CControlBar class AFX_NOVTABLE CControlBar : public CWnd{DECLARE_DYNAMIC(CControlBar)pro…

【高频面试题】JVM篇

文章目录 一、JVM组成1.什么是程序计数器2.什么是Java堆&#xff1f;3.能不能介绍一下方法区(元空间&#xff09;4.你听过直接内存吗5.什么是虚拟机栈6.垃圾回收是否涉及栈内存&#xff1f;7.栈内存分配越大越好吗&#xff1f;8.方法内的局部变量是否线程安全&#xff1f;9.什么…

ntfy 实现消息订阅和通知(无需注册、无需服务器,太好了)

目录 一、下载 ntfy 的Delphi 库&#xff08;打开ntfy for Delphi 的开源库地址&#xff09; 二、创建发布消息程序 三、订阅&#xff08;接收&#xff09;消息程序 四、说明&#xff1a; 五、程序下载&#xff08;包含库&#xff09;&#xff1a; ntfy 可让你在任何电脑上通…

【muduo】关于自动增长的缓冲区

目录 为什么需要缓冲区自动增长的缓冲区buffer数据结构buffer类 写详细比较费时间&#xff0c;就简单总结下。 总结自Linux 多线程服务端编程&#xff1a;使用 muduo C 网络库 Muduo网络编程&#xff1a; IO-multiplexnon-blocking 为什么需要缓冲区 Non-blocking IO 的核心…

1990-2021年上市公司绿色专利和绿色使用新型申请获得分类号数据

1990-2021年上市公司绿色专利申请获得分类号数据 1、时间&#xff1a;1990-2021年 2、来源&#xff1a;国家知识产权局 3、指标&#xff1a; 绿色专利申请数量&#xff08;分A类 B类C类D类E类F类G类H类&#xff09;、绿色专利获得数量&#xff08;分A类 B类C类D类E类F类G类…

商业智能BI,如何区别联机事务处理(OLTP)和联机分析处理(OLAP)

商业智能(Business Intelligence&#xff0c;简称&#xff1a;BI)&#xff0c;又称商业智慧或商务智能&#xff0c;指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。 商业智能BI - 派可数据数据可视化分析平台 定义为下列软件工具…

容器虚拟化基础之NameSpace

“只想从这无边的寂寞中逃出来。” 一、什么是虚拟化、容器化&#xff1f; 物理机:实际的服务器或者计算机。 这是相对于虚拟机而言的对实体计算机的称呼&#xff0c;物理机提供虚拟机以硬件环境&#xff0c;有时候也称为"宿主"或"寄主"。 虚拟机: 指通过软…

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models 1. 文章简介2. 文章概括3 文章重点技术3.1 预训练Pretraining3.1.1 预训练细节3.1.2 Llama2模型评估 3.2 微调Fine-tuning3.2.1 Supervised Fine-Tuning(FT)3.2.2 Reinforcement Learning with Human Feedback(…

mysql 技术总结

一、mysql 索引&#xff08;左小右大&#xff09; 下图中为二叉树 mysql索引类型以及数据结构 BTREE结构 BTree又叫多路平衡搜索树&#xff0c;一颗m叉的BTree特性如下&#xff1a; 树中每个节点最多包含m个孩子。 除根节点与叶子节点外&#xff0c;每个节点至少有[ceil(m/2…

SSH连接阿里服务器搭建JAVA环境

远程连接ssh windows利用PowerShell远程连接ssh 1.打开PowerShell 方法1 1&#xff09;.同时按下Windows R键以弹出“运行”对话框 2&#xff09;.在框中键入PowerShell&#xff0c;然后单击OK(确定)按钮 方法2 1&#xff09;在任意目录下&#xff0c;shift右键&#…

每日一题——寻找旋转排序数组中的最小值(I)

寻找旋转排序数组中的最小值——I 题目链接 思路 首先我们以数组[1,2,3,4,5,6,7]举个例子&#xff0c;经过旋转后它无非就这两种情况&#xff1a; 情况一&#xff1a;旋转过后数组变成两段有序数列&#xff1a; 情况二&#xff1a;旋转过后数组不变&#xff0c;仍然有序&…

流量,日志分析--理论

提供资料&#xff1a; Wireshark 基本语法&#xff0c;基本使用方法&#xff0c;及包过虑规则 : https://blog.csdn.net/qq_17457175/article/det ails/53019490 ctf 常见流量分析题目类型 : https://ctf-wiki.org/misc/traffic/introduction/ windows 日志 : https://jone…

内网横向移动—ARP攻击图片捕捉数据劫持DNS劫持

内网横向移动—ARP攻击&图片捕捉&数据劫持&DNS劫持 1. ARP1.1. APR介绍1.1.1. ARP工作原理1.1.2. APR欺骗工作原理 1.2. 环境准备1.3. 适用场景 2. ARP断网攻击演示2.1. 使用kali进行演示2.1.1. nmap判断存活2.1.2. 安装工具2.1.3. 攻击Windows 10虚拟机2.1.3.1. 查…

VMware 16 Pro将电脑里的文件移动到虚拟机中【附带可能出现的问题和解决】

VMware 16 Pro将电脑里的文件移动到虚拟机中 1.使用VM tools 打开VM ware会出现下面的&#xff0c;直接点击安装。 点击下一步 选哪个都行 之后会重启虚拟机&#xff0c;然后就可以使用了。 我没有程序可以打开压缩包&#xff0c;显示我的虚拟机网络没法用&#xff0c;点击…

Redis实战案例26-签到功能

1. BitMap 假如用户数量为一千万&#xff0c;平均每人每年签到次数为 10 次&#xff0c;则这张表一年的数据量为 1 亿条&#xff1b; 而每签到一次需要使用&#xff08;8 8 1 1 3 1&#xff09;共 22 字节的内存&#xff0c;一个月则最多需要 600 多字节&#xff0c;如果是…

配置Arduino+ESP32走过的巨坑

项目场景&#xff1a; 前几天去淘宝买了块ESP32拿来用&#xff0c;配置Arduino最新版ESP32 2.0.11走过的巨坑。 问题描述 先安装好了ArduinoIDE最新版&#xff08;教程里介绍去官网下&#xff09;&#xff0c;然后配置ESP32开发板&#xff0c;后面发现安装速度惊人。 去找加速…