1、访问HDFS文件系统

HDFS是工作于用户空间的文件系统,它的树状文件系统是独立的,不能像传统上工作于内核空间的文件系统一样挂载至当前操作系统的目录树上对HDFS进行访问,传统上实现文件或目录管理的命令如ls、cat等此处也无法正常使用。对HDFS文件系统上的文件进行访问,需要通过HDFS的API或者由hadoop提供的命令行工具进行。

1.1 HDFS用户接口

(1) hadoop dfs命令行接口;
(2) hadoop dfsadmin命令行接口;
(3) web接口;
(4) HDFS API;

前三者方式在后文会有详细的使用说明。无论基于何种方式与HDFS文件系统交互,其读取或写入数据的过程是相同的,下面分别对写操作和读操作的过程进行详细描述。

1.2 向HDFS文件系统保存数据

当需要存储文件并写数据时,客户端程序首先会向名称节点发起名称空间更新请求,名称节点检查用户的访问权限及文件是否已经存在,如果没有问题,名称空间会挑选一个合适的数据节点分配一个空闲数据块给客户端程序。客户端程序直接将要存储的数据发往对应的数据节点,在完成存储后,数据节点将根据名称节点的指示将数据块复制多个副本至其它节点。

Hadoop系列之七:分布式文件系统HDFS(2)_第1张图片

(1) 向HDFS集群中保存数据之前,HDFS客户端需要事先知悉目标文件系统使用的“块大小”以及“复制因子(Replication Factor,即每一个块需要保存的副本数目)”。在提交数据至HDFS之前,HDFS客户端需要将要保存的文件按块大小进行分割,并将其逐个向名称节点发起块存储请求,此时,根据复制因子,客户端会要求名称节点给出与复制因子相同个数的空闲块,这里假设为3个;

(2) 名称节点需要从找出至少3个具有可用空闲块的数据节点(同复制因子),并将这3个节点的地址以距客户端的距离由近及远的次序响应给客户端;

(3) 客户端仅向最近的数据节点(假设为DN1)发起数据存储请求;当此最近的数据节点存储完成后,其会将数据块复制到剩余的数据节点中的一个(假设为DN2),传输完成后,由DN2负责将数据块再同步至最后一个数据节点(假设为DN3);这个也称为“复制管道(replication pipeline);

(4) 当三个数据节点均存储完成后,它们会将“存储完成(DONE)”的信息分别通知给名称节点;而后,名称节点会通知客户端存储完成;

(5) 客户端以此种方式存储剩余的所有数据块,并在全部数据块存储完成后通知名称节点关闭此文件,名称节点接着会将此文件的元数据信息存储至持久存储中;

1.3 从HDFS读取数据

HDFS提供了POSIX风络的访问接口,所有的数据操作对客户端程序都是透明的。当客户端程序需要访问HDFS中的数据时,它首先基于TCP/IP协议与名称节点监听的TCP端口建立连接,接着通过客户端协议(Client Protocol)发起读取文件的请求,而后名称节点根据用户请求返回相关文件的块标识符(blockid)及存储了此数据块的数据节点。接下来客户端向对应的数据节点监听的端口发起请求并取回所需要数据块。

 

Hadoop系列之七:分布式文件系统HDFS(2)_第2张图片

(1) 客户端向名称节点请求访问某文件;

(2) 名称节点向客户端响应两个列表:(a)此文件包含的所有数据块,(b)此文件的每个数据块所在的数据节点列表;

(3) 客户端将每一个数据块从存储列表中最近的数据节点读取,而后在本地完成合并; 

 

2、名称节点的可用性

由前一节所述的过程可以得知,名称节点的宕机将会导致
HDFS文件系统中的所有数据变为不可用,而如果名称节点上的名称空间镜像文件或编辑日志文件损坏的话,整个HDFS甚至将无从重建,所有数据都会丢失。因此,出于数据可用性、可靠性等目的,必须提供额外的机制以确保此类故障不会发生,Hadoop为此提供了两种解决方案。

