1、HDFS介绍

1.1、HDFS是什么?

HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利;HDFS 源于 Google 在2003年10月份发表的GFS(Google File System) 论文编写出来的一套分布式文件系统。

1.2、HDFS架构

HDFS架构
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。

1)、Namenode是一个中心服务器(master),负责管理文件系统的名字空间(namespace)、客户端对文件的读写请求和配置副本策略。

2)、Datanode在集群中一般是一个节点一个((slave)),负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。

3)、Client是一个客户端,通过命令可以访问HDFS;与Namenode交互时获取文件的位置信息;与Datanode交互时读取或写入数据;文件写入到HDFS时,Client 将文件切分成 一个一个的Block,然后存储到不同的Datanode上。

Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。

1.2.1、HDFS写入流程

1)、hadoop客户端和Namenode通信请求上传文件,Namenode检查目标文件是否已存在,父目录是否存在

2)、Namenode返回信息给hadoop客户端是否可以上传

3)、hadoop客户端会先对文件进行切分,比如一个blok块128m,(如:文件有300m就会被切分成3个块,一个128M、一个128M、一个44M)请求第一个 block该传输到哪些Datanode服务器上

4)、namenode返回Datanode的服务器信息给hadoop客户端

5)、hadoop客户端请求一台Datanode上传数据(本质上是一个RPC调用,建立pipeline),第一个Datanode收到请求会继续调用第二个Datanode,然后第二个调用第三个Datanode,将整个pipeline建立完成,逐级返回hadoop客户端

6)、hadoop客户端开始往第一个Datanode上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(一个packet为64kb),当然在写入的时候Datanode会进行数据校验,它并不是通过一个packet进行一次校验而是以checksum为单位进行校验(512byte),第一台Datanode收到一个packet就会传给第二台,第二台传给第三台;第一台每传一个packet会放入一个应答队列等待应答

7)、当一个block传输完成之后,hadoop客户端再次请求Namenode上传第二个block的Datanode服务器,直至所有的block上传完成。

1.2.2、HDFS读取流程

1)、hadoop客户端发送请求,调用DistributedFileSystem API的open方法发送请求到Namenode,获得存放在Datanode节点上文件的block位置映射信息;

2)、Namenode把文件所有block的位置信息返回给hadoop客户端;

3)、hadoop客户端拿到block的位置信息后调用FSDataInputStream API的read方法并行的读取block信息,block默认有3个副本,所以每一个block只需要从一个副本读取就可以;

4)、hadoop客户端从Datanode上取回文件的所有block按照一定的顺序组成最终需要的文件;

1.3、HDFS的特点

1.3.1、HDFS的优点(适合做)

1)、高容错性

  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
  • 某一个副本丢失以后,它可以自动恢复,这是由 HDFS 内部机制实现的。

2)、适合处理高吞吐量

  • 它是通过移动计算而不是移动数据;
  • 它会把数据位置暴露给计算框架;
  • 对计算的时延不敏感;

3)、适合存储和管理大规模数据(PB级别)

  • 处理数据达到TB、甚至PB级别的数据。
  • 能够处理百万规模以上的文件数量,数量相当之大。
  • 能够处理10K节点的规模。

4)、适合简单的一致性

  • 一次写入,多次读取。文件一旦写入不能修改,只能追加。
  • 它能保证数据的一致性。

5)、适合处理非结构化数据

  • 可以处理多类型的数据(音频、视频、文本)

1.3.2、HDFS的缺点(不适合做)

1)、低延时数据访问

  • 比如毫秒级的来存储数据,这是不行的,它做不到。
  • 它适合高吞吐率的场景,就是在某一时间内写入大量的数据。但是它在低延时的情况下是不行的,比如毫秒级以内读取数据,这样它是很难做到的。

2)、小文件存储

  • 存储大量小文件(这里的小文件是指小于HDFS系统的Block大小的文件(1.0版本默认64M,2.0版本默认128M))的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
  • 小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。

3)、并发写入、文件随机修改

  • 一个文件只能有一个写,不允许多个线程同时写。
  • 仅支持数据 append(追加),不支持文件的随机修改。

1.4、HDFS数据存放和健壮性(安全)

1.4.1、HDFS副本

  • 副本1:相同客户端的节点上;
  • 副本2:不同机架中的节点上;
  • 副本3:和副本2同机架中的不同节点;
  • 其他副本:随机存放

所有副本的策略存放都由Namenode负责,Namenode会周期性地接受集群中数据节点Datanode的心跳和块(block)报告,一个心跳的传送到Namenode表示这个数据节点是正常的。

1.4.2、HDFS数据的健壮性(安全)

  • 磁盘数据错误,心跳检测和重新复制
  • 集群均衡
  • 数据完整性
  • 元数据磁盘错误
  • 快照

2、HDFS 命令

  • 列出文件或文件夹:hadoop fs -ls /
  • 创建文件夹:hadoop fs -mkdir /user/wcdoc
  • 上传文件:hadoop fs -put /tmp/LICENSE.txt /user/wcdoc
  • 下载文件:hadoop fs -get /user/wcdoc/LICENSE.txt /tmp
  • 查看文件:hadoop fs -cat /user/wcdoc/LICENSE.txt
  • 删除文件(夹):hadoop fs -rm(r) /usr/wcdoc/LICENSE.txt

3、参考资料