vlambda博客
学习文章列表

新技术层出不穷,HDFS还是存储的王者吗?

Google大数据“三驾马车”的第一驾是GFS(Google 文件系统),而Hadoop的第一个产品是HDFS(Hadoop分布式文件系统),可以说分布式文件存储是分布式计算的基础,由此可见分布式文件存储的重要性。如果我们将大数据计算比作烹饪,那么数据就是食材,而Hadoop分布式文件系统HDFS就是烧菜的那口大锅。
厨师来来往往,食材进进出出,各种菜肴层出不穷,而不变的则是那口大锅,大数据也是如此。这些年来,各种计算框架、各种算法、各种应用场景不断推陈出新,让人眼花缭乱,但是大数据存储的王者依然是HDFS。
为什么HDFS的地位如此稳固呢?在整个大数据体系中,最宝贵、最难以代替的资产就是数据,大数据技术所有的一切都要围绕数据展开。HDFS作为最早的大数据存储系统,存储着宝贵的数据资产,各种新的算法、框架要想得到广泛使用,必须首先支持HDFS,这样才能获取已经存储在里面的数据。所以大数据技术越发展,新技术越多,HDFS得到的支持就越多,人们就越离不开HDFS。HDFS也许不是最好的大数据存储技术,但依然是最重要的大数据存储技术。
我们从HDFS的原理开始,看看HDFS是如何实现大数据高速、可靠的存储和访问的。
HDFS的设计目标是管理数以千计的服务器、数以万计的磁盘,将如此大规模的服务器计算资源当成一个单一的存储系统进行管理,并给应用程序提供PB级的存储容量,让应用程序像使用普通文件系统一样存储大规模的文件数据。
如何设计一个这样的分布式文件系统?其实思路很简单。
前面讨论过RAID磁盘阵列存储,RAID将数据分片后在多块磁盘上进行并发读写访问,从而提高了存储容量、加快了访问速度,并通过数据的冗余校验提高了数据的可靠性,即使某块磁盘损坏也不会丢失数据。将RAID的设计理念扩大到整个分布式服务器集群,就产生了分布式文件系统,Hadoop分布式文件系统的核心原理就是如此。
和RAID在多个磁盘上进行文件存储及并行读写的思路一样,HDFS是在一个大规模分布式服务器集群上,对数据分片后进行并行读写及冗余存储。因为HDFS可以部署在一个比较大的服务器集群上,集群中所有服务器的磁盘都可供HDFS使用,所以整个HDFS的存储空间可以达到PB级的容量。

图2.3是HDFS的架构图,从中可以看到HDFS的关键组件有两个,一个是DataNode,一个是NameNode。
DataNode负责文件数据的存储和读写操作,HDFS将文件数据分割成若干数据块(Block),每个DataNode存储一部分数据块,这样文件就分布存储在整个HDFS服务器集群中。应用程序客户端(Client)可以并行对这些数据块进行访问,从而使得HDFS可以在服务器集群规模上实现数据并行访问,极大地提高访问速度。
在实践中,HDFS集群的DataNode服务器会有很多台(规模一般在几百台到几千台),每台服务器都配有数块磁盘,整个集群的存储容量从几PB到数百PB不等。
NameNode负责整个分布式文件系统的元数据(MetaData)(也就是文件路径名、数据块的ID以及存储位置等信息)管理,相当于操作系统中文件分配表(FAT)的角色。HDFS为了保证数据的高可用,会将一个数据块复制为多份(默认情况为3份),并将多份相同的数据块存储在不同的服务器、甚至不同的机架上。这样当有磁盘损坏,或者某个DataNode服务器宕机、甚至某个交换机宕机,导致其存储的数据块不能访问时,客户端会查找备份的数据块进行访问。

新技术层出不穷,HDFS还是存储的王者吗?

图2.4是HDFS数据分块存储示意图。对于文件/users/sameerp/data/part-0,复制备份数设置为2,存储的Block ID分别为1、3。Block 1的两个备份存储在DataNode 0和DataNode 2两个服务器上,Block 3的两个备份存储在DataNode 4和DataNode 6两个服务器上,上述任何一台服务器宕机后,每个数据块都至少还有一个备份,不会影响对文件/users/sameerp/data/part-0的访问。
和RAID一样,将数据分成若干数据块后存储到不同服务器上,可以实现数据大容量存储,并且不同分片的数据可以并行读/写操作,实现数据的高速访问。HDFS的大容量存储和高速访问相对比较容易实现,但是HDFS如何保证存储的高可用性呢?
我们尝试从不同层面来讨论一下HDFS的高可用性设计。
1.数据存储故障容错
磁盘介质在存储过程中受环境或者老化影响,其存储的数据可能会出现错乱。HDFS的应对措施是,对于存储在DataNode上的数据块,计算并存储校验和(CheckSum)。在读取数据的时候,重新计算读取出来的数据的校验和,如果校验和不正确就输出异常信息,应用程序捕获异常信息后就到其他DataNode上读取备份数据。
2.磁盘故障容错
如果DataNode监测到本机的某块磁盘损坏,就将该块磁盘上存储的所有Block ID报告给NameNode,NameNode检查这些数据块在哪些DataNode上有备份,并通知相应的DataNode服务器将对应的数据块复制到其他服务器上,以保证数据块的备份数满足要求。
3.DataNode故障容错
DataNode会通过心跳消息和NameNode保持通信,如果DataNode超时未发送心跳消息,NameNode就会认为这个DataNode已经宕机失效,并立即查找该DataNode上存储了哪些数据块以及这些数据块还存储在哪些服务器上,随后通知这些服务器再复制一份数据块到其他服务器上,保证HDFS存储的数据块备份数符合用户设置的数目,这样即使再出现服务器宕机,也不会丢失数据。
4.NameNode故障容错
NameNode是整个HDFS的核心,记录着HDFS文件分配表信息,所有的文件路径和数据块存储信息都保存在NameNode上,如果NameNode发生故障,将导致整个HDFS系统集群都无法使用;如果NameNode上记录的数据丢失,则整个集群中所有DataNode存储的数据也就没用了。所以,NameNode具备高可用的容错能力非常重要。NameNode采用主从热备的方式提供高可用服务,如图2.5所示。

新技术层出不穷,HDFS还是存储的王者吗?

集群部署两台NameNode服务器,一台作为主服务器提供服务,一台作为从服务器进行热备份,两台服务器通过ZooKeeper选举,决定谁是主服务器。
正常运行期间,主从两台NameNode服务器之间通过一个共享存储系统Shared Edits来同步文件系统的元数据信息。当主NameNode服务器宕机时,从NameNode会通过ZooKeeper升级成为主服务器,并保证HDFS集群的元数据信息,也就是文件分配表信息完整一致。
对于一个软件系统而言,性能差一点,用户也许可以接受;使用体验差,也许也能忍受;但是如果可用性差,经常出故障导致不可用,那就比较麻烦了;如果丢失重要数据,那么开发工程师绝对是摊上大事了。
而分布式系统可能出故障的地方又非常多,内存、CPU、主板、磁盘会损坏,服务器会宕机,网络会中断,机房会停电……所有这些都可能会导致软件系统的不可用、甚至数据永久丢失。
所以在设计分布式系统的时候,软件工程师一定要绷紧可用性这根弦,思考在各种可能故障的情况下,如何保证整个软件系统依然是可用的。
一般说来,常用的保证系统可用性的策略有冗余备份、失效转移、限流和降级。
(1)冗余备份。任何程序、任何数据,都至少要有一个备份,也就是说程序至少要部署到两台服务器,数据至少要备份到另一台服务器上。此外,稍有规模的互联网企业都会建设多个数据中心,数据中心之间互相备份,用户请求可能会被分发到任何一个数据中心,即所谓的异地多活,在遭遇地域性的重大故障和自然灾害的时候,依然保证应用的高可用性。
(2)失效转移。当要访问的程序或者数据无法访问时,需要将访问请求转移到备份的程序或者数据所在的服务器上,即失效转移。失效转移需要注意的是失效的鉴定,像NameNode这样主从服务器管理同一份数据的场景,如果从服务器错误地以为主服务器宕机而接管集群管理,会出现主从服务器一起对DataNode发送指令的情况,进而导致集群混乱,也就是所谓的“脑裂”。这也是这类场景选举主服务器时,引入ZooKeeper的原因(ZooKeeper的工作原理将在后面专门分析)。
(3)限流和降级。当大量的用户请求或者数据处理请求到达的时候,由于计算资源有限,可能无法处理如此大量的请求,进而导致资源耗尽、系统崩溃。这种情况下,可以拒绝部分请求,即限流;也可以关闭部分功能,降低资源消耗,即降级。限流是互联网应用的常备功能,因为根本无法预料超出负载能力的访问流量在何时会突然到来,所以必须提前做好准备,当遇到突发高峰流量时,就可以立即启动限流。降级通常是为可预知的场景准备的,比如电商的“双十一”促销,为了保障促销活动期间应用的核心功能能够正常运行,比如下单功能,可以对系统进行降级处理,关闭部分非重要功能,比如商品评价功能等。
下面我们总结HDFS是如何通过大规模分布式服务器集群实现数据的大容量、高速、可靠存储、访问的。
(1)将文件数据以数据块的方式进行切分,数据块可以存储在集群任意DataNode服务器上,所以HDFS存储的文件可以非常大,一个文件理论上可以占据整个HDFS服务器集群上的所有磁盘,实现大容量存储。
(2)HDFS一般的访问模式是通过MapReduce程序在计算时读取,MapReduce对输入数据进行分片读取,通常一个分片就是一个数据块,给每个数据块分配一个计算进程,这样就可以同时启动很多进程对一个HDFS文件的多个数据块进行并发访问,从而实现数据的高速访问。
(3)DataNode存储的数据块会进行复制,使每个数据块在集群里有多个备份,保证了数据的可靠性,并通过一系列的故障容错手段实现HDFS系统中主要组件的高可用性,进而保证数据和整个系统的高可用性。
本文节选自《大数据技术架构:核心原理与应用实践》,想了解更多大数据技术架构的内容,推荐阅读此书。


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

你好,我是王知无,一个大数据领域的硬核原创作者。

做过后端架构、数据中间件、数据平台&架构&、算法工程化。

专注大数据领域实时动态&技术提升&个人成长&职场进阶,欢迎关注。