最简单的方式是将名称节点上的持久元数据信息实时存储多个副本于不同的存储设备中。
Hadoop的名称节点可以通过属性配置使用多个不同的名称空间存储设备,而名称节点对多个设备的写入操作是同步的。当名称节点故障时,可在一台新的物理主机上加载一份可用的名称空间镜像副本和编辑日志副本完成名称空间的重建。然而,根据编辑日志的大小及集群规模,这个重建过程可能需要很长时间。

另一种方式是提供第二名称节点(Secondary NameNode)。第二名称节点并不真正扮演名称节点角色,它的主要任务是周期性地将编辑日志合并至名称空间镜像文件中以免编辑日志变得过大。它运行在一个独立的物理主机上,并需要跟名称节点同样大的内存资源来完成文件合并。另外,它还保存一份名称空间镜像的副本。然而,根据其工作机制可知,第二名称节点要滞后于主节点,因此名称节点故障时,部分数据丢失仍然不可避免。

尽管上述两种机制可以最大程序上避免数据丢失,但其并不具有高可用的特性,名称节点依然是一个单点故障,因为其宕机后,所有的数据将不能够被访问,进而所有依赖于此
HDFS运行的MapReduce作业也将中止。就算是备份了名称空间镜像和编辑日志,在一个新的主机上重建名称节点并完成接收来自各数据节点的块信息报告也需要很长的时间才能完成。在有些应用环境中,这可能是无法接受的,为此,Hadoop 0.23引入了名称节点的高可用机制——设置两个名称节点工作于“主备”模型,主节点故障时,其所有服务将立即转移至备用节点。进一步信息请参考官方手册。

在大规模的
HDFS集群中,为了避免名称节点成为系统瓶颈,在Hadoop 0.23版本中引入了HDFS联邦(HDFS Federation)机制。HDFS联邦中,每个名称节点管理一个由名称空间元数据和包含了所有块相关信息的块池组成名称空间卷(namespace volume),各名称节点上的名称空间卷是互相隔离的,因此,一个名称节点的损坏并不影响其它名称节点继续提供服务。进一步信息请参考官方手册。

3、HDFS的容错能力

HDFS故障的三种最常见场景为:节点故障、网络故障和数据损坏。

在不具备名称节点HA功能的Hadoop中,名称节点故障将会导致整个文件系统离线;因此,名称节点故障具有非常严重的后果。具体的解决方案请见“名称节点的可用性”一节。

在HDFS集群中,各数据节点周期性地(每3秒钟)向名称节点发送心跳信息(HEARTBEAT)以通告其“健康”状况;相应地,名称节点如果在10分钟内没有收到某数据节点的心跳信息,则认为其产生了故障并将其从可用数据节点列表中移除,无论此故障产生的原因是节点自身还是网络问题。

客户端与数据节点之间的数据传输基于TCP协议进行,客户端每发送一个报文给数据节点,数据节点均会返回一个响应报文给客户端;因此,如果客户端重试数次后仍未能正常接收到来自数据节点的响应报文,其将放弃此数据节点转而使用名称节点提供的列表中的第二个数据节点。

网络传输中的噪声等都有可能导致数据讹误,为了避免数据节点存储错误的数据,客户端发送数据至数据节点时会一并传送此数据的校验和,而数据节点会连同数据一起存储此校验和。HDFS集群中,数据节点周期性地每将自己持有的所有数据块信息报告给名称节点,但在发送每个数据块的相关信息之前,其会根据校验和检验此数据块是否出现了讹误,如果检验出错,数据节点将不再向名称节点通告自己持有此数据块,名称节点从而可以得知此数据节点有数据块损坏。

参考文献:
Data-Intensive Text Processing with MapReduce
Hadoop in prictise
Hadoop Operations
Hadoop Documentation