HDFS 简介
HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)是 Hadoop 核心组
成,是分布式存储服务。
分布式文件系统横跨多台计算机,在大数据时代有着广泛的应用前景,它们为存储和处理超大规模
数据提供所需的扩展能力。
HDFS是分布式文件系统中的一种。
HDFS 整体架构介绍
1)Client:就是客户端。
(1)文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行存储;
(2)与NameNode交互,获取文件的位置信息;
(3)与DataNode交互,读取或者写入数据;
(4)Client提供一些命令来管理HDFS,比如启动或者关闭HDFS;
(5)Client可以通过一些命令来访问HDFS;
2)NameNode:就是Master,它是一个主管、管理者。
(1)管理HDFS的名称空间;namespace
(2)管理数据块(Block)映射信息;
(3)配置副本策略(默认): 3
(4)处理客户端读写请求。
3) DataNode:就是Slave。NameNode下达命令,DataNode执行实际的操作。
(1)存储实际的数据块;
(2)执行数据块的读/写操作。
4) SecondaryNameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
(1)辅助NameNode,分担其工作量;
(2)定期合并Fsimage和Edits,并推送给NameNode;
(3)在紧急情况下,可辅助恢复NameNode。
NameNode内存包含哪些,具体如何分配
1)Namespace:维护整个文件系统的目录树结构及目录树上的状态变化;
2)BlockManager:维护整个文件系统中与数据块相关的信息及数据块的状态变化;
3)NetworkTopology:维护机架拓扑及DataNode信息,机架感知的基础;
4)其它:
LeaseManager:读写的互斥同步就是靠Lease实现,支持HDFS的Write-Once-Read-Many的核心数据结构;
CacheManager:Hadoop 2.3.0引入的集中式缓存新特性,支持集中式缓存的管理,实现memory-locality提升读性能;
SnapshotManager:Hadoop 2.1.0引入的Snapshot新特性,用于数据备份、回滚,以防止因用户误操作导致集群出现数据问题;
DelegationTokenSecretManager:管理HDFS的安全访问;
另外还有临时数据信息、统计信息metrics等等。
NameNode常驻内存主要被Namespace和BlockManager使用,二者使用占比分别接近50%。其它部分内存开销较小且相对固定,与Namespace和BlockManager相比基本可以忽略。
HDFS 读取数据流程解析
- 客户端通过Distributed FileSystem向NameNode请求下载文件,NameNode通过查询元数据,
找到文件块所在的DataNode地址。 - 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
- DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
- 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
HDFS写数据流程
- 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件
是否已存在,父目录是否存在。 - NameNode返回是否可以上传。
- 客户端请求第一个 Block上传到哪几个DataNode服务器上。
- NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。
- 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后
dn2调用dn3,将这个通信管道建立完成。 - dn1、dn2、dn3逐级应答客户端。
- 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单
位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个确认队列
等待确认。 - 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行
3-7步)。
NN和2NN工作机制
- 第一阶段:NameNode启动
(1)第一次启动 NameNode 格式化后,创建 fsimage 和 edits 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
(2)客户端对元数据进行增删改的请求。
(3)NameNode记录操作日志,更新滚动日志。
(4)NameNode在内存中对数据进行增删改查。 - 第二阶段:Secondary NameNode工作
(1)Secondary NameNode询问NameNode是否需要checkpoint。直接带回NameNode是否检查结果。
(2)Secondary NameNode请求执行checkpoint。
(3)NameNode滚动正在写的edits日志。
(4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
(5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
(6)生成新的镜像文件fsimage.chkpoint。
(7)拷贝fsimage.chkpoint到NameNode。
(8)NameNode将fsimage.chkpoint重新命名成fsimage。
Fsimage与Edits文件解析
- Fsimage文件:是namenode中关于元数据的镜像,一般称为检查点,这里包含了HDFS文件系统
所有目录以及文件相关信息(Block数量,副本数量,权限等信息) - Edits文件:存储了客户端对HDFS文件系统所有的更新操作记录,Client对HDFS文件系统所有的
更新操作都会被记录到Edits文件中(不包括查询操作) - seen_txid:该文件是保存了一个数字,数字对应着最后一个Edits文件名的数字
- VERSION:该文件记录namenode的一些版本号信息,比如:CusterId,namespaceID等
HDFS 安全模式
安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接
受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在
启动的时候会向NameNode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离
开安全模式。如果HDFS出于安全模式下,则文件block不能进行任何的副本复制操作,因此达到
最小的副本数量要求是基于DataNode启动时的状态来判定的,启动时不会再做任何复制(从而达
到最小副本数量要求),HDFS集群刚启动的时候,默认30S钟的时间是出于安全期的,只有过了
30S之后,集群脱离了安全期,然后才可以对集群进行操作。