HDFS是分布式文件系统,扩展极为方便,非常适合存储大文件和非结构化的数据。HDFS有着高容错性的特点,设计用来部署在低廉的硬件上。HDFS流式数据访问采用一次写入,多次读取。通过放开的Posix标准要求,达到高的读取性能。首先回顾一下HDFS基本概念,接着讨论在Hadoop中,如何实现HDFS和NFS互访

浅析Hadoop HDFS和NFS数据流动技术_java

      原生HDFS的系统架构是一个典型的主、从(Master Slave)架构,包括一个NameNode节点(主节点)和多个DataNode节点(从节点),每个Slave上运行一个DataNode服务,并提供应用程序访问接口。

浅析Hadoop HDFS和NFS数据流动技术_java_02

      HDFS中数据存储的基本单位为Block,通过多副本技术把文件分成大量的数据块存放在不同DataNode节点上,读取文件时可以同时从多个节点并发读取不同块的文件,提供文件读取速度。

浅析Hadoop HDFS和NFS数据流动技术_java_03

      NameNode是整个文件系统的管理节点,它负责文件系统名字空间(Name Space)的管理与维护,同时负责客户端文件操作的控制以及具体存储任务的管理与分配。

      DataNode提供真实文件数据的存储服务。DataNode主要用于存放真实文件数据NameNode存储的信息,这些信息包括文件树、Block到DataNode映射关系、记录可用DataNode的信息等

      HDFS对文件的读、写流程如图所示,再此不再花太多时间描述,不太清楚的读者请上网搜索一下,有很多专业介绍文章供参考。

      针对Hadoop HDFS的实现,业界并没有统一的实现方式。原生HDFS是采用服务器本地磁盘实现,这样在数据读取上具有很好的本地化优势。但是本地实现方式有存在容量使用率低,影响计算等问题。目前,比较典型的实现方式主要包括:专业存储方式,HDFS连接器方式和DFS客户端接口HDFS连接器方式就是把NFS通过适配、转换成HDFS的方式


Netapp和Lustre实现方案


      在Netapp和Lustre中,将专业存储(如 NetApp FAS或E系列)作为NameNode和DateNode服务器的外置存储使用。NameNode采用FAS系列保持元数据等信息,而正真的数据保存在由E系列提供的DataNode存储中

浅析Hadoop HDFS和NFS数据流动技术_java_04

      这种实现方式是把NameNode和DataNode卸载在专业存储上,HDFS数据还是采用3份冗余,后端分布式文件系统或者SAN存储还保留自己的冗余方式(专业存储自身RAID),利用率低于原生HDFS系统,但是数据可靠性高于原生实现。


GPFS和Ceph等DFS方案


      通过提供HDFS连接器,仅封装了Hadoop通用库的接口,采用Java重新封装和派生功能适配上次HDFS接口,连接器部署在业务主机侧,后端转换为分布式文件系统(DFS)自身的协议、接口(一般为NFS)访问文件,底层采用NFS或者GPFS实现。

浅析Hadoop HDFS和NFS数据流动技术_java_05

      存储容量使用率和可靠性依赖于后端分布式文件系统的实现方式,当前主流采用Erase Code方式(取决于分布式存储),一般来说容量利用率高于原生系统。


Isilon的DFS客户端方案


      Isilon对HDFS的支持是基于DFS客户端接口的实现,在分布式文件系统内实现HDFS完整语义(即实现了NameNode和DataNode功能)

浅析Hadoop HDFS和NFS数据流动技术_java_06

      Isilon的实现方式相比HDFS连接器方式来说,更加彻底。具有非常好的兼容性。HDFS连接器方式开发相对简单,对上层HDFS覆盖面不全,但是基本上能满足大部分应用场景。这两种实现方式在容量使用率和可靠性上比较类似。


HDFS转NFS并用NFS客户端访问


      介绍完NFS转化HDFS方式后,接下来,介绍下HDFS如何转化成NFS供Linux、Unix客户端访问。即HDFS的访问除了通过API方式,HTTP Rest接口,也可以通过将HDFS以NFS的方式挂载为Linux或者Windows的“本地”文件系统


      从Hadoop2.2.0开始支持,在HDFS服务中添加对应的NFS Gateway角色实现HDFS转化NFS。NFS Gateway目前还不够完善,比如对随机读写支持很弱。通过NFS网关方式挂载HDFS文件系统,并不能把它完全当作本地文件使用。比较适合的场景是文件上传和文件下载、文件浏览等。

浅析Hadoop HDFS和NFS数据流动技术_java_07

      上图是HDFS NFS网关工作示意图,首先由NFS Client或者程序访问NFS Server,然后HDFS NFS网关做为HDFS的Client访问HDFS集群文件系统。关键环节在于中间代理或者网关(NFS Gateway)这个节点了。


      在技术上,可以把网关这层和集群某个节点部署在一起,当然也可以单独拿一台代理服务器作为HDFS的客户端。Hadoop提供了一些命令工具,启动HDFS NFS网关。可以在NameNode或者DataNode节点上查看相应的进程的运行情况。