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采用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、参考资料
- [hadoop2.5.2文档]<http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html>;