01
—
HDFS设计目的
A distributed file system that provides high-throughput access to application data.
HDFS(Hadoop Distributed File System )是Hadoop分布式文件系统,设计目的是为了存储超大文件,主要是针对几百MB,GB,甚至TB的文件,流式读取方式,主要是针对一次写入,写入的过程使用的是append的方式,多次读出的使用模式。
该分布式系统构建在普通PC机组成的集群上,大大降低了构建成本,并屏蔽了系统故障,保存多个副本,且提供容错机制,副本丢失或宕机自动恢复(默认存3份),使得用户可以专注于自身的操作运算。
02
—
HDFS相关的基本概念
block
这是HDFS的基本思想了,把大的文件分成块,每块64M。
备份(replicas)
机架 (rack)
由几个DataNode组成的部件称为机架
MetaData
描述我们要存储数据的数据结构
HDFS namespace
这个命名空间指的是文件的目录结构,与我们单个电脑的文件的结构树相似。
EditLog
记录文件系统的metadata变化的事务日志,是HDFS的核心数据结构。 例如,写入一个文件或修改复制因子都会向EditLog中写入一条record。
FsImage
整个文件系统的命名空间,包括block到文件的映射,文件系统的属性(大小,被分为几个block,只读,权限等信息),都被存储在一个文件中,这个文件就是FsImage。
HDFS namespace,EditLog,FsImage都存储在NameNode上。
HeartBeat
NameNode和DataNode通过HeartBeat进行通信,每隔一定时间,DataNode就会向NameNode发送心跳信号,以此报告给NameNode,说我还活着,这样NameNode 在接到读写任务时,会发命令给它。
02
—
HDFS如何分解文件
HDFS默认会将文件分割成 block,64M为1个block,然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。每个文件默认会保存3份。
如下图所示为HDFS的基本架构,按照Master和Slave的结构,主要的组件包括:NameNode、SecondaryNameNode、DataNode。
NameNode:是Master节点,
SecondaryNameNode:合并fsimage和fsedits,然后再发给namenode,尽量不要与NameNode部署在同一个host上,这样避免内存的过多消耗;NameNode的冷备份;
DataNode:Slave节点,干活的。负责存储client发来的数据块block,执行数据块的读写操作。
client分类
如果client为DataNode,某个block的3份备份,如何选取DataNode进行存储呢?一般地,它会在自己所在的host上备份一个,然后在另外一台机架的不同DataNode上分别备份一个。
如果client不是DataNode所在的host,也就是我们比如在存入有道笔记一个pdf文件时,很明显我们不是在有道的集群上的DataNode的host上,而是在自己的主机上,此时,我们写入文件时,有道的HDFS会将此文件分解为块,然后根据某个算法,找到某个DataNode,然后在另外不同的机架上,选择两个DataNode,这是默认的行为。
03
—
向集群中写入一个文件FileA
FileA假定大小为100M。
block1: host2,host1,host3
block2: host7,host8,host4
d. client向DataNode发送block1;发送过程是以流式写入,直到将block1发送完毕,host2,host1,host3向NameNode,host2向Client发送通知,说“消息发送完了”。
分析写过程:
04
—
从集群中读文件FileA
上面是写入FileA的过程,HDFS默认用户会多次读取这个文件FileA,那么如何读取呢?
a. client向NameNode发送读请求。
b. NameNode查看Metadata信息,返回fileA的block的位置给client。
block1:host2,host1,host3
block2:host7,host8,host4
c. block的位置是有先后顺序的,先读block1,再读block2,而且block1去host2上读取;然后block2,去host7上读取;
上面例子中,client位于机架外。
那么如果client位于机架内某个DataNode上,例如 client是host6。那么读取的时候,遵循的规律是:优选读取本机架上的数据。
05
—
HDFS的缺陷
hadoop的HDFS不是完美的,也有缺陷,比如只有一个NameNode节点,这样一旦宕机,整个系统就无法工作。比如hadoop如果接来的小文件太多,那内存的负担会很重。对于这小文件存储,hadoop后续给出了解决方案,之后可以总结这个问题。
参考文献:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
https://www.cnblogs.com/laov/p/3434917.html
http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html#%E5%BC%95%E8%A8%80
本文分享自 程序员郭震zhenguo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!