Kafka如何实现每秒上百万的超高并发写入? (kafka如何保证消息不丢)

技术教程 2025-05-06 09:27:15 浏览
Kafka如何实现每秒上百万的超高并发写入

Kafka如何实现每秒上百万的超高并发写入?

2019-03-06 09:36:12这篇文章来聊一下 Kafka 的一些架构设计原理,这也是互联网公司面试时非常高频的技术考点。

这篇文章来聊一下 Kafka 的一些架构设计原理,这也是互联网公司面试时非常高频的技术考点。

Kafka 是高吞吐低延迟的高并发、高性能的消息中间件,在大数据领域有极为广泛的运用。配置良好的 Kafka 集群甚至可以做到每秒几十万、上百万的超高并发写入。

那么 Kafka 到底是如何做到这么高的吞吐量和性能的呢?这篇文章我们来详细说一下。

页缓存技术 + 磁盘顺序写

首先 Kafka 每次接收到数据都会往磁盘上去写,如下图所示:

那么在这里我们不禁有一个疑问了,如果把数据基于磁盘来存储,频繁的往磁盘文件里写数据,这个性能会不会很差?大家肯定都觉得磁盘写性能是极差的。

kafka如何保证消息不丢

没错,要是真的跟上面那个图那么简单的话,那确实这个性能是比较差的。

但是实际上 Kafka 在这里有极为优秀和出色的设计,就是为了保证数据写入性能,首先 Kafka 是基于操作系统的页缓存来实现文件写入的。

操作系统本身有一层缓存,叫做 Page Cache,是在内存里的缓存,我们也可以称之为 OS Cache,意思就是操作系统自己管理的缓存。

你在写入磁盘文件的时候,可以直接写入这个 OS Cache 里,也就是仅仅写入内存中,接下来由操作系统自己决定什么时候把 OS Cache 里的数据真的刷入磁盘文件中。

仅仅这一个步骤,就可以将磁盘文件写性能提升很多了,因为其实这里相当于是在写内存,不是在写磁盘,大家看下图:

接着另外一个就是 kafka 写数据的时候,非常关键的一点,它是以磁盘顺序写的方式来写的。

也就是说,仅仅将数据追加到文件的末尾,不是在文件的随机位置来修改数据。

普通的机械磁盘如果你要是随机写的话,确实性能极差,也就是随便找到文件的某个位置来写数据。

但是如果你是追加文件末尾按照顺序的方式来写数据的话,那么这种磁盘顺序写的性能基本上可以跟写内存的性能本身也是差不多的。

所以大家就知道了,上面那个图里,Kafka 在写数据的时候,一方面基于 OS 层面的 Page Cache 来写数据,所以性能很高,本质就是在写内存罢了。

另外一个,它是采用磁盘顺序写的方式,所以即使数据刷入磁盘的时候,性能也是极高的,也跟写内存是差不多的。

基于上面两点,Kafka 就实现了写入数据的超高性能。那么大家想想,假如说 Kafka 写入一条数据要耗费 1 毫秒的时间,那么是不是每秒就是可以写入 1000 条数据?

但是假如 Kafka 的性能极高,写入一条数据仅仅耗费 0.01 毫秒呢?那么每秒是不是就可以写入 10 万条数据?

所以要保证每秒写入几万甚至几十万条数据的核心点,就是尽***可能提升每条数据写入的性能,这样就可以在单位时间内写入更多的数据量,提升吞吐量。

说完了写入这块,再来谈谈消费这块。

大家应该都知道,从 Kafka 里我们经常要消费数据,那么消费的时候实际上就是要从 Kafka 的磁盘文件里读取某条数据然后发送给下游的消费者,如下图所示:

那么这里如果频繁的从磁盘读数据然后发给消费者,性能瓶颈在哪里呢?

假设要是 Kafka 什么优化都不做,就是很简单的从磁盘读数据发送给下游的消费者,那么大概过程如下所示:

整个过程,如下图所示:

大家看上图,很明显可以看到有两次没必要的拷贝吧!一次是从操作系统的 Cache 里拷贝到应用进程的缓存里,接着又从应用程序缓存里拷贝回操作系统的 Socket 缓存里。

而且为了进行这两次拷贝,中间还发生了好几次上下文切换,一会儿是应用程序在执行,一会儿上下文切换到操作系统来执行。

