大数据之Kafka内部原理详细介绍

  • 目录
    • 前言:
    • 1、Kafka整体结构
    • 2、Consumer与topic关系
    • 3、Kafka消息的分发
    • 4、Consumer的负载均衡
    • 5、kafka文件存储机制
    • 总结:

目录

前言:

本篇文章所介绍的内容还是以了解为主,主要目的还是为了对Kafka有一个更深入的理解。主要介绍了以下几个知识点:Kafka的负载均衡、Producer生产数据、Kafka文件存储机制等(不过总感觉这篇文章总结的乱七八糟。。请大家多多包涵,随着后面的学习,自己会再回过头来进行修改)

1、Kafka整体结构

Kafka名词解释和工作方式

  • kafka:是一个生产-消费模型类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据。
  • Producer :消息生产者,就是向kafka broker发消息的客户端。数据的分发策略由producer决定,默认是defaultPartition Utils.abs(key.hashCode) % numPartitions
  • Consumer :消息消费者,向kafka broker取消息的客户端
  • Topic :可以理解为一个队列或者目标发送的目的地,这是一个逻辑上的概念,落到磁盘上是一个partition的目录。partition的目录中有多个segment组合(index,log),一个Topic对应多个partition[0,1,2,3],一个partition对应多个segment组合。一个segment有默认的大小是1G。每个partition可以设置多个副本(replication-factor 1),会从所有的副本中选取一个leader出来。所有读写操作都是通过leader来进行的。特别强调,和mysql中主从有区别,mysql做主从是为了读写分离,在kafka中读写操作都是leader。
  • Consumer Group(CG):数据消费者组,ConsumerGroup可以有多个,每个ConsumerGroup消费的数据都是一样的。可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据,组员之间不能重复消费。
  • Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。只管数据存储,不管是谁生产,不管是谁消费。
  • Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。
  • Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。

2、Consumer与topic关系

本质上kafka只支持Topic;

  • 每个group中可以有多个consumer,每个consumer属于一个consumer group;
    通常情况下,一个group中会包含多个consumer,这样不仅可以提高topic中消息的并发消费能力,而且还能提高”故障容错”性,如果group中的某个consumer失效那么其消费的partitions将会有其他consumer自动接管。
  • 对于Topic中的一条特定的消息,只会被订阅此Topic的每个group中的其中一个consumer消费,此消息不会发送给一个group的多个consumer;那么一个group中所有的consumer将会交错的消费整个Topic,每个group中consumer消息消费互相独立,我们可以认为一个group是一个”订阅”者。
  • 在kafka中,一个partition中的消息只会被group中的一个consumer消费(同一时刻);
    一个Topic中的每个partions,只会被一个”订阅者”中的一个consumer消费,不过一个consumer可以同时消费多个partitions中的消息。
  • kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息

kafka只能保证一个partition中的消息被某个consumer消费时是顺序的;事实上,从Topic角度来说,当有多个partitions时,消息仍不是全局有序的。

3、Kafka消息的分发

Producer客户端负责消息的分发

  • kafka集群中的任何一个broker都可以向producer提供metadata信息,这些metadata中包含”集群中存活的servers列表”/”partitions leader列表”等信息;
  • 当producer获取到metadata信息之后, producer将会和Topic下所有partition
    leader保持socket连接;
  • 消息由producer直接通过socket发送到broker,中间不会经过任何”路由层”,事实上,消息被路由到哪个partition上由producer客户端决定;

比如可以采用”random”“key-hash”“轮询”等,如果一个topic中有多个partitions,那么在producer端实现”消息均衡分发”是必要的。
在producer端的配置文件中,开发者可以指定partition路由的方式。

Producer消息发送的应答机制
ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。
设置发送数据是否需要服务端的反馈,有三个值0,1,-1
0: producer不会等待broker发送ack
1: 当leader接收到消息之后发送ack
-1: 当所有的follower都同步消息成功后发送ack
request.required.acks=0

4、Consumer的负载均衡

当一个group中,有consumer加入或者离开时,会触发partitions均衡.均衡的最终目的,是提升topic的并发消费能力,步骤如下:

  1. 假如topic1,具有如下partitions: P0,P1,P2,P3
  2. 加入group中,有如下consumer: C1,C2
  3. 首先根据partition索引号对partitions排序: P0,P1,P2,P3
  4. 根据consumer.id排序: C0,C1
  5. 计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
  6. 然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1)
    • M -1)]

