HDFS所有功能汇总
1 HDFS原理分析
HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统。
https://blog.****.net/weixin_40035337/article/details/108006138
1.1 HDFS有什么动机和目的
1)提供较高的容错率,因为数据有备份,通过机架感知策略,namenode会尽量将数据的复本放到不同的机架上,所以小规模的宕机不影响数据的存储。
宕机:down 机,指操作系统无法从一个严重系统错误中恢复过来,或系统硬件层面出问题,以致系统长时间无响应,而不得不重新启动计算机的现象。
2)可以使用低成本的硬件搭建一个分布式文件系统。
3)能提供大规模的数据存储,上TB、PB级的规模。
4)高吞吐(并发)的数据访问,获得一个完整的数据可以从多个机器上同时读取。
数据不动计算动
5)计算时数据读取的方式多采用本地化方式,如果本地化方式不满足则采用临近网络的方式,这也是通过机架感知策略。
1.2 HDFS的系统结构
/data --> HDFS的数据存储目录
HA:高可用。zookeeper ZKFC
----------------------------------------------
namenode:是大领导。管理数据块映射;处理客户端的读写请求。一般有一个active状态的namenode,有一个standby状态的namenode,其中,active状态的NameNode负责所有的客户端操作,standby状态的NameNode处于从属地位,维护着数据状态,随时准备切换。
journalnode:负责两个状态的namenode进行数据同步,保持数据一致。
ZKFC:作用是HA自动切换。会将NameNode的active状态信息保存到zookeeper。
datanode:干活的。负责存储client发来的数据块block;执行数据块的读写操作。
关系:
1)datanode启动时要在namenode上注册,当datanode改变时,也要通知namenode。datanode 会定期向NameNode发送心跳,告知NameNode 该节点的datanode是活着的。
2)datanode之间可以相互传输数据。(为啥要把SSH全部机器都配置 nn1 ssh 其他机器)
1.3 数据块——block
一个文件分多少块,是按照你设置的存储单位大小算的(这个设置可以在配置文件中设置)。
设置存储单位时,不能太大,也不能太小。
一秒定律 根据你硬盘的一秒钟的读写兆数 --> 128M(机械) 256M(固态)
150M/S
数据块 128 M 400M文件
128 + 128 + 128 + 16M 文件 4块
如果假设 副本因子 3
block 0 128m fb1 fb2
block 1 128m fb1 fb2
block 2 128m fb1 fb2
block 3 16m fb1 fb2
占HDFS 12个数据块 占namenode的多少的内存空间 ? 12* 150字节 = 1.7K
太大:分析数据,需要很高配置的的机器,在能运算。
太小:
80M 文件 1M一个块, 分成80块数据
150字节*80=12000字节
数据块的映射信息是存在namenode的内存中,内存也是受限的,如果块太小,会占用namenode的存储空间。
80M 文件 , 64M一块, 分2块
一块:64M
一块:16M(如果小于块大小,就按照实际存储)
假设副本数是3(可以在配置文件中配置)
1)数据块是基本的数据存储单位,一般大小为64M/128M/256M,一个大文件根据数据块的大小,将文件分为若干个块。NameNode存储的文件对应的block映射信息;而datanode存储块信息对应的数据。
2)块越小读取的速度就越快,但是整体占用namenode的空间就越大,因为不管块大小一个块所占用的namenode内存存储空间为一般为150字节。
3)一个大文件会被拆分成一个个的块,然后存储于不同的机器。对于大规模的集群会存储在不同的机架上,如果一个文件少于Block大小,那么实际占用的空间为其文件的大小。
4)数据块也是基本的读写单位,类似于磁盘的扇区,每次都是读写一个块。读写多个块就合成了一个文件 分布式读写。
5)为了容错,文件的所有数据块都会有副本,也就是说复制的是数据块而不是单独的一个文件被复制了,默认复制3份(原来的文件+2个备份),可以在hdfs-site.xml里进行配置。
6)副本的数据的存储规则:
① 若client为DataNode节点,那存储block时,规则为:副本1,同client的节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
② 若client不为DataNode节点,那存储block时,规则为:副本1,随机选择一个节点上;副本2,不同机架节点上;副本3,同第二个副本机架的另一个节点上;其他副本随机挑选。
1.4 namenode
1)namenode是整个HDFS集群的中心,负责安排管理集群中数据的存储并记录存储文件的元数据和负责客户端对文件的访问。
2)存储文件的元数据(metadata),主要包括整个文件系统的目录树、文件名与blockid的映射关系、blockid在哪个datanode上。
3)在运行时把所有的元数据都保存到namenode机器的内存中,所以整个HDFS可存储的文件数受限于namenode的内存大小。一个元数据是150字节 150b
4)一个block 在namenode中对应一条记录(元数据 位置 id)。
5)namenode的元数据的镜像文件(fsimage)会保存到本地磁盘,但不保存block具体的位置信息,而是由DataNode注册和运行时进行上报维护。
6)namenode完蛋了,那整个HDFS也就完蛋了,所以要采用冗余的方案来保证NameNode(两个active standby)的高可用性。
7)元数据fsimage的保存并不及时那namenode要是宕机了怎么办?
还可以通过HDFS的操作日志记录文件(editlog)来恢复,如果元数据fsimage完整就直接恢复,不完整再用editlog进行补余。
Namenode主要维护两个文件,一个是 fsimage,一个是 editlog。
fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。
editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。
简单来想,NameNode维护了文件与数据块的映射表以及数据块与数据节点的映射表,什么意思呢?就是一个文件,它切分成了几个数据块,以及这些数据块分别存储在哪些datanode上,namenode一清二楚。Fsimage就是在某一时刻,整个hdfs的快照,就是这个时刻hdfs上所有的文件块和目录,分别的状态,位于哪些个datanode,各自的权限,各自的副本个数。然后客户端对hdfs所有的更新操作,比如说移动数据,或者删除数据,都会记录在editlog中。
为了避免editlog不断增大,secondary namenode会周期性合并fsimage和edits成新的fsimage,新的操作记录会写入新的editlog中,这个周期可以自己设置(editlog到达一定大小或者定时)。
checkpoint流程:
第一步:将hdfs更新记录写入一个新的文件——edits.new。
第二步:将fsimage和editlog通过http协议发送至secondary namenode。
第三步:将fsimage与editlog合并,生成一个新的文件——fsimage.ckpt。这步之所以要在secondary namenode中进行,是因为比较耗时,如果在namenode中进行或导致整个系统卡顿。
第四步:将生成的fsimage.ckpt通过http协议发送至namenode。
第五步:重命名fsimage.ckpt为fsimage,edits.new为edits。
所以如果namenode宕机,其实secondary namenode还保存这一份不久前的fsimage,还能挽回一些损失吧。
一旦有datanode挂掉了(宕机或者是网络阻塞),namenode能很快感知到,并且将宕机的节点上的数据块转移至其余空闲节点。这点是因为hdfs中心跳机制(heartbeat)。
心跳机制默认3s一次,datanode会向namenode发送一次一跳,告知namenode当前节点上存放的数据文件是什么。如果namenode中记录的是该datanode存放了文件A的两个数据块和文件B的一个数据块,但是心跳中只有文件A的一个数据块信息,namenode就会知道该datanode数据块损坏了,会把损坏的数据块在别的datanode上补充。
1.5 datanode
1)保存block块对应的具体数据。
2)负责数据的读写和复制操作。
3)datanode启动时会向namenode报告当前存储的数据块信息,也会持续的报告数据块的修改信息。
4)datanode之间会进行互相通信,来完成复制数据块的动作,以保证数据的冗余性。
5)给NameNode发送心跳。
1.6 HDFS数据的写入过程
1)客户端发起数据写入请求,告诉namenode要写入的文件信息;
2)namenode根据你的情况(client端所在位置、文件大小)分配给你分配写入数据的位置也就是写到那几个机器上;
3)向datanode写入数据;
4)datanode复制数据;
5)复制完成之后,各数据节点向namenode上报block信息;
6)datanode通知客户端已完成;
1.7 HDFS数据的读取过程
1)客户端发起读数据的请求;
2)告诉namenode要读那个文件;
3)namenode返回block信息列表(包括要读取的数据在那个机器上);
4)到指定的机器上读取具体的数据;
5)datanode根据block信息找到数据的存储位置并返回数据给客户端;
6)客户端读完数据之后告诉namenode我已经读取完成;