HDFS全称是Hadoop Distributed File System。作为分布式文件系统,具有高容错性的特点。它放宽了POSIX对于操作系统接口的要求,可以直接以流(Stream)的形式访问文件系统中的数据。
HDFS能快速检测到硬件故障,也就是数据节点的Failover,并且自动恢复数据访问。
使用流形式的数据方法特点不是对数据访问时快速的反应,而是批量数据处理时的吞吐能力的最大化。
文件操作原则:
HDFS文件的操作原则是“只写一次,多次读取”。一个文件一旦被创建再写入数据完毕后就不再被修改。这种原则简化了在传统关系型数据库上,高并发模式下的数据一致性问题的问题。
节点通信:
HDFS的数据节点和命名节点,客户端和命名节点间的通信都是基于TCP/ID协议。
文件写入和读取:
对于文件写入的过程,首先客户端发送文件写入请求给命名节点,命名节点告诉客户端它负责管理的数据节点信息,客户端把它要写入的数据按照命名节点告诉它的数据节点信息分割成多个文件块然后发送给数据节点。
对于文件读取的过程,首先客户端发送文件写入请求给命名节点,命名节点告诉客户端它要访问的文件所在的数据节点,客户端去它被告知的数据节点读取数据块。
数据管道式的文件写入:
对于一次文件块的写入,是从客户端向数据节点写入请求文件块写入,数据节点分配一个文件块,客户端写入完毕后需要等待数据节点把该文件块备份到其他的数据节点才算是整个文件块写入的操作完成。然后客户端才可以开始下一个文件块的写入操作。
文件块备份:
对于文件块的备份,一共会有3份。一份放在命名节点指定的数据节点,一份放在所在相同机架上的某个数据节点,一份放在相同机器上的另一个数据节点上(集群中的一台机器可以有多个数据节点)。相同机器上的不同数据节点是应对软件层面上节点失败,而相同机架上不同机器是通过相同的交换机连接通信,在连接线等物理介质和位置上应该是非常接近的,最后的命名节点指定的数据节点应该为了像交换机宕机这种极端的情况而考虑的设计。那么这些备份在什么时候启动呢?心跳检测程序检测数据节点连接失败就启用备份。
文件块复制:
这里的文件复制概念和文件块备份不同的地方时文件块复制是为平衡数据节点存储利用率而设计的。它就是一个Balancer。HDFS中Balancer命名设定了一个起点值来平衡数据节点的磁盘存储利用率。如果某个数据节点被Balancer命令检测到磁盘使用率超过了这个值会把该节点上的文件块复制到其他的磁盘利用率低的节点上。这对于新的节点加入是有帮助的。但是有一点我不明白,这样子就变成是“被动平衡”或者说不是“绝对平衡”。因为如果是绝对平衡就应该检测哪些磁盘上的存储的使用率低,然后从别的节点上把文件块复制过来,最大程度保持整个HDFS的机器上的磁盘使用率平均。但是仔细一想,这样其实弊大于利。为什么?因为这样一来一旦检查频繁就加重了磁盘的繁忙,也没有那么必要这么做,只要磁盘利用率低于我们设定的健康值变可以。
数据校检:
和像SQL Server这类关系数据库产品对于数据页面的提供校检功能一样,HDFS也对文件块进行校检。HDFS用CRC32算法对数据进行校检,产生校检值后存入到数据块文件中,每次读取数据会将校检值和数据进行对比。
安全模式:
HDFS启动时处于安全模式。这段时间内文件系统内的内容不允许被改动和删除。其实这个阶段就跟SQL Server启动时数据库处于Recovering的状态是一样的道理,背面就是在做一些一致性的检查。而HDFS在这段时间就会做像上面说的运行Balancer命令把一些文件块复制到别的数据节点上。