HDFS文件系统介绍

Hadoop简介

Hadoop是Apache开源软件基金会开发的运行于大规模普通服务器上用于大数据存储、计算、分析的一种分布式存储系统和分布式运行框架。
   其设计思想为使用普通机器(高性能、低成本)、数据冗余(HDFS)、并行化处理(MR)、移动计算(海量数据的情况下移动计算比移动数据更有效),其中思想基础为使用普通机器,只有做到高性能和低成本,使用门槛低,Hadoop项目才会迅速普及,被大家运用。

HDFS文件系统

一、HDFS概述

1.HDFS概念
   HDFS(Hadoop分布式文件系统)是Apache Hadoop项目的一个子项目。
   HDFS支持海量数据的存储,允许用户把成百上千的计算机组成存储集群,其中的每一台计算机称为一个节点。
   用户通过HDFS的终端命令可以操作其中的文件和目录,如同操作本地文件系统(如Linux)中的文件一样。用户也可以通过 HDFS API或MapReduce来编程访问其中的文件数据。
2.HDFS设计目标
   能检测和快速恢复硬件故障
   支持流式的数据访问
   支持超大规模数据集
   简化一致性模型
   移动计算逻辑代价比移动数据代价低
   具备良好的异构软硬件平台间的可移植性
3.HDFS工作原理
   HDFS首先把大数据文件切分成若干个更小是数据块,再把这些数据块分别写入到不同节点之中。当用户需要访问文件时,为了保证能够读取每一个数据块,HDFS使用集群中的一个节点(元数据节点NameNode)专门用来保存文件的属性信息,包括文件名、所在目录以及每一个数据块的存储位置等,这样,客户端通过NameNode节点可获得数据块的位置,直接访问DataNode即可获得数据。就好像,去一个小区找朋友,但不知道他家在哪一栋,就可以去门卫室查询朋友信息地址等,这样就不用一栋一栋地去找了,提高了工作效率。
4.HDFS主要优点
   支持超大文件存储——超大文件通常指数据规模在TB量级以上的文件
   支持流式的访问数据——HDFS的设计建立在"一次写入,多次读写"的基础上,它将数据写入严格限制为一次只能写入一个数据,字节总是被附加到一个字节流的末尾,字节流总是以写入顺序先后存储。
   运行于廉价的商用机器集群上——降低成本,普及率高

二、HDFS相关概念

1.数据块
  默认的数据块大小为128MB(Hadoop-2.2版本之前为64MB)。所以,HDFS文件总是按照128MB被切分成不同的数据块,每个数据块尽可能地存储于不同的DataNode中.不同于普通文件系统的是,当文件长度小于一个数据块的大小时,该文件是不会占用整个数据块空间。
HDFS文件系统介绍
2.元数据节点(NameNode)
  元数据节点的作用是管理分布文件系统的命名空间,并将所有的文件和目录的元数据保存到Linux本地文件系统的目录之中.这些信息采用文件命名空间镜像及编辑日志方式进行保存。此外,NameNode节点还保存了一个文件,该文件信息包括哪些数据块以及这些数据块分布在哪些DataNode之中.但这些信息并不永久存储本地文件系统,而是在NameNode启动时从各个DataNode收集而成。
3.数据节点(DataNode)
  数据节点作用是保存HDFS文件的数据内容.在客户端向HDFS写入文件时,大数据文件将被切分成多个数据块,为了保证HDFS的高吞吐量,NameNode将这些数据的存储任务指派给不同的DataNode。每一个DataNode在授受任务之后直接从客户端接收数据,经加密后写入到Linux本地系统的相应目录中。
4.辅助元数据节点(Secondary NameNode)
  辅助元数据节点的作用是周期性地将元数据节点的镜像文件fsimage和日志edits合并,以防日志文件过大.合并之后,fsimage文件也在辅助元数据节点保存一份,以便在元数据节点中的镜像文件失败时可以恢复。特别注意:Secondary NameNode不是NameNode出现问题时的备用节点。