所以这种方式来读取数据是比较消耗性能的。Kafka 为了解决这个问题,在读数据的时候是引入零拷贝技术。

也就是说,直接让操作系统的 Cache 中的数据发送到网卡后传输给下游的消费者,中间跳过了两次拷贝数据的步骤,Socket 缓存中仅仅会拷贝一个描述符过去,不会拷贝数据到 Socket 缓存。

大家看下图,体会一下这个精妙的过程:

通过零拷贝技术,就不需要把 OS Cache 里的数据拷贝到应用缓存,再从应用缓存拷贝到 Socket 缓存了,两次拷贝都省略了,所以叫做零拷贝。

对 Socket 缓存仅仅就是拷贝数据的描述符过去,然后数据就直接从 OS Cache 中发送到网卡上去了,这个过程大大的提升了数据消费时读取文件数据的性能。

而且大家会注意到,在从磁盘读数据的时候,会先看看 OS Cache 内存中是否有,如果有的话,其实读数据都是直接读内存的。

如果 Kafka 集群经过良好的调优,大家会发现大量的数据都是直接写入 OS Cache 中,然后读数据的时候也是从 OS Cache 中读。

相当于是 Kafka 完全基于内存提供数据的写和读了,所以这个整体性能会极其的高。

说个题外话,下回有机会给大家说一下 Elasticsearch 的架构原理,其实 ES 底层也是大量基于 OS Cache 实现了海量数据的高性能检索的,跟 Kafka 原理类似。

通过这篇文章对 Kafka 底层的页缓存技术的使用,磁盘顺序写的思路,以及零拷贝技术的运用,大家应该就明白 Kafka 每台机器在底层对数据进行写和读的时候采取的是什么样的思路,为什么它的性能可以那么高,做到每秒几十万的吞吐量。

这种设计思想对我们平时自己设计中间件的架构,或者是出去面试的时候,都有很大的帮助。

kafka如何保证消息不丢

中华石杉:十余年 BAT 架构经验,一线互联网公司技术总监。带领上百人团队开发过多个亿级流量高并发系统。现将多年工作中积累下的研究手稿、经验总结整理成文,倾囊相授。微信公众号:石杉的架构笔记(ID:shishan100)。


怎么查看hive SQL map reduce情况

map的数量map的数量通常是由hadoop集群的DFS块大小确定的,也就是输入文件的总块数,正常的map数量的并行规模大致是每一个Node是10~100个,对于CPU消耗较小的作业可以设置Map数量为300个左右,但是由于hadoop的每一个任务在初始化时需要一定的时间,因此比较合理的情况是每个map执行的时间至少超过1分钟。 具体的数据分片是这样的,InputFormat在默认情况下会根据hadoop集群的DFS块大小进行分片,每一个分片会由一个map任务来进行处理,当然用户还是可以通过参数参数在作业提交客户端进行自定义设置。 还有一个重要参数就是,这个参数设置的map数量仅仅是一个提示,只有当InputFormat 决定了map任务的个数比值小时才起作用。 同样,Map任务的个数也能通过使用JobConf 的(int num)方法来手动地设置。 这个方法能够用来增加map任务的个数,但是不能设定任务的个数小于Hadoop系统通过分割输入数据得到的值。 当然为了提高集群的并发效率,可以设置一个默认的map数量,当用户的map数量较小或者比本身自动分割的值还小时可以使用一个相对交大的默认值,从而提高整体hadoop集群的效率。 2 reduece的数量reduce在运行时往往需要从相关map端复制数据到reduce节点来处理,因此相比于map任务。 reduce节点资源是相对比较缺少的,同时相对运行较慢,正确的reduce任务的个数应该是0.95或者1.75 *(节点数 ×参数值)。 如果任务数是节点个数的0.95倍,那么所有的reduce任务能够在 map任务的输出传输结束后同时开始运行。 如果任务数是节点个数的1.75倍,那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批 reduce任务,这样的情况更有利于负载均衡。 同时需要注意增加reduce的数量虽然会增加系统的资源开销,但是可以改善负载匀衡,降低任务失败带来的负面影响。 同样,Reduce任务也能够与 map任务一样,通过设定JobConf 的(int num)方法来增加任务个数。 3 reduce数量为0有些作业不需要进行归约进行处理,那么就可以设置reduce的数量为0来进行处理,这种情况下用户的作业运行速度相对较高,map的输出会直接写入到 SetOutputPath(path)设置的输出目录,而不是作为中间结果写到本地。 同时Hadoop框架在写入文件系统前并不对之进行排序。

