面对 10 亿数据量的挑战,如何对系统进行性能优化?

栏目: 服务器 · 发布时间: 5年前

内容简介:作者 | 中华石杉

面对 10 亿数据量的挑战,如何对系统进行性能优化?

面对 10 亿数据量的挑战,如何对系统进行性能优化?

作者 | 中华石杉

责编 | 伍杏玲

本文经授权转载自石杉的架构笔记

这篇文章,我们来聊一聊在十亿级的大数据量技术挑战下,世界上最优秀的大数据系统之一的Hadoop是如何将系统性能提升数十倍的?

首先一起来画个图,回顾一下Hadoop HDFS中的超大数据文件上传的原理。

说出来也很简单,比如有个十亿数据量级的超大数据文件,可能达到TB级了,这个文件实在是太大了。

此时,HDFS客户端会给拆成很多block,一个block就128MB。

这个HDFS客户端你可以理解为是云盘系统、日志采集系统之类的东西,比如有人上传一个1TB的大文件到网盘,或者是上传个1TB的大日志文件。

然后HDFS客户端把一个一个的block上传到第一个DataNode,第一个DataNode会把这个block复制一份,做一个副本发送给第二个DataNode,然后第二个DataNode发送一个block副本到第三个DataNode。

一个block有3个副本,分布在三台机器上。任何一台机器宕机,数据是不会丢失的。

然后一个TB级大文件就被拆散成了N多个MB级的小文件存放在很多台机器上了,这不就是分布式存储么?

面对 10 亿数据量的挑战,如何对系统进行性能优化?

今天要讨论的问题,就是那个HDFS客户端上传TB级大文件的时候,到底是怎么上传呢?

如果用一个比较原始的方式来上传,我们大概能想到的是下面这个图里的样子。

就是不停地从本地磁盘文件用输入流读取数据,然后读到一点,就立马通过网络的输出流写到DataNode里去。

面对 10 亿数据量的挑战,如何对系统进行性能优化?

参见上图,对文件的输入流最多就是个FileInputStream,对DataNode的输出流,最多就是个Socket返回的OutputStream,然后中间找一个小的内存byte[]数组,进行流对考就行了。从本地文件读一点数据,就给DataNode发一点数据。

但是如果真是这么弄,性能真是极其的低下了,网络通信讲究的是适当频率,每次batch批量发送,你得读一大批数据,通过网络通信发一批数据。不能读一点点数据,就立马来一次网络通信,就发出去这一点点的数据。

如果按照上面这种原始的方式,绝对会导致网络通信效率极其低下,大文件上传性能很差。相当于你可能刚读出来几百个字节的数据,立马就写网络,卡顿个比如几百毫秒,然后再读下一批几百个字节的数据,再写网络卡顿个几百毫秒,这个性能很差,几乎在工业级的大规模分布式系统中,是无法容忍的。

Hadoop中的大文件上传如何优化性能?我们来看看下面那张图。

面对 10 亿数据量的挑战,如何对系统进行性能优化?

你需要自己创建一个针对本地TB级磁盘文件的输入流,然后读到数据之后立马写入HDFS提供的FSDataOutputStream输出流。

这个FSDataOutputStream输出流在干啥呢?他会天真的立马把数据通过网络传输写给DataNode吗?

答案当然是否定的!这么干的话,不就跟之前的那种方式一样了!

面对 10 亿数据量的挑战,如何对系统进行性能优化?

Chunk缓冲机制

首先,数据会被写入一个chunk缓冲数组,这个chunk是一个512字节大小的数据片段,然后这个缓冲数组可以容纳多个chunk大小的数据在里面缓冲。光是这个缓冲,首先就可以让客户端快速的写入数据了,不至于说几百字节就要进行一次网络传输。

面对 10 亿数据量的挑战,如何对系统进行性能优化?

Packet数据包机制

接着,当chunk缓冲数组都写满了之后,就会把这个chunk缓冲数组进行一下chunk切割,切割为一个一个的chunk,一个chunk是一个数据片段。然后多个chunk会直接一次性写入另外一个内存缓冲数据结构,就是Packet数据包。

一个Packet数据包,设计为可以容纳127个chunk,大小大致为64mb。所以说大量的chunk会不断的写入Packet数据包的内存缓冲中。通过这个Packet数据包机制的设计,又可以在内存中容纳大量的数据,进一步避免了频繁的网络传输影响性能。

面对 10 亿数据量的挑战,如何对系统进行性能优化?

内存队列异步发送机制

当一个Packet被塞满了chunk之后,就会将这个Packet放入一个内存队列来进行排队,然后有一个DataStreamer线程会不断的获取队列中的Packet数据包,通过网络传输直接写一个Packet数据包给DataNode。

如果一个Block默认是128MB的话,那么一个Block默认会对应两个Packet数据包,每个Packet数据包是64MB。

也就是说传送两个Packet数据包DataNode之后,就会发一个通知说,一个Block的数据都传输完毕,那DataNode就知道自己收到了一个Block了,包含了人家发送过来的两个Packet数据包。

面对 10 亿数据量的挑战,如何对系统进行性能优化?

总结

大家看完了上面的那个图以及Hadoop采取的大文件上传机制,是不是感觉设计得很巧妙?

工业级的大规模分布式系统,都不会采取特别简单的代码和模式,那样性能很低下。这里都有大量的并发优化、网络IO优化、内存优化、磁盘读写优化的架构设计、生产方案在里面。

所以大家观察上面那个图,HDFS客户端可以快速的将TB级大文件的数据读出来,然后快速的交给 HDFS 的输出流写入内存,基于内存里的chunk缓冲机制、Packet数据包机制、内存队列异步发送机制,绝对不会有任何网络传输的卡顿,导致大文件的上传速度变慢。反而通过上述几种机制,可以大幅度提升一个TB级大文件的上传性能。

作者简介:中华石杉,十余年BAT架构经验,倾囊相授

公众号:石杉的架构笔记(id:shishan100)

【END】

面对 10 亿数据量的挑战,如何对系统进行性能优化?

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员: 极客宝宝(ID: geek_baby)

戳他了解更多↓↓↓

面对 10 亿数据量的挑战,如何对系统进行性能优化?

 热 文推 荐 

☞ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!

☞忽略这一点,人工智能变人工智障的!

☞比特币冲到9000美元, 你就能找个好工作?

☞1000 万个“AI 名师”:用机器算法“解剖”应试教育

☞阿里面试,我挂在了第四轮……

☞10个爬虫工程师必备的 工具 了解一下

☞为什么说深耕AI领域绕不开知识图谱?

☞如何快速深入理解监控知识? | 技术干货

☞大神!这段代码让 程序员 躺赚200W,源码简单,你怎么看?

你点的每个“在看”,我都认真当成了喜欢


以上所述就是小编给大家介绍的《面对 10 亿数据量的挑战,如何对系统进行性能优化?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

XML Hacks

XML Hacks

Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95

Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器