Hadoop三大框架之HDFS

时间:2022-07-05 00:46:52

一、概述

  1. HDFS产生的背景及定义

  1. HDFS产生背景

随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS是分布式文件管理系统中的一种

  1. HDFS定义

HDFS(Hadoop Distributed File System)是一个文件系统,用于存储文件,通过目录树来定位为文件。它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

使用场景:适合一次写入、多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

  1. HDFS优缺点

  • 优点

  1. 高容错性

  • 数据自动保存多个副本。通过增加副本的形式,提高容错性。

  • 某一个副本丢失以后,可以自动恢复。

  1. 适合处理大数据

  • 数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据

  • 文件规模:能够处理百万规模以上的文件数量,数量相当之大。

  1. 构建在廉价机器上,通过多副本机制,提高可靠性

  • 缺点

  1. 不适合低延时数据访问,比如无法处理毫秒级的存储数据。

  1. 无法高效的对大量小文件进行存储

  • 存储大量小文件会占用NameNode大量的内存来存储文件目录和块信息,而NameNode的内存是有限的。

  • 小文件存储的寻址时间会超过读取时间,违反HDFS的设计目标

  1. 不支持并发写入、文件随即修改

  • 一个文件只能有一个写,不允许多个线程同时写

  • 仅支持数据追加(append),不支持文件的随即修改

  1. HDFS组成架构

Hadoop三大框架之HDFS

Namenode(nn)

就是master,是一个主管者、管理者

  • 管理HDFS的名称空间

  • 配置副本策略

  • 管理数据块(block)映射信息

Datanode

就是slave。namenode下达命令,datanode执行实际的操作

  • 存储实际的数据块

  • 执行数据块的读/写操作

Client

就是客户端。客户端是一个抽象的概念,无论是命令行还是通过API还是web界面来操作都是客户端

  • 文件切分。文件上传HDFS的时候,client将文件切分成一个个Block,然后进行上传

  • 与NameNode交互,获取文件的位置信息

  • 与DataNode交互,读取或写入数据

  • Client提供一些命令来管理HDFS,比如NameNode格式化

  • Client可以通过一些命令来访问HDFS,比如对HDFS增删改查操作

Secondary NameNode

并非NameNode的热备。当NameNode挂掉的时候,并不能马上替换NameNode并提供服务

  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode

  • 在紧急情况下,可辅助回复NameNode

  1. HDFS文件块大小

HDFS中的文件在物理上是分块存储 (Block)块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M。

寻址时间为传输时间的1%时,则为最佳状态。因此,传输时间=10ms/0.01=1000ms=1s。而目前磁盘的传输速率普遍为100MB/s。

思考:为什么块的大小不能设置太小,也不能设置太大?
(1) HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置
(2) 如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

总结HDFS块的大小设置主要取决于磁盘传输速率

二、HDFS的读写流程

  1. HDFS写数据流程

Hadoop三大框架之HDFS

在HDFS 写数据的过程中,NameNode 会选择离待上传数最近距离的 DataNode 接收数据。那么这个最近距离怎么计算呢?

节点距离:两个节点到达最近的共同祖先的距离总和。

写数据流程:

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

(2)NameNode返回是否可以上传。

(3)客户端请求第一个 Block上传到哪几个DataNode服务器上。

(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。

(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

(6)dn1、dn2、dn3逐级应答客户端。

(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

  1. HDFS读数据流程

Hadoop三大框架之HDFS

读取数据流程:

(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

三、NN和2NN

硬盘和内存就像阴阳两极的对立,硬盘可靠但慢,内存快但不可靠。

Hadoop三大框架之HDFS

开机启动:

将硬盘里的 edits_inprogress_001(编辑日志)和 fsimage(镜像文件)加载进内存。

客户端client发出操作请求:

1.新建一份空白的 edits_inprogress_002,用作后续的编辑日志写入。

2.将内存里的 edits_inprogress_001 改名为 edits_001,用作数据备份。

3.将操作请求内容写入 edits_inprogerss_002。

CheckPoint触发:(定时时间到/edits中的数据满了)

1.拷贝 edits_001 和 fsimage 到 2NN。

2.加载 edits_001 和 fsimage 到内存,合并生成结果命名为 fsimage.chkpoint。

3.拷贝 fsimage.chkpoint 到 NN。

4.将NN里的 fsimage.chkpoint 重命名为 fsimage ,覆盖掉原来的 fsimage。

NameNode被格式化之后,将在/opt/module/hadoop-3.1.3/data/tmp/dfs/name/current目录中产生如下文件:
fsimage_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION

(1) Fsimage文件:HDFS文件系统元数据的一个 永久性的检查点。其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
(2) Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
(3) seen_txid文件:保存的是一个数字,就是最后一个edits 的数字
(4) 每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。

四、Datanode工作原理

Hadoop三大框架之HDFS

工作机制:

1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。

3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。

4)集群运行中可以安全加入和退出一些机器。

五、HDFS重点

  1. HDFS文件块大小

  1. HDFS的shell操作

  1. HDFS的读写流程