>>分享SPSS,Hadoop等大数据处理技术,以及分布式架构以及集群系统的构建 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21313 个阅读者 刷新本主题
 * 贴子主题:  kafka作为流式处理的上一层,为什么吞吐量那么大? 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-21 22:43:20     消息  查看  搜索  好友  邮件  复制  引用

  

Kafka为什么速度快、吞吐量大

Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万。但是很多使用过Kafka的人,经常会被问到这样一个问题,Kafka为什么速度快,吞吐量大;大部分被问的人都是一下子就懵了,或者是只知道一些简单的点,本文就简单的介绍一下Kafka为什么速度快,吞吐量大。

一、顺序读写

众所周知Kafka是将消息记录持久化到本地磁盘中的,一般人会认为磁盘读写性能差,可能会对Kafka性能如何保证提出质疑。实际上不管是内存还是磁盘,快或慢关键在于寻址的方式,磁盘分为顺序读写与随机读写,内存也一样分为顺序读写与随机读写。基于磁盘的随机读写确实很慢,但磁盘的顺序读写性能却很高,一般而言要高出磁盘随机读写三个数量级,一些情况下磁盘顺序读写性能甚至要高于内存随机读写,这里给出著名学术期刊 ACM Queue 上的一张性能对比图:
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     磁盘的顺序读写是磁盘使用模式中最有规律的,并且操作系统也对这种模式做了大量优化,Kafka就是使用了磁盘顺序读写来提升的性能。Kafka的message是不断追加到本地磁盘文件末尾的,而不是随机的写入,这使得Kafka写入吞吐量得到了显著提升 。

二、Page Cache

为了优化读写性能,Kafka利用了操作系统本身的Page Cache,就是利用操作系统自身的内存而不是JVM空间内存。这样做的好处有:
  • 避免Object消耗:如果是使用 Java 堆,Java对象的内存消耗比较大,通常是所存储数据的两倍甚至更多。
  • 避免GC问题:随着JVM中数据不断增多,垃圾回收将会变得复杂与缓慢,使用系统缓存就不会存在GC问题
相比于使用JVM或in-memory cache等数据结构,利用操作系统的Page Cache更加简单可靠。首先,操作系统层面的缓存利用率会更高,因为存储的都是紧凑的字节结构而不是独立的对象。其次,操作系统本身也对于Page Cache做了大量优化,提供了 write-behind、read-ahead以及flush等多种机制。再者,即使服务进程重启,系统缓存依然不会消失,避免了in-process cache重建缓存的过程。

     通过操作系统的Page Cache,Kafka的读写操作基本上是基于内存的,读写速度得到了极大的提升。

三、零拷贝

这里主要讲的是Kafka利用 linux 操作系统的 “零拷贝(zero-copy)” 机制在消费端做的优化。首先来了解下数据从文件发送到socket网络连接中的常规传输路径:
  • 操作系统从磁盘读取数据到内核空间( kernel space )的Page Cache
  • 应用程序读取Page Cache的数据到用户空间(user space)的缓冲区
  • 应用程序将用户空间缓冲区的数据写回内核空间到socket缓冲区( socket buffer )
  • 操作系统将数据从socket缓冲区复制到网络发送的NIC缓冲区
这个过程包含4次copy操作和2次系统上下文切换,性能其实非常低效。linux操作系统 “零拷贝” 机制使用了sendfile方法, 允许操作系统将数据从Page Cache 直接发送到网络,只需要最后一步的copy操作将数据复制到 NIC 缓冲区, 这样避免重新复制数据 。示意图如下:

     点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     通过这种 “零拷贝” 的机制,Page Cache 结合 sendfile 方法,Kafka消费端的性能也大幅提升。这也是为什么有时候消费端在不断消费数据时,我们并没有看到磁盘io比较高,此刻正是操作系统缓存在提供数据。

四、分区分段

Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点。每个partition对应了操作系统上的一个文件夹,partition实际上又是按照segment分段存储的。这也非常符合分布式系统分区分桶的设计思想。

     通过这种分区分段的设计,Kafka的message消息实际上是分布式存储在一个一个小的segment中的,每次文件操作也是直接操作的segment。为了进一步的查询优化,Kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据操作的并行度。

总结

Kafka采用顺序读写、Page Cache、零拷贝以及分区分段等这些设计,再加上在索引方面做的优化,另外Kafka数据读写也是批量的而不是单条的,使得Kafka具有了高性能、高吞吐、低延时的特点。这样,Kafka提供大容量的磁盘存储也变成了一种优点。



----------------------------
原文链接:https://blog.51cto.com/14309075/2420229

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-01-21 22:43:20 重新编辑]
  Java面向对象编程-->Java语言中的修饰符
  JavaWeb开发-->Servlet技术详解(Ⅰ)
  JSP与Hibernate开发-->映射一对多关联关系
  Java网络编程-->基于UDP的数据报和套接字
  精通Spring-->Vue指令
  Vue3开发-->CSS过渡和动画
  Spark客户端之Spark Submit的使用
  大数据存储单位介绍(TB、PB、EB、ZB、YB有多大)
  spark读取redis数据(交互式,scala单机版,java单机版)
  kubeadm安装k8s集群1.17版本
  MapReduce实现自定义排序功能
  如何面对高并发?缓存?中台为什么会火?
  SparkStreaming的实战案例-WordCount范例
  Hadoop、Spark、HBase与Redis的适用性讨论(全文)-数据视野
  Spark On YARN 环境搭建
  Docker部署Hadoop集群
  Flume+Kafka+Storm+Redis构建大数据实时处理系统:实时统计网...
  Hadoop是否过时?
  SQL Hadoop核心结束揭秘
  MapReduce工作原理图文详解
  Hadoop常用命令参考
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。