这里写图片描述

5、kafka文件存储机制

5.1、Kafka文件存储基本结构

  • 在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。
  • 每个partition(目录)相当于一个巨型文件被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。默认保留7天的数据。

这里写图片描述
- 每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定。(什么时候创建,什么时候删除)
这里写图片描述

5.2、Kafka Partition Segment

  • Segment file组成:由2大部分组成,分别为index file和data file,此2个文件一一对应,成对出现,后缀”.index”和“.log”分别表示为segment索引文件、数据文件。

这里写图片描述

  • Segment文件命名规则:partion全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值。数值最大为64位long大小,19位数字字符长度,没有数字用0填充。
  • 索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。

3,497:当前log文件中的第几条信息,存放在磁盘上的那个地方

上述图中索引文件存储大量元数据,数据文件存储大量消息,索引文件中元数据指向对应数据文件中message的物理偏移地址。
其中以索引文件中元数据3,497为例,依次在数据文件中表示第3个message(在全局partiton表示第368772个message)、以及该消息的物理偏移地址为497。

5.3、Kafka 查找message
读取offset=368776的message,需要通过下面2个步骤查找。
这里写图片描述

5.3.1、查找segment file
00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0
00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1
00000000000000737337.index的起始偏移量为737338=737337 + 1
其他后续文件依次类推。
以起始偏移量命名并排序这些文件,只要根据offset 二分查找文件列表,就可以快速定位到具体文件。当offset=368776时定位到00000000000000368769.index和对应log文件。
5.3.2、通过segment file查找message
当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址
然后再通过00000000000000368769.log顺序查找直到offset=368776为止。

总结:

需要了解的知识点有以下几个:
1、Kafka的内部名词及各个名词的含义及作用。
2、Kafka消息分发的机制。
3、Consumer的负载均衡机制。
4、Kafka文件存储机制。
总感觉这篇文章总结的比较乱,也许可以把其中的模块拆开来写吧。Anyway,就先总结成这样吧,以后有机会会再修改。

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

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

相关文章

【python】urllib和urllib3,requests 简要概括---笔记

urllib和urllib3,requestsurl:协议://存放资源的地址(域名)/具体的资源https://bj.lianjia.com/zufang/dghfjhsjdf648.htmlurllib.request 用来发出请求urllib.parseurllib.request.urlopen(str) --->response对象request urllib.reques…

JS与APP原生控件交互

“热更新”、“热部署”相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显得重要,不可能每次发布一个活动,都要发布一个现版本&a…

《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销

本节书摘来异步社区《脱颖而出——成功网店经营之道》一书中的第2章,第2.6节,作者: 何小健 责编: 赵轩, 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 连横:返利模式的应用及分销 脱颖而出——成功网店…

【python】os模块 递归删除文件夹所有文件 --笔记

os.environ 获取系统的环境变量 os.name nt -- windows \r\n | posix --- Linux \nos.path: import osprint(os.environ) print(os.environ[OS])print(os.path.abspath(t1/file01.py)) # 获取绝对路径 print(os.path.isabs(t1/file01.py)) # 判断所给的路径是否是一个绝对…

大数据之Spark集群安装及简单使用

目录1、Spark集群安装1.1. 安装 2、启动Spark Shell2.1、启动spark shell2.2、在spark shell中编写WordCount程序 目录 1、Spark集群安装 1.1. 安装 1.1.1. 机器部署 准备两台以上Linux服务器,安装好JDK1.7 1.1.2. 下载Spark安装包 下载地址:ht…

《C和C++代码精粹》——1.7 类型安全I/O

本节书摘来自异步社区出版社《C和C代码精粹》一书中的第1章第1.7节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 类型安全I/O C和C代码精粹当然每个C程序员都曾经使用过printf的错误格式描述符号。…

大数据之Spark简介及RDD说明

