2.3.3 HDFS存储原理
1.冗余数据保存
作为一个分布式文件系统,HDFS的主要设计目标就是保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上,HDFS默认的副本系数是3,这适用于大多数情况。如图2-5所示,数据块A被分别存放到数据节点1、2和4上,数据块B被存放在数据节点2、4和5上。这种多副本方式具有以下几个优点:
(1)加快数据传输速度。当多个客户端同时访问同一个文件时,客户端可以分别从不同的数据副本中读取数据集,加快了数据的传输速度。
(2)容易检查数据错误。
(3)保证数据可靠性。
图2-5 HDFS冗余数据存储
2.数据存取策略
1)数据存放
第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点。
第二个副本:放置在与第一个副本不同的机架的节点上。
第三个副本:与第一个副本相同机架的其他节点上。
更多副本:随机节点。
这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略不会影响到数据的可靠性和可用性。与此同时,因为数据块只存放在两个不同的机架上,所以此策略减少了读取数据时需要的网络传输总带宽。图2-6所示为Block的副本放置策略。
图2-6 Block的副本放置策略
2)数据读取
HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID。
当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。
3)数据复制
数据复制主要是在数据写入和数据恢复时发生。当客户端向HDFS文件写入数据时,一开始是写到本地临时文件中。假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从NameNode获取一个DataNode列表用于存放副本。然后客户端开始向第一个DataNode传输数据,第一个DataNode一小部分一小部分(4KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个DataNode节点。第二个DataNode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个DataNode。最后,第三个DataNode接收数据并存储在本地。因此,DataNode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个DataNode复制到下一个,当最后文件写完的时候,数据复制也同时完成,这个就是流水线处理的优势。
3.HDFS负载均衡
Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况。例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。当数据不平衡时,Map任务可能会分配到没有存储数据的机器,这将导致网络带宽的消耗,也无法很好地进行本地计算。
当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀地分布在各个DataNode上,均衡I/O性能,防止发生热点。进行数据的负载均衡调整,必须满足以下原则:
(1)数据平衡不能导致数据块减少、数据块备份丢失。
(2)管理员可以中止数据平衡进程。
(3)每次移动的数据量以及占用的网络资源,必须是可控的。
(4)数据均衡过程,不能影响NameNode的正常工作。
数据均衡过程的核心是一个数据均衡算法,该数据均衡算法将不断迭代数据均衡逻辑,直至集群内数据均衡为止。该数据均衡算法每次迭代的逻辑如图2-7所示。
图2-7 HDFS数据重分布流程图
①数据均衡服务(Rebalancing Server)首先要求NameNode生成DataNode数据分布分析报告,获取每个DataNode磁盘使用情况。
②Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径。
③开始数据块迁移任务,Proxy Source DataNode复制一块需要移动的数据块。
④将复制的数据块复制到目标DataNode上。
⑤删除原始数据块。
⑥目标DataNode向Proxy Source DataNode确认该数据块迁移完成。
⑦Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准。
4.数据错误与数据恢复
HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下几种情形:NameNode名称节点出错、DataNode数据节点出错和数据出错、文件的删除和恢复。
1)名称节点出错
名称节点保存了所有的元数据信息,其中,最核心的两大数据结构是FsImage和Editlog,如果这两个文件发生损坏,那么整个HDFS实例将失效。因此,HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsImage和Editlog数据进行恢复。
2)数据节点出错
每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态,当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的“心跳”信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求。这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子。名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本。HDFS和其他分布式文件系统的最大区别是可以调整冗余数据的位置。
3)文件的删除和恢复
当用户或应用程序删除某个文件时,这个文件并没有立刻从HDFS中删除。实际上,HDFS会将这个文件重命名转移到/trash目录。只要文件还在/trash目录中,该文件就可以被迅速地恢复。文件在/trash中保存的时间是可配置的,当超过这个时间时,NameNode就会将该文件从名字空间中删除。删除文件会使得该文件相关的数据块被释放。注意,从用户删除文件到HDFS空闲空间的增加之间会有一定的时间延迟。
只要被删除的文件还在/trash目录中,用户就可以恢复这个文件。如果用户想恢复被删除的文件,他/她可以浏览/trash目录找回该文件。/trash目录仅仅保存被删除文件的最后副本。/trash目录与其他目录没有区别,除了一点:在该目录上HDFS会应用一个特殊策略自动删除文件。目前的默认策略是删除/trash中保留时间超过6小时的文件。将来,这个策略可以通过一个被良好定义的接口配置。