1. 概念
1.1 背景
当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对他进行分区并存储到若干计算机上,其中管理网络中跨多台计算机存储的文件系统称为分布式文件系统,在Hadoop中称为HDFS,即Hadoop Distributed Filesystem。
1.2 写数据流程
- Client发起文件上传请求,通过**RPC(远程过程调用协议)**与NameNode建立通讯,NameNode检查目标文件、父目录是否已存在,返回是否可以上传;
- Client请求第一个block该传输到哪些DataNode服务器上;
- NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode地址,如:A、B、C
- Client请求3台DataNode中的一台如A上传数据,A收到请求后会继续调用B,然后B调用C,从而将整个pipeline建立完成并逐级返回给Client
- Client以packet为单位(默认64k)开始往A上传第一个block,A收到一个packet就会传给B,B传给C(A每传一个packet就会放入一个应答队列等待应答)
- 在pipeline反方向上,DataNode逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipelineack发送给Client
1.3 读数据流程
- Client向NameNode发起RPC请求,来确定请求文件block所在的位置
- NameNode会视情况返回文件的部分或者全部block列表,其中对于列表中的每个block,NameNode会返回含有该block副本的DataNode地址(会进行排序,排序规则是:网络拓扑中距离Client近的排前,心跳机制中超时汇报的DataNode状态为STALE的排后)
- Client选取排序靠前的DataNode来读取block(若Client本身是DataNode,那么根据短路读取特性会从本地直接获取数据)
- 底层上建立Socket Stream(FSDataInputStream),重复的调用父类DataInputStream的read方法,直到读取完该块内容;
- 读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,Client就会通知NameNode,然后从下一个拥有该block副本的DataNode继续读;
- 最终读取来的所有block都会合并成一个完整的最终文件
2. 架构
“运行HDFS“本质上是在网络分布的不同服务器上运行一些守护进程(daemon)。HDFS采用的是**主从(Master/Slave)**体系结构:管理节点NameNode与其备份节点SecondaryNameNode、工作节点DataNode和客户端Client。
2.1 数据块
2.1.1 概念
在普通文件系统中,文件以块的形式存储在磁盘,块的大小代表系统读/写操作的最小单位。
在HDFS中不管文件大小都是以块的形式进行存储,在Hadoop1和Hadoop2版本中块默认大小分别为64MB和128MB,但也可以在配置文件hdfs-site.xml
中的dfs.block.size
字段修改默认块大小
HDFS所能存储的文件总数受限于NameNode的内存容量(NameNode将HDFS的元数据存储在内存中)
2.1.2 优势
-
最小化寻址开销
若块足够大可以使得从磁盘传输数据时间大于定位该块开始位置的时间,且当磁盘驱动器传输速率提升时,块的大小可以设置得更大(但大小不能设置过大,因为MapReduce中的map任务通常一次只处理一个块中的数据,如果任务数量少于集群中的节点数量会降低作业的运行速度)
-
简化存储子系统
将管理块和管理文件的功能区分开,可以简化存储管理(根据块的大小计算单个磁盘能存储多少个块),也消除了分布式管理文件元数据的复杂性;
-
适合数据备份
将每个块复制到几个物理上相互独立的机器上(默认3个)从而确保在块、磁盘或机器发生故障后数据不会丢失,也可以在配置文件
hdfs-site.xml
中的dfs.replication
字段修改文件的副本数来提高安全性
2.2 NN和SNN
2.2.1 概念
-
NN节点可以看作是分布式文件系统中的管理者,负责管理文件系统命名空间、集群配置和数据块复制,其负责管理的整个文件系统的文件目录树、文件/目录的元信息和文件的数据块索引以:命名空间镜像文件(FSImage,也称文件系统镜像)和编辑日志文件两种形式保存在本地文件系统中,但NN每次启动时,会动态重建与DN相关的信息(NN中与DN相关的信息不保存在NN的本地文件系统中)
-
命名空间镜像
保存某一时刻HDFS的文件目录树、文件/目录的元信息和文件的数据块索引
-
编辑日志
保存对命名空间镜像中信息的改动
-
-
SNN用于定期合并命名空间镜像和编辑日志的辅助守护进程
2.2.2 区别
SNN不接收或记录HDFS的任何实时变化,只是根据集群配置的时间间隔来获取HDFS某一个时间点的命名空间镜像和镜像的编辑日志,通过一系列操作合并得到一个新的命名空间镜像并上传、替换NN原有的命名空间镜像
2.2.3 工作机制
2.3 DN
2.3.1 概念
- DN是文件存储的基本单元,以数据块的形式保存HDFS中文件的内容和数据块的数据校验信息;
- 定期向NN发送它们所存储的块的列表,同时也会向其他DN进行通信并复制数据块,保持数据冗余性
2.3.2 存储策略
Hadoop在设计时考虑到数据的安全与高效,默认将数据文件在HDFS上存放三份,Hadoop2的存储策略为:
- 第一个副本在Client所处的节点上(若客户端在集群外则随机选一个);
- 第二个副本和第一个副本位于相同机架上的其他节点;
- 第三个副本位于不同机架上的随机节点
2.4 Client
2.4.1 概念
Client是用户和HDFS进行交互的手段,包括命令行接口、Java API、Thrift接口以及用户空间文件系统等。
3. 简单使用
3.1 HDFS命令行
-
help
hdfs dfs -help 操作命令
:查看某一个操作命令的参数信息 -
ls
hdfs dfs -ls URI
:显式文件列表(与Linux的ls类似) -
lsr
hdfs dfs -lsr URL
:在目录下递归执行ls(与UNIX的ls -R
类似) -
mkdir
hdfs dfs -mkdir [-p] <paths>
:创建目录(-p
参数可以递归创建目录) -
put
hdfs dfs -put <localsrc> ... <dst>
:将单个源文件src或多个源文件srcs从本地文件系统拷贝到目标文件系统(<dst>
对应的路径)……
3.2 安全模式操作
hdfs dfsadmin -safemode get
:查看安全模式状态hdfs dfsadmin -safemode enter
:进入安全模式hdfs dfsadmin -safemode leave
:离开安全模式
3.3 查看FSImage文件信息
hdfs oiv -i fsimage_... -p XML -o hello.xml
3.4 查看edits文件信息
hdfs oev -i edits_... -p XML -o myedit.xml
4. 应用场景
-
存储超大文件
HDFS 支持 GB 级别甚至 TB 级别的文件,每个文件大小可以大于集群中任意一个节点的磁盘容量,文件的所有数据块存在不同节点中,在进行大文件读写时采用并行的方式提高数据的吞吐量。
-
流式数据访问
由于HDFS处理的数据规模比较大,所以其设计的目标是对数据集进行批量处理,以流的形式访问数据集以保证高吞吐量,但不注重数据访问速度;
-
简化的一致性模型
HDFS采用的是一次写入、多次读取的访问模式,一旦一个文件经过创建、写入、关闭后,一般就不需要修改了,且写入只支持单个写入者,也总是以**“只添加”方式在文件末尾**写数据,这样保证了数据一致性,有利于提高高吞吐量;
-
商用硬件
因为Hadoop运行在商用硬件上,所以集群节点的故障几率比昂贵硬件要高,HDFS遇到这种故障时能够继续运行且不让用户察觉到明显的中断;
-
计算向数据靠拢
在 Hadoop 系统中,对数据进行计算时,采用将计算向数据靠拢的方式,即选择最近的数据进行计算,减少数据在网络中的传输延迟。
5. 原理优化
5.1 块缓存
通常DN从磁盘中读取数据块,但对于访问频繁的文件,其对应的块可能会被显式地缓存在DN的内存中,以堆外块缓存的形式存在,作业调度器可以利用块缓存的优势在缓存块的DN上运行任务从而提高读操作的性能,例如在连接(join)操作中可以使用一个小的查询表。
5.2 归档文件 archive
由于每个文件均按块存储,所以大量的小文件会占用NN中的大部分内存,Hadoop归档文件archive将文件存入HDFS块能够减少NN内存的使用,还能允许对文件进行透明的访问
-
创建归档文件(归档文件一定要保证yarn集群先启动)
bin/hadoop archive -archiveName myhar.har -p /user/root /user
-
查看归档文件内容
hdfs dfs -lsr /usr/myhar.har
hdfs dfs -lsr har:///user/myhar.har
-
解压归档文件
hdfs dfs -mkdir -p /user/har
hdfs dfs -cp har:///user/myhar.har/* /user/har/
hdfs dfs -lsr /usr/myhar.har
hdfs dfs -lsr har:///user/myhar.har
-
解压归档文件
hdfs dfs -mkdir -p /user/har
hdfs dfs -cp har:///user/myhar.har/* /user/har/