目录前言:1、Spark概述1.1、什么是Spark(官网:http://spark.apache.org)1.2、为什么要学Spark1.3、Spark特点 2、RDD概述2.1、什么是RDD2.2、RDD的属性2.3、创建RDD的两种方式2.4、RDD编程API2.5、RDD的依赖关系2.6、RDD的缓存2.7…

Python3中urlopen()详解

一. 简介 urllib.request.urlopen()函数用于实现对目标url的访问。 函数原型如下:urllib.request.urlopen(url, dataNone, [timeout, ]*, cafileNone, capathNone, cadefaultFalse, contextNone)  url: 需要打开的网址 data:Post提交的数据 timeo…

python面向对象实现简易银行管理员页面系统

银行管理员页面系统设计:card 类: cardId password moneyuser 类: username phone id cards[]银行的工作人员: 账号 密码 登录 展现管理系统所有功能Bank类:开户取钱存钱转账销户查账解锁... import pickle import random# 银行卡 import time#card 类…

单子模式

package test; class aceing { /** param args */ private static aceing ace; public aceing() { super(); System.out.println("aceing类中的无参构造器调用了"); } public static aceing getAceing() { if(ace null) { ace new aceing(); } return ace; }} pack…

《塑造互联网思维的企业》一一第4章 全球商务向社会化媒体的转变

第4章 全球商务向社会化媒体的转变 塑造互联网思维的企业社会化媒体在发达国家的广泛采用已是我们所熟知的,它在社会和全球文化产生的大范围变革中至关重要。为了完全了解其中的原因,有必要探究一下那些推动社会化商务的复杂且相互关联的因素的共同影响…

大数据之SparkSQL简介及DataFrame的使用

目录前言:1、Spark SQL1.1、Spark SQL概述1.2、DataFrames1.3、DataFrame常用操作 总结: 目录 前言: 本文主要介绍下SparkSQL以及SparkSQL的简单使用。这里只是做了一个非常简单的介绍,后续工作中如果有用到相关的知识&#xff…

python的各种推导式(列表推导式、字典推导式、集合推导式)

python的各种推导式(列表推导式、字典推导式、集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Pyt…

原生js实现jquery库中选择器的功能(jquery库封装一)

今天是2017.1.1,新的一天,新的一年,新的一年里继续夯实基础知识,在工作中多些项目,多思考,多总结,前端是不断更新,在更新的过程中也是发现乐趣和挑战自我的过程,希望年轻…

Ubantu下使用vi时,方向键变字母输出、退格键无法删除字符的解决办法

目录前言:一、编辑/etc/vim/vimrc.tiny二、安装vim full版本三、添加”.vimrc”文件 目录 前言: 最近由于要玩TensorFlow,所以把尘封已久的Ubantu给打开了,不过配置网络的时候,算是一团糟,出现了在插入模…

《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述

本节书摘来自华章计算机《Python爬虫开发与项目实战》一书中的第3章,第3.1节,作者:范传辉著,更多章节内容可以访问云栖社区“华章计算机”公众号查看 第3章 初识网络爬虫 从本章开始,将正式涉及Python爬虫的开发。本章…

【python】解决:TypeError: can't send non-None value to a just-started generator

在一个生成器函数未启动之前,是不能传递数值进去。必须先传递一个None进去或者调用一次next(g)方法,才能进行传值操作 def product(c):# c.send(None)for i in range(5):print("生产者产生数据%d"%i)r c.send(str(i))print("消费者消费了…

Shell脚本与vi编辑器:vi启动与退出、工作模式、命令大全

Vi简介 Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序。Vi不是排版程序,只是一个纯粹的文本编辑程序。Vi是全屏幕文本编辑器,它没有菜单,只有命令。Vi不是基于窗口的,所以,这个多用途编辑程序可以用于在任何…

windows环境下,如何在Pycharm下安装TensorFlow环境

文章目录目录前言:1.安装Anaconda2.安装Tensorflow3.其他问题4.在pycharm中使用tensorflow目录 前言: 最近由于工作需要要使用TensorFlow,所以只能狂补相关的知识。本来博主打算在Ubantu上玩,但是由于一些原因还是放弃了这个想法…

python面向对象实现简易银行管理员页面系统【导入自定义模块】

main.py 人 类名:Person 属性:姓名 身份证号 电话 卡 行为:卡 类名:Card 属性:卡号 密码 余额 行为:银行 类名:Bank 属性:用户列表 提款机提款机 类名:ATM 属性&#xf…