有关黄河的古诗句

泰山成砥砺,黄河为裳带。 (阮籍《咏怀》) 黄河九曲天边落,华岳三峰马上来。 (黄滋《送李佑之赴陕西参议》) 黄河万里触山动,盘涡毂转秦地雷。 (李白《西岳云台歌送丹丘子》) 西岳峥嵘何壮哉,黄河如丝天际来。 (同上) 黄河落天走东海,万里写入胸怀间。 (李白《赠裴十四》) 黄河西来决昆仑,咆哮万里触龙门。 (李白《公无渡河》) 黄河捧土尚可塞,北风雨雪恨难裁。 (李白《北风行》) 黄河远上白云间,一片孤城万仞山。 羌笛何须怨杨柳,春风不度玉门关。 (王之涣《凉州词》) 九曲黄河万里沙,浪淘风簸自天涯。 如今直上银河去,同到牵牛织女家。 (刘禹锡《浪淘沙九首》 ) 九曲黄河万里沙,浪淘几簸自天崖。 如今直上银河去,直到牵牛织女家 明月黄河夜,寒沙似战场。 奔流聒地响,平野到天荒。 吴会书难达,燕台路正长。 男儿久为客,不辨是他乡。 览百川之洪壮兮,莫尚美于黄河。 潜昆仑之峻极兮,出积石之嵯峨。 登龙门而南游兮,拂华阴于曲阿。 凌砥柱而激湍兮,逾洛汭而扬波。 体委蛇于后土兮,配灵汉于苍穹。 贯中夏之能甸兮,经朔北之遐荒。 历二周之北境兮,流三晋之南乡。 秦自西而启壤兮,齐据东而画疆。 殷徒涉而永固,卫迁济而遂疆。 赵决流而却魏,嬴引沟而灭梁。 思先哲之攸叹,何水德之难量。 关于黄河的诗词歌谣 从诗经到唐诗、宋词、元曲等大量文学经典,以及大量的文化典籍,也都产生在黄河,它们是黄河文明中闪闪发光的瑰宝。 李白诗曰:君不见黄河之水天上来,奔流到海不复还。 (将进酒) 黄河落天走东海,万里写入胸怀间。 (赠《裴十四》) 王之涣曰:黄河远上白云间,一片孤城万仞山。 羌笛何须怨杨柳,春风不度玉门关。 (凉州词)白日依山尽,黄河入海流。 欲穷千里目,更上一层楼。 (登鹳雀楼) 王维诗曰:大漠孤烟直,长河落日圆。 (使至塞上) “艄公号子声声雷,船工拉纤步步沉。 运载好布千万匹,船工破衣不遮身。 运载粮食千万担,船工只能把糠馍啃。 军阀老板发大财,黄河船工辈辈穷。 ” “一条飞龙出昆仑,摇头摆尾过三门。 吼声震裂邙山头,惊涛骇浪把船行。 ” “三气周瑜在江东,诸葛亮将台祭东风。 祭起东风连三阵,火烧曹营百万兵。 ”黄河船工祖祖辈辈生活在黄河上,漂泊在木船上。 他们对黄河了如指掌,把船只视为家珍。 在与黄河风浪搏斗的生活实践中,船工们创作出了丰富多采、独具特色的黄河号子。 声声号子,抒发了船工们复杂的感情,反映出他们的喜、怒、哀、乐、忧、怨、悲、欢。 黄河船工号子,伴随着船工的劳动,是船民生活的旋律。 。 “九曲黄河万里沙,浪淘风簸自天涯〔九曲黄河万里沙,浪淘风簸自天涯〕这是唐朝诗人刘禹锡《浪淘沙九首》诗中的第一首中的前两句。 后两句是:“如今直上银河去,同到牵牛织女家。 ”。 ” “大江东去,浪淘尽,千古风流人物”。 苏东坡 浪淘沙 刘禹锡 九曲黄河万里沙, 浪淘风簸自天涯。 如今直上银河去, 同到牵牛织女家。 黄河远上白云间,一片孤城万仞山。 ——《凉洲词》王之涣 黄河二首 作者:【杜甫】 年代:【唐】 体裁:【七绝】 类别:【未知】黄河北岸海西军,椎鼓鸣钟天下闻。 铁马长鸣不知数,胡人高鼻动成群。 黄河西岸是吾蜀,欲须供给家无粟。 愿驱众庶戴君王,混一车书弃金玉。 黄河二首 作者:【杜甫】 年代:【唐】 体裁:【七绝】 类别:【未知】黄河北岸海西军,椎鼓鸣钟天下闻。 铁马长鸣不知数,胡人高鼻动成群。 黄河西岸是吾蜀,欲须供给家无粟。 愿驱众庶戴君王,混一车书弃金玉。 自巩洛舟行入黄河即事,寄府县僚友 作者:【韦应物】 年代:【唐】 体裁:【未知】 类别:【未知】夹水苍山路向东,东南山豁大河通。 寒树依微远天外, 夕阳明灭乱流中。 孤村几岁临伊岸,一雁初晴下朔风。 为报洛桥游宦侣,扁舟不系与心同。

