HDFS笔记

一:概述

1.1:HDFS的产生背景和定义

HDFS产生背景:

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

HDFS的定义:

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

适用场景:

`适合一次写入,多次读出的场景。`一个文件经过创建、写入和关闭之后就不需要改变,唯一的改变,就只有追加内容和删除内容,无法修改存储文件。

1.2:优缺点

优点:

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

2.适合处理大数据,`能够处理数据规模达到GB、TB甚至PB级别的数据,也能够处理百万规模以上的文件数量。`

缺点:

1.不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

2.`无法高效的对大量小文件进行存储。`存储大量小文件的话,会占用NameNode大量的内存来存储文件目录信息和块信息。这样是不可取的,因为NameNode的内存总是有限的,并且小文件存储的寻址时间会超过读取时间,违反了HDFS的设计初衷。

3.不支持并发写入,文件随机修改。一个文件只能有一个写,不允许多个线程同时写入,`并且仅支持数据Append(追加)`,不支持文件的随机修改。

1.3:组件

一.NameNode(nn):就是Master,它是一个主管,管理者
1.NameNode管理HDFS的名称空间,所有文件的元数据都存放在这里(文件名称一类)

2.进行配置副本策略(记录每个文件都有几个副本)

3.管理数据块(Block)映射信息(一个大文件通常分成多个数据块,这些数据块统一由NameNode记录管理,每个数据块还有不等量副本,也由NameNode管理)

4.处理客户端读写请求。

二.DataNode(dn):NameNode下达命令,DataNode执行实际的操作
1.DataNode存储实际的数据块

2.执行数据块的读/写操作

三.Client:就是客户端
1.文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传,一般最大128M或者256M一个数据块

2.与NameNode交互,获取文件的位置信息,就是NameNode先出个方案,文件应该往哪存

3.与DataNode交互,读取或者写入数据,根据NameNode的方案,和对应的DataNode交涉,存储数据

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

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

四.Secondary NameNode,并非NameNode的热备。当NameNode挂掉的时候,它不能马上替换NameNode并提供服务
1.辅助NameNode,分担工作量,比如定期合并Fsimage和Edits,并推送给NameNode

2.在紧急情况下,可辅助恢复NameNode

1.4:文件块大小

HDFS中的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,`默认大小在Hadoop2.X/3.X版本中是128M,1.X版本中是64M,`如果有个1KB的数据,也会分配128M的块,但是不会直接占用128M的空间,而是块最大128M。`实际上还是块中数据的大小来定。`如果寻址时间约为10ms,即查找到目标Block的时间为10ms,`寻址时间为传输时间的1%时,则为最佳状态。`

`HDFS的块设置得太小,会增加寻址时间,`程序一直在找块的开始位置,比如一个文件100m,分了100个1m的块,光寻址就要100次,寻址完了才开始获取数据。

`HDFS的块设置得太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需要的时间。`导致程序在处理这块数据时,会非常慢,我们要遵循寻址时间正好是传输时间1%的原则。

`HDFS块的大小设置主要取决于磁盘传输速率,普通机械硬盘,我们用128m设置块大小,固态硬盘,用256m。`

1.5:HDFS常用操作

1.    `-ls`:显示目录信息

hdfs dfs -ls /user

2.    `-cat`:显示文件内容

hdfs dfs -cat /user/test.txt

3.    `chmod、chown`:修改文件所属权限,与Linux文件系统用法相同

hdfs dfs -chmod 777 /user/test.txt

hdfs dfs -chown hdfs:hdfs /user/test.txt

4.    `-mkdir`:创建路径

hdfs dfs -mkdir /user/localhost

5.    `-cp`:从一个路径拷贝到另一个路径

hdfs dfs -cp /user/test.txt /user/localhost

6.    `-mv`:在目录中移动文件,并可以移动后改名

hdfs dfs -mv /user/test.txt /user/localhost

hdfs dfs -mv /user/test.txt /user/localhost/test11.txt

7.    `-tail`:显示一个文件的末尾1kb的数据

hdfs dfs -tail /user/test.txt

8.    `-rm`:删除文件或文件夹

hdfs dfs -rm /user/test.txt

hdfs dfs -rm /user/localhost

9.    `-rm -r`:递归删除目录及目录里面的内容

hdfs dfs -rm -r /user/localhost

10.    `-du`:统计文件夹的大小信息

hdfs dfs -du /user/localhost

11.    `-setrep`:设置HDFS中文件的副本数量

hdfs dfs -setrep 10 /user/test.txt

注意,此处设置的副本数量10,只是记录于nn的元数据中,dn数量不足,节点有几个那就只能有几个副本

二:HDFS的读写流程

2.1:写流程

1.文件写入剖析
1.客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在

2.NameNode返回是否可以上传

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

4.NameNode返回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步)

2.2:读数据

1.流程
先就近原则读,当处理能力到上限,就去副本所在服务器读

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

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

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

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

三:NN和2NN(NameNode和SecondaryNameNode)

3.1:工作机制

1.NameNode中的元数据存储在哪儿
1.`存储在内存,但是为了断电不丢失,产生了在磁盘中备份元数据的FsImage,`但是同时更新FsImage效率又会低,因此引入`Edits文件,只进行追加操作,元数据有更新等操作时,同时会进行追加,`但是Edits会越来越大,因此引入一个新的节点:`SecondaryNameNode,专门用于FsImage和Edits合并。`

2.NameNode工作机制

1.第一阶段:NameNode启动
1.1:第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存

1.2:客户端对原数据进行增删改操作请求

1.3:NameNode记录操作日志,更新滚动日志

1.4:NameNode在内存中对原数据进行增删改

2.第二阶段:Secondary NameNode工作
2.1:Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果

2.2: Secondary NameNode请求执行checkPoint

2.3:NameNode滚动正在写的Edits日志

2.4:将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode

2.5:Secondary NameNode加载编辑日志和镜像文件到内存,合并

2.6:生成新的镜像文件Fsimage.chkpoint

2.7:拷贝fsimage.chkpoint到NameNode

2.8:NameNode将fsimage.chkpoint重新命名为fsimage

3.Fsimage和Edits
3.1:Fsimage文件是HDFS文件系统元数据的一个`永久性的检查点`,其中包含HDFS文件系统所有的目录文件iNode的序列化信息

3.2:Edits文件是存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有操作首先会被记录到Edits文件中

3.3:`每次NameNode启动的时候都会将Fsimage文件读入内存,`加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并

四:DataNode

4.1:DataNode工作机制

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

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

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

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

4.2:数据完整性

一.DataNode节点保证数据完整性的方法
1.当DataNode读取Block的时候,它会计算CheckSum

2.如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏

3.Client读取其他DataNode上的Block

4.常见的校验算法crc(32),md5(128),sha1(160)

5.DataNode在其文件创建后周期验证CheckSum