概述:DHFS是一个基于廉价硬件基础设施的高度容错性的分布式文件系统.HDFS由Apache Nutch项目演化而来.现阶段HDFS作为大数据存储解决方案,拥有众多的受益企业和个人,学习势在必行.
HDFS目标:
| 硬件故障是常态.对应快速故障恢复和转移.
| 流式数据接收,高吞吐量而不是低延迟下的实时性要求
| 大数据集. 通常考虑的G字节的存储级别.数以百计的集群,但节点数千计的文件数
| 数据一致性. 基于[写入一次读取多次]模型,除截断附加操作外不允许任何修改操作.
| 移动计算廉价与移动数据.尽可能的在数据节点执行计算操作.
| 硬件异构,平台移植.跨平台的移动
NameNode&DataNodes
HDFS基于主从架构,
| NameNode管理集群元数据,处理客户端的文件系统请求.
| Datanodes 许多,通常运行与集群中的每个节点,管理数据存储节点.
| HDFS 暴露文件系统接口供用户调用存储数据文件
| 一个数据文件被切割为一个或者多个块尽可能的被分散存储在多个DataNode中
| NameNode 决定对文件元数据的各种操作,维护DataNode数据块映射
| DataNode 负责读写数据文件服务客户端
| DataNode 执行NageNode 指令进行块的创建,删除和复制
点晴:一个NameNode的设计显然有利有弊,NameNode带来的单节点故常暂且放下,且看看带来的好处
| 极大的简化了集群架构的设计
| NameNode 处理所有客户端请求,维护集群文件元数据,保证数据一致性
| 客户端请求数据文件被分流至各个对应的DataNode中而不会流经NameNode.
基于HDFS架构设计带来的单点故障问题在HDFS1.X及HDFS2.X中均给出了不同的HA(高可用)解决方案,此处暂不详述
文件系统NameSpace:
| HDFS 支持分层的文件组织方式,类似与其它文件系统,用户可自由创建,删除,复制,移动一个文件.
| HDFS支持基于用户的配置和权限管理,HDFS不支持软硬连接,但不屏蔽这些特性的实现.
| NameNode 维护文件系统命名空间,记录任何NameSpace的改变.
| HDFS支持数据冗余备份,可以指定数据冗余备份因子,NameNode维护这些信息.
数据冗余:
| HDFS存储每个文件块的序列,基于数据冗余策略来保证数据的存储可靠性,副本的数量,块大小等一系列参数支持可配置,部分参数可动态修改,如复制因子.
| 对一个由多个块进行存储的大型文件,除最后一个块外其它的块均是等大小的,用户可以开始一个新的块,也允许为一个块增加一些有效长度.
| 块复制指令有NameNode节点发出,NameNode定期接收来自于集群总DataNodes的心跳报告的块报表,以此判断DataNode存活及NdataNode所维护的数据序列.
块副本存储格式&在集群中的分布
| 副本选址,HDFS在进行数据冗余备份时,要综合环境因素考虑网络环境对集群间数据移动带来的”代价”等综合因素决定.可参考官方介绍,此处不展开.
| 副本选择,集群中一个文件的多个存储块的多个副本可以并发响应客户端读请求,优先选择网络开销最小的副本进行数据读取.
| 安全模式,文件系统每次启动,预先进入一种特殊状态Safemode即安全模式,Safenode模式下接收数据节点心跳及BlockReport(块报表),检查集群环境,如所有数据块满足最小副本数,则在默认30S后退出安全模式,安全模式退出后继续检查文件副本数,进行数据冗余备份. 注:安全模式下集群不响应客户端的写请求.
MeteData持久化:
| NameNode 完成namespace元数据的存储操作.NameNode 使用EditLog事物日志文件存储Namespace的变化.
| EditLog 事物日志文件被存储在本机操作系统文件系统中,整个文件系统Namespace的信息包括块映射文件及文件系统属性被存储在FsImage的文件中.FsImage 文件被NameNode存储在本地文件系统中.
| NameNode 在内存中维护NameSpace镜像及块映射信息,NameNode启动时出发CheckPoint,从磁盘加载FsImage, EditLog,重构FsImage 并替换旧的FsImage镜像文件,并截断EditLog,而使用新的EditLog. 上述过程称为一个检查点,在HDFS 运行态中可以显示的配置[dfs.namenode.checkpoint.period, dfs.namenode.checkpoint.txns]出发检查点的周期. 以保证系统在启动时更块.
| DataNode 将HDFS数据存储的本地文件系统中,在存储每个HDFS数据块在本地文件系统的独立文件中.DataNode 并不在一个目录中创建所有数据文件,基于” heuristic”策略动态创建目录,当DataNode启动将扫描本地文件系统生成BlockReport同心跳信息发送给NageNode.
通信协议:
| 所有的HDFS 通信协议基于TPC/IP协议,细节暂不提及.
健壮性: 常见的NameNode 失败,DataNode及网络故障
| 数据磁盘故障,心跳和冗余备份,DataNode定期向NameNode发送心跳信息,由于任何原因导致的DataNode发送给NameNode的心跳信息不可达,NameNode 将不在转发I/O给该DataNode,DataNode 死亡后,由NameNode跟踪并平衡复制因子.DataNode默认超时10分钟标记死亡,避免”复制风暴”
| 集群负载均衡,潜在的数据块损坏,HDFS客户端实现了HDFS文件的校验和检查,当客户端创建HDFS文件时计算每一个文件块的校验和存储在同一个Namespace中,客户端获取数据时,检查校验和如失败则从另一个DataNode获取块的复制.
| 元数据磁盘故障, FsImage和EditLog 是HDFS的核心文件,损坏可能导致HDFS集群损坏.于此,可以配置维护FsImage,EditLog的多个副本,并保持同步更新,可能降低集群效率.推荐基于Journal 的HDFS HA配置.
| 快照,支持数据快照,以在数据块故障时恢复到已知的快照
数据组织:
| 数据块,HDFS设计用于大文件的存储,通常情况下更适用于那些一次写入频繁读取的场景,DHFS支持 write-once-read-many的语意-. HDFS推荐的块大小是128M,HDFS尽可能的让一个文件的不同块分布在不同的DataNode中.
| 阶段处理,Client的创建文件请求并不会被NameNode执行,首先HDFS客户端缓存文件数据到本地缓冲区,应用程序写缓冲区,当缓冲区数据超过一个HDFS块大小客户端通知NameNode,NameNode记录文件名到Namespace并分配DataNode存储.NameNde响应客户端DataNode信息和目标数据库,客户端刷新数据到DataNode块. 当文件被关闭,剩余缓冲区数据被转移到DataNode.客户端通知NameNode文件关闭.此时 NameNode提交文件创建操作到事物日志文件,如文件关闭前NageNode故障则文件丢失.
| 副本复制,客户端写入数据完成,以三个副本为例,当本地缓冲区积累了一大块用户数据,Client从NameNode 接收DataNodes的列表,该列表中包含了副本将被分配到的DataNodes主机,客户端刷新数据块到第一个DataNode,第一个DataNode开始接收数据到一个小的存储块中,每写以小部分到自己的本地存储库立即传输小数据块给列表中的下一个DataNode,第二个DataNode开始接收数据,写如到本地存储,刷新数据块至列表中的下一个DataNode,第三个DataNode接收数据存储到本地存储.
HDFS 管理
| HDFS FileSystem API,C,Web浏览器等
| FS Shell,用来在shell环境下对HDFS文件系统的操作,示例
|bin/hadoop dfs -mkdir /foodir 创建一个目录
| bin/hadoop fs -rm -R /foodir 删除一个目录
|bin/hadoop dfs -cat /foodir/myfile.txt 查看文件内容
| DFSAdmin,提供用于管理集群,示例
|bin/hdfs dfsadmin -safemode enter 进入安全模式
|bin/hdfs dfsadmin –report DataNodeList
|bin/hdfs dfsadmin –refreshNodes 校验DataNode
| 浏览器接口
空间回收
| 如果启用了回收站,则通过FSShell的删除操作不会立即释放空间,HDFS将移动数据到回收站,一般在/user/<username>/.Trash,下允许快速恢复.大多数最近被删除的文件存在于/user/<username>/.Trash/Current 目录下,HDFS检查点机制,定期删除过期的回收站数据.
| 被删除的数据在回收站过期后NameNode从Namespace中删除文件,文件块被释放
| 降低复制因子,降低数据块的复制因子,NameNode将删除多余的副本,下一次心跳将通知DataNode,删除并释放存储空间.