一、前提和设计目标(6点)



硬件错误:



硬件错误是常态,错误检测和快速、自动的恢复是HDFS最核心的架构目标。



流式数据访问:



流式访问数据集,数据批处理。相比数据访问的低延迟问题,更关注对数据的高吞吐量。



大规模数据集:



支持大文件存储,既支持大数量的文件,也支持数据量大的文件。



简单的一致性模型:



一次写入多层次读取的文件访问模型,一个文件在创建、写入、和关闭之后就不需要改变。



将计算移动到数据端:



一个应用请求的计算,离它操作的数据越近就越高效。相比移动大量的数据,将计算移动到数据段计算再将结果进行汇总,可以有效降低网络阻塞得到影响,提高吞吐量。



异构软硬件平台间的可移植性



HDFS在设计的时候就考虑到平台的可移植性。这种特性方便了HDFS作为大规模数据应用平台的推广。





二、HDFS的架构组织



HDFS采用master/slave架构。



一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。



Namenode负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。



Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。



Datanode负责管理它所在节点上的存储。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。



HDFS采用java语言开发,因此可以部署在很大范围的机器上。





secondary namenode



namenode起来时,首先从image或者fsimage来读取hdfs的状态,再从edits读取操作信息。随后才会正常的往一个新的image和edits写数据。这些日志信息有可能非常大,namenode重启的时候会对这些信息进行合并,日志过多则会导致重启的时间很长。



secondary namenode与primary namenode部署在不同的主机上,阶段性地合并日志信息并将其保持在一个很小的范围内。因此secondary namenode并不能起到一个热备的作用,只能做到帮助primary namenode的功能。



注:fsimage保存了最新的元数据检查点。edits保存自最新检查点后的命名空间的变化。



HDFS同时也支持Checkpoint Node、Backup Node的功能



在设置了checkpoint的情况下,如果其他的节点信息丢失了,可以导入checkpoint信息来进行恢复。





负载均衡:



在HDFS上数据难免会存储地不均匀,使用了负载均衡之后,HDFS会基于一下几点来存储数据,是数据存储尽量分布均匀。



当一个节点内写数据的时候会对正在写入的数据块预先备份。



将备份的文件扩散到其他机架上防止整个机架故障。



在同一机架内也保存一个备份以降低网络I/O。



集群上均匀地存储数据。





Rack Awareness(机架感知):



通常大型hadoop集群以机架的形式来组织,同一个机架上不同的节点间的网络状况比不同机架之间的更为理想。此外,namenode设法将数据块副本保存在不同的机架上以提高容错性。



hadoop允许集群管理员通过配置dfs.network.script参数来确定节点所互的机架。Namenode通过这个得到集群中各个datanode机器的rackid,并据此形成datanode网络拓扑图,计算出任意两台datanode之间的距离。





安全模式



集群启动的时候,NameNode加载fsimage和edits。NameNode等待Datanode汇报节点block信息,不会提前开始block之间的复制。此刻的NameNode就是处于安全模式。等到数据节点汇报完block信息,确认block块都可用,NameNode就离开了安全模式。



必要的情况下还可以使用命令是HDFS集群显式处于安全模式。



NameNode前端页面可以显示是否处于安全模式。





fsck文件系统检查



HDFS支持使用fsck命令来检查各部分的一致性。



它被设计用于报告文件可能存在的问题,例如文件缺失了数据块之类。但是与传统的检查工具不同,这个命令并不能纠正所检测到的问题。这个命令不是hadoop shell命令,但是可以通过 bin/hdfs fsck运行。





fetchdt



HDFS支持使用fetchdt命令来获取授权标志,并将其保存在hdfs上的一个文件里。这个标识可以用于从无安全机制的终端接受安全的服务。同样,这也不是一个hadoop shell 命令,但我们可以通过 bin/hdfs fetchdt DTfile 来调用它。





恢复模式



一般我们会对元数据多备份几个存储位置,这样一个位置损坏之后我们可以从其他的存储位置读取元数据。



但若可用的存储位置都损坏了,我们应该怎么办。



此时,我们可以使用NameNode的恢复模式,使用namenode -recover,运行之后会提示你可供选择的数据恢复策略。



使用-f可以取消提示,默认都会第一个选项。



在使用此命令时可能会造成数据丢失,你必须在使用之前备份fsimage和edit 日志文件。





升级和回滚



当hadoop在现有的集群上进行升级,任何升级的软件都可能会有一些



不兼容,影响现在的应用。HDFS允许管理员回退到更早的hadoop版本,回滚集群的状态到升级之前。升级之前,管理员需要移除现有的备份,使用bin/hadoop dfsadmin -finalizeUpgrade 命令



一个典型的升级过程是这样的:



在升级hadoop软件之前,确认是否存在备份。



停止集群,分发新的hadoop版本。



多数情况下,集群运行是正常的,在确认往新的HDFS运行正常之后,升级就完成了。直到整个集群运行正常了,之前存在的文件才会被删掉。



而如果需要回到之前的版本,停掉集群,分发老版本,namenode上运行回滚命令。使用回滚选项启动集群。



升级的时候主要对保留在新版本HDFS中的路径进行重命名,否则会报错。



如果可以,建议在升级前先运行hdfs dfsadmin -saveNamespace保存namespcae信息。





文件权限和安全



文件权限配置被设计和其他属性平台类似,其安全性仅限于简单的文件权限。启动NameNode的用户是HDFS的超级哟过户。





可扩展性



hadoop目前能运行上千节点的集群。