描写黄河的诗句(作者题目)

凉州词唐·王之涣黄河远上白云间,一片孤城万仞山。 羌笛何须怨杨柳,春风不度玉门关。 登鹳雀楼唐·王之涣白日依山尽,黄河入海流。 欲穷千里目,更上一层楼。 使至塞上唐·王维单车欲问边,属国过居延。 征蓬出汉塞,归雁入胡天。 大漠孤烟直,长河落日圆。 萧关逢侯骑,都护在燕然。 将进酒唐·李白君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月!天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯!岑夫子,丹丘生,将进酒,君莫停!与君歌一曲,请君为我侧耳听!钟鼓馔玉不足贵,但愿长醉不愿醒!古来圣贤皆寂寞,惟有饮者留其名!陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱?径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,黄河,你是民族的摇篮,五千年古国文化,从你这儿发源,多少英雄故事在你周围扮演……”。 《黄河颂》的歌词,道出了黄河的悠久历史,唱出了黄河的不朽功绩。 黄河是我国第二大河,也是世界闻名的巨川。 ——摘自《黄河颂》与尔同消万古愁黄河夜泊〔明〕李流芳明月黄河夜,寒沙似战场。 奔流聒地响,平野到天荒。 吴会书难达,燕台路正长。 男儿久为客,不辨是他乡。 渡黄河〔明〕谢榛路出大梁城,关河开晓晴。 日翻龙窟动,风扫雁沙平。 倚剑嗟身事,张帆快旅情。 茫茫不知处,空外棹歌声。 过黄河〔明〕李东阳清口驿前初放船,长淮东下水如弦。 劲催双橹渡河急,一夜狂风到海边。 浪淘沙九曲黄河万里沙,浪淘风簸自天涯。 如今直上银河去,同到牵牛织女家。 黄河落天走东海,万里写入胸怀间。 (赠《裴十四》)王之涣曰:黄河远上白云间,一片孤城万仞山。 羌笛何须怨杨柳,春风不度玉门关。 (凉州词)白日依山尽,黄河入海流。 欲穷千里目,更上一层楼。 (登鹳雀楼)王维诗曰:大漠孤烟直,长河落日圆。 (使至塞上)“艄公号子声声雷,船工拉纤步步沉。 运载好布千万匹,船工破衣不遮身。 运载粮食千万担,船工只能把糠馍啃。 军阀老板发大财,黄河船工辈辈穷。 ”“一条飞龙出昆仑,摇头摆尾过三门。 吼声震裂邙山头,惊涛骇浪把船行。 ”“三气周瑜在江东,诸葛亮将台祭东风。 祭起东风连三阵,火烧曹营百万兵。 ”岁岁金河复玉关,朝朝马策与刀环。 (唐 柳中庸《征人怨》)黄河走东溟,白日落西海。 (唐 李白《古风》)阳台隔楚水,春草生黄河。 (唐 李白《寄远》)黄河北岸海西军,椎鼓鸣钟天下闻。 (唐 杜甫《黄河》)派出昆仑五色流,一支黄浊贯中州。 王昌龄的“白花垣上望京师,黄河水流无尽时。 穷秋旷野行人绝,马首东来知是谁”、“黄河渡头归问津,离家几日茱萸新”。 元代诗人萨都剌《过古黄河堤》:“古来黄河流,而今作耕地。 都道变通津,沧海化为尘。 ”

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