三、HDFS总体架构

HDFS采用Master/Slave(即:主/从)架构:一个HDFS集群是由一个NameNode和若干个DataNode组成.
NameNode是存储集群的主服务器,负责管理文件系统的命名空间(NameSpace)以及客户端对文件的访问.
DataNode负责处理文件系统客户端的读写.在NameNode的统一调度下进行数据块的创建、删除和复制.
HDFS的辅助元数据节点(SecondaryNameNode)辅助NameNode处理事务日志和镜像文件.
HDFS文件系统介绍

四、HDFS文件读写

读文件:客户端向NameNode发送数据读操作请求,NameNode向客户端发送组成该文件的数据块的位置列表(即每个数据块存储哪些DataNode之中),客户端直接从这些DataNode读取文件数据(在读数据过程中,NameNode不参与文件的传输)
HDFS文件系统介绍
  写文件:客户端向NameNode发送数据写操作请求,包括文件名和目录路径等部分元数据信息;NameNode告诉客户端到哪个数据节点进行具体的数据写入操作;客户端直接将文件数据传输给DataNode,由DataNode的后台程序负责把数据保存到Linux的本地文件系统之中.
HDFS文件系统介绍

五、HDFS的数据组织机制

1.数据复制与心跳检测:NameNode全权管理数据块的复制.NameNode利用心跳检测机制来确保复制成功.它周期性地从集群中的每个DataNode接收心跳信号和块状态报告.接收到心跳信号意味着该DataNode节点工作正常.块状态报告包含了在DataNode中存储的所有数据块的列表。NameNode凭借文件名FileName、副本个数numReplicas、数据块的id序列等信息控制复制操作。
  
  2.副本存放与机架感知:为了降低HDFS集群整体的带宽消耗和读取延时,HDFS会尽量让后台读取程序读取离它最近的副本.如果在读取程序所在的同一个机架上有一个副本,那么就读取该副本。当HDFS集群跨越多个数据中心时,系统将首先读取本地数据中心的副本.副本的存放是HDFS可靠性和性能的关键.优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性.这种特征需要做大量的调优,并需要经验的积累.HDFS采用一种称为机架感知的策略来改进数据的可靠性、可用性和网络带宽的利用率。大型HDFS实例一般运行在跨越多个机架的服务器组成的集群上,不同机架上的两台服务器之间的通讯需要经过交换机.在大多数情况下,同一个机架内的两台服务器间带宽会比不同机架的两台服务器间的带宽大。
  
  3.HDFS系统是根据客户端请求来存储文件数据的。客户创建文件的请求其实并没有立即发送给NameNode,事实上,在刚开始阶段客户端会先将文件数据缓存到其本地的临时文件。当这个临时文件累积的数据量超过一个数据块的大小时,客户端才会连接NameNode。NameNode首先将文件名插入文件系统的目录结构中,并且分配一个数据块给它;然后返回一个DataNode的标识符和目标数据块给客户端;接着,客户端将这块数据从本地临时文件上传到指定的DataNode上。当文件关闭时,在临时文件中剩余的没有上传数据也会传输到指定的DataNode上。然后客户端告诉NameNode文件已经关闭。此时NameNode才将文件创建操作提交到日志里进行存储。如果NameNode在文件关闭前宕机了,则该文件丢失。
  
  4.文件系统元数据的持久化:NameNode上保存着HDFS的命名空间。客户端对文件系统元数据的任何修改操作,都会被NameNode记录下来,保存到edits事务日志文件中。
  
  5.存储空间回收与文件的删除和恢复:当用户或应用程序删除某个文件时,这个文件并没有立刻从HDFS中删除。实际上,HDFS会将这个文件重命名转移到/trash目录。只要文件还在/trash目录中,该文件就可以被迅速地恢复。文件在/trash中保存的时间是可配置的,当超过这个时间时,NameNode就会将该文件从命名空间中删除。删除文件会使得该文件相关的数据块被释放。