1. 设计目标
Ø 容错性 对错误的检测以及快速自动的恢复是HDFS文件系统的主要架构目标
Ø 流式数据的访问、批处理、高吞吐量
Ø 大数据集、大文件、高聚合数据
Ø write once read many
Ø 移动计算比移动数据更划算,当数据量很大时,把计算工作移到本地完成
Ø HDFS很方便从一个平台移植到另一个平台
2. namenode和datanode
HDFS文件系统采用master/slave结构:
一个namenode:管理文件系统的命名空间以及管理客户端对文件的访问。执行文件系统的命名空间的操作,比如打开、关闭、重命名文件的请求。
多个datanode:通常一个节点上运行一个datanode,管理它们所在节点的存储文件,datanode负责处理读写请求,datanode还处理来自于namenode的建立、删除、复制块的指令。
3. 数据复制
每个数据块被复制几份存储,datanode定时向namenode发送心跳和分块信息。心跳表示该节点工作正常,分块信息包含了这个节点上包含的所有块。
(1) 副本存放
数据块复制的存放位置需要考虑到可靠性、可用性以及网络带宽。通常HDFS文件存放在很多机架的机器上,同一机架上的机器之间的网络带宽远远高于不同机架之间的网络带宽。通过机架感知(Rack awareness)来确定每个机架的id。
一种简单情况是把同一个数据块的副本存放在不同机架的datanode上,这样可以保证在一个机架全部失效了之后数据不至于丢失,但是增加了写操作的代价。
常见的情况是,如果数据要复制3份,则把2份放在本地机架,另一份复制到其它机架。这种策略在不损失数据可靠性和读操作性能的前提下,显著的提高了写操作的性能。
读操作会选择尽量选择最近的副本返回,以便节省带宽和读延迟。
(2) 安全模式:
一旦HDFS启动,就立即进入安全模式,安全模式下不能复制数据块。然后datanode给namenode发送心跳包和块信息,块信息包含了这个datanode所拥有的块,每个块包含了这个块的所必须的最小副本数,namenode检查一个块的副本数是否达到最小副本数,一旦达到,就认为这个块是副本安全的,副本安全的块达到一定比例之后,namenode就退出安全模式,然后判断所有块仍然没有达到最小副本数的,再对它们进行复制。
4. 文件系统元数据的一致性
hdfs文件系统的命名空间保存在Namenode上,namenode使用Editlog文件来保存所有对元数据的修改的操作。命名空间以及文件块的映射和文件系统属性都保存在FsImage中。
namenode启动后,它把Editlog和FsImage中的信息全部读到内存中,checkpoint程序不断读取Editlog的信息,讲Editlog中的事务作用到FsImage中,然后把内存中的FsImage写入磁盘并删除旧的Editlog。
datanode不在同一个文件夹下面建立所有的文件,而是采用启发式决定一个文件夹下面文件的最佳数量,然后建立子文件夹。datanode启动后,扫描所有文件,生成一个数据块与本地文件的对应表发给namenode,这就是Blockreport
5. 健壮性
Ø namenode在一段时间内收不到datanode的心跳包,则认为这个datanode死掉了,存储在这个datanode上的数据块无法访问,namenode开始不断查询哪些数据块需要复制。一旦出现datanode死掉或者副本中断或者datanode磁盘故障,都要开始进行数据重新复制。
Ø 负载均衡。一旦某个datanode存的数据量低于某个阈值,rebalancer程序自动的把其它节点上的数据拷贝过来。
Ø 数据完整性。当一份HDFS文件建立的时候,会生成这份文件的校验和,保存在hdfs命名空间的一个独立的隐藏文件夹中,客户端拷贝文件时,收到文件后就去匹配这些校验和看文件是否完整。如果不完整,则从另外一个datanode重新拷贝。
Ø 元数据文件的容错。namenode可以配置成维护多份FsImage和Editlog文件副本,任何对Fsimage和Editlog文件的更新都同步到其它副本上,每次namenode启动,都会去读最近一次保存的FsImage和Editlog副本。如果namenode死掉了,需要人工干预它。自动重启或者是namenode故障转移还没实现。
Ø 快照(snapshots) HDFS暂不支持
6. 数据组织
Ø 数据块 64MB
Ø 分阶段存储 客户端创建文件的请求不是直接发送给namenode的,而是在一个datanode上建立一个临时的本地文件,当文件大小达到一个数据块的大小时,client向namenode发送请求,namenode把文件名插入文件系统并为这个文件分配数据块,返回给client的信息包括datanode的标识和目标数据块,client再把临时文件中的数据放到datanode特定位置。然后通知namenode如果这个过程中namenode死掉了,文件将丢失。
Ø 多节点存储 上面讲的是存储到单个节点的过程,如果要求数据有多个副本,那么采用管道的方式,以4KB大小的数据为一个片进行传输,第一个节点收到4KB数据后,继续接收下一片数据,同时把这个小片数据通过管道传给第二个节点。依此类推。
7. 可访问性
HDFS上的数据可以通过File System Java API在应用程序中进行访问,也可以通过shell命令行方式访问,DFSAdmin方式访问,通过浏览器查看。
8. 文件删除与回收
被删除的文件在一定时间内保存在/trash中,可以随时回收。