HDFS 架构以及解释其设计
HDFS
也许不是最好的大数据存储技术,但依然是最重要的大数据存储技术。
为什么呢?
在整个大数据体系里面,最宝贵、最难以代替的资产就是数据,大数据所有的一切都要围绕数据展开。HDFS存储着宝贵的数据资产,各种新的算法、框架要想得到人们的广泛使用,必须支持HDFS才能获取已经存储在里面的数据。
HDFS 架构图
我们都知道 RAID
是在多个磁盘上进行文件存储及并行读写,将 RAID
的设计理念扩大到整个分布式服务器集群,就产生了分布式文件系统, Hadoop
分布式文件系统的核心原理就是如此。
HDFS
是在一个大规模分布式服务器集群上,对数据进行分片后进行并行读写及冗余存储。HDFS
的设计目标是管理数以千计的服务器、数以万计的磁盘,将这么大的规模的计算资源当作一个单一的存储系统进行管理,对应用程序提供数以 PB 计的存储容量,让应用程序像使用普通文件系统一样存储大规模的文件数据。
下面我们来看一下 HDFS
的架构图:HDFS
架构图
上图是 HDFS 的架构图,从图中你可以看到 HDFS 的关键组件有两个,一个是 DataNode,一个是 NameNode。
在实践中,HDFS 集群的 DataNode 服务器会有很多台,一般在几百台到几千台这样的规模,每台服务器配有数块磁盘,整个集群的存储容量大概在几 PB 到数百 PB。
HDFS 的高可用设计
在设计一个高可用系统时,我们需要从微观到宏观地去考虑采取什么措施,这里的措施就是如何容错(failover)。
When we consider how to design a high-available system, we need to think of what corresponding mesures to take from the micro to the macro perspective.
数据存储故障容错
这里面主要涉及:
Block
checksum
磁盘故障容错
这里面主要涉及:
BlockID
NameNode
保存了metadata
,metadata
包括了文件名和文件的BlockID
,以及分散在什么位置(哪个DataNode
,哪块盘上)
DataNode 故障容错
这里面主要涉及:
DataNode
和NameNode
之间保持心跳- 数据分散在不同的
DataNode
上,metadata 保存在NameNode
上
NameNode 故障容错
这里面主要涉及:
Zookeeper
(分布式锁原理)Active NameNode
和Standby NameNode
Shared Edits
- ANN 维持
znode锁
,SNN 获取znode锁
DataNode
向 ANN 和 SNN 同事发送心跳,只有 ANN 能返回控制信息
小结
我们小结一下,看看 HDFS
是如何通过大规模分布式服务器集群实现数据的大容量、高速、高可靠的存储、访问的。
- 文件数据以数据块(
Block
)的方式进行切分,数据块可以存储在集群中任意的DataNode
上。所以HDFS
存储的文件可以非常大,一个文件理论上可以占据整个HDFS
服务器集群上的所有磁盘,实现了大容量存储。 HDFS
一般的访问模式是通过MapReduce
程序在计算时读取,MapReduce
对输入数据进行分片读取,通常一个分片就是一个数据块 1,每个数据块分配一个计算进程,这样就可以同时启动很多进程对一个HDFS
文件的多个数据块进行并发访问,从而实现数据的告诉访问。关于MapReduce
的具体处理过程,我以后再详细记录。- DataNode 存储的数据块会进行复制,使每个数据块在集群里有多个备份,保证了数据的可靠性,并通过一系列的故障容错手段实现
HDFS
系统中主要组件的高可用,进而保证数据和整个系统的高可用。
彩蛋
这里有一个关于 HDFS
的漫画,可以作为工作机制的概括:
金山文档 - HDFS_comic.pdf
缩略图:
1 Mapreduce中有分片(fragment)概念,和HDFS的数据块(Block)概念不一样。 ↩