主页 > 新闻资讯 > 大数据学习:Kafka消息读写原理

大数据学习:Kafka消息读写原理

作者:张老师 浏览次数: 2020-12-14 16:42
作为大数据技术生态当中的代表性框架之一,Kafka作为消息总线使用,正在成为越来越普遍的趋势,而对于Kafka框架的学习,也需要倾注更多的时间去深入地理解和掌握。今天的大数据学习分享,我们主要来讲讲Kafka消息读写原理。

所谓的消息读写,自然来说就要分为数据写入和数据读取两个大的阶段——

大数据学习:Kafka消息读写原理

Kafka数据写入:

kafka会把数据写入到磁盘中,为了优化写入速度Kafka采用了两个技术,顺序写入和MMFile。

每一个Partition其实都是一个文件,收到消息后Kafka会把数据插入到文件末尾。

都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示读取到了第几条数据。

如果不删除硬盘肯定会被撑满,所以Kakfa提供了两种策略来删除数据。一是基于时间,二是基于partition文件大小。

即便是顺序写入硬盘,硬盘的访问速度还是不可能追上内存。所以Kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内存提高I/O效率。

Memory Mapped Files:内存映射文件,它的工作原理是直接利用操作系统的Page来实现文件到物理内存的直接映射。完成映射之后你对物理内存的操作会被同步到硬盘上。

使用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销(调用文件的read会把数据先放到内核空间的内存中,然后再复制到用户空间的内存中。)

缺点:不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。

Kafka提供了一个参数:producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫同步(sync);写入mmap之后立即返回Producer不调用flush叫异步(async)。

Kafka数据读取(零拷贝):

传统模式下,当需要对一个文件进行传输的时候,其具体流程细节如下:
  • 调用read函数,文件数据被copy到内核缓冲区
  • read函数返回,文件数据从内核缓冲区copy到用户缓冲区
  • write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。
  • 数据从socket缓冲区copy到相关网卡接口。
  • 在这个过程当中,文件数据实际上是经过了四次copy操作:
  • 硬盘—>内核buf—>用户buf—>socket相关缓冲区—>网卡接口

在内核版本2.1中,引入了sendfile系统调用,以简化网络上和两个本地文件之间的数据传输。sendfile的引入不仅减少了数据复制,还减少了上下文切换。

运行流程如下:

sendfile系统调用,文件数据被copy至内核缓冲区

再从内核缓冲区copy至内核中socket相关的缓冲区

最后在socket相关的缓冲区copy到网卡接口

批量压缩

在很多情况下,系统的瓶颈不是CPU或磁盘,而是网络IO。

Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩。

Kafka允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩。Kafka支持多种压缩协议,包括Gzip和Snappy压缩协议。

关于大数据学习,Kafka消息读写原理,以上就为大家做了大致的讲解了。Kafka在消息读写上,致力于提供更快的高性能服务,不管是在写入阶段,还是在读取阶段,也都采取了相应的策略。成都加米谷大数据,专业大数据培训机构,大数据开发、数据分析与挖掘,零基础班本月正在招生中,课程大纲及试学视频,可联系客服获取!
热点排行
推荐文章
立即申请>>