HDFS
1.HDFS的定义
HDFS
是一款分布式文件管理系统(Hadoop Distribute File System)。
HDFS是一个文件系统,使用
树形目录结构
管理、存储数据,其次它是分布式的系统,可以使用若干个服务器联合实现功能,并且在集群中担任不同的角色。
HDFS适合一次写入,多次读取的应用场景,文件一经写入就不需要修改。
2. HDFS的优缺点
1.优点
- HDFS具备高容错性:每台机器上的
DataNode
默认情况下每个6小时
向NameNode
汇报一次,一旦发现DataNode上的数据块丢失,NameNode会发送指令从副本中再复制一份已丢失的数据块。 - 适合处理百万规模以上的数据存储。
- 可一个构建在廉价的服务器上,并且可以通过脚本机制提高可靠性。
2.缺点
- 不适合
低延时数据访问
,毫秒级的数据存储无法实现。 - 无法对大量的小文件、散碎文件进行存储 - 因为每个文件都对应生成一个NameNode来存储文件的目录和数据块信息,每个NameNode占用大概150个字节,而NameNode内存是有限的,所以会造成资源浪费,并不可取。- 小文件的寻址时间超过文件的读取时间,违反设计初衷。
- HDFS只支持数据的追加(append),不支持直接修改。
- HDFS不支持并发写入,只能单线程写入。即
一次只能传输一个数据块
。
3.HDFS的文件块
- HDFS的寻址时间是传输时间的==1%==为最佳状态。
- 文件块设置太小会增加文件块的数量,从而增加寻址时间;设置太大会增加硬盘的读写时间,降低读写效率
- 现阶段版本,HDFS的默认文件块大小是128MB,默认大小是由当前的硬盘写入的速度决定的,实际使用中可以结合服务器的存储磁盘的性能灵活修改。
- 在1.x版本的默认文件块大小是64MB,2.x版本开始更改为128MB。
4.HDFS的组成架构
1.NameNode
NameNode是HDFS中的重要组成部分(Master、HDFS老大哥):
- 负责管理HDFS的名称空间(文件的目录结构)
- 配置副本策略(备份文的件数量)
- 管理数据块的映射信息(管理DataNode信息)
- 处理客户端读写请求。
数据上传下载归HDFS管,跟Yarn没关系!
。
2.DataNode
接收NameNode下达的命令,由DataNode执行命令。
- 用于存储真实数据块
- 执行数据块的读写操作
3. Client
就是客户端:
- 按照文件块大小设置切分文件(每读取够设置的文件块大小,自动拆分为文件块),上传时Client负责将切好的文件块(Block)上传到HDFS。
- 与NameNode通信,获取目标文件的位置信息
- 与DataNode通信,完成数据的读写操作
- Client还提供了一些命令管理HDFS,如NameNode的格式化命令
- Client可以通过一些命令访问HDFS,对HDFS进行操作,如HDFS文件增删改等
4.SecondaryNameNode
2NN
并不是NameNode的热备,当NameNode挂掉时
2NN
并不能代替NameNode提供服务。
- 2NN只是辅助NameNode,定期合并Fsimage和Edits,并推送给NameNode,分担NameNode的工作量
- 紧急情况下,能够辅助恢复部分NameNode的文档信息
- 但是2NN并不能百分百的恢复NameNode的信息
5.
HDFS的Shell操作命令
[atguigu@hadoop102 hadoop-3.1.3]$ bin/hadoop fs
[-appendToFile <localsrc>... <dst>][-cat [-ignoreCrc]<src>...][-chgrp [-R] GROUP PATH...][-chmod [-R]<MODE[,MODE]... | OCTALMODE>PATH...][-chown [-R][OWNER][:[GROUP]]PATH...][-copyFromLocal [-f][-p]<localsrc>... <dst>][-copyToLocal [-p][-ignoreCrc][-crc]<src>... <localdst>][-count [-q]<path>...][-cp [-f][-p]<src>... <dst>][-df [-h][<path>...]][-du [-s][-h]<path>...][-get [-p][-ignoreCrc][-crc]<src>... <localdst>][-getmerge [-nl]<src><localdst>][-help [cmd ...]][-ls [-d][-h][-R][<path>...]][-mkdir [-p]<path>...][-moveFromLocal <localsrc>... <dst>][-moveToLocal <src><localdst>][-mv <src>... <dst>][-put [-f][-p]<localsrc>... <dst>][-rm [-f][-r|-R][-skipTrash]<src>...][-rmdir [--ignore-fail-on-non-empty]<dir>...]<acl_spec><path>]][-setrep [-R][-w]<rep><path>...][-stat [format]<path>...][-tail [-f]<file>][-test -[defsz]<path>][-text [-ignoreCrc]<src>...]
6.
HDFS的读写流程
6.1 HDFS的写入数据流程
客户端通过HDFS Client向HDFS提交上传数据申请:
- 首先由DFS(Distributed FileSystem模块)向NN(NameNode)提交上传数据申请,并附带文件的全路径。NN会检查上传数据是否合法,之后回应请求。
- DFS再次向NN申请DN(DataNode)作为数据存储节点,NN会根据Client的实际情况默认返回
3个
DN给DFS。 - 获取DN节点信息后,FSOS(FileSystem OutputStream模块)会向DN1请求建立传输通道,DN1连接DN2,DN2连接DN3,之后逐级返回应答。
- 建立通道后,FSOS会以1个Packet(64K)为单位,向DN1发送数据包存放到DN的应答队列等待,发送完成之后由DN1发个DN2,DN2发送给DN3。
- 一个Packet完成传输后,所有的DN会并行将数据包写入磁盘中保存。
- 一个Block传输完成后,会重复
3~5
步,直到数据全部完成上传。 - 当所有数据完成上传后,FSOS会通知NN数据已完成。
1、Block 是HDFS中的数据块,默认大小为128MB,可以根据实际磁盘的读写速度进行修改。
2、Packet是数据上传下载的基本单位,大小为64KB。又将一个Packet拆分为多个516字节的chunk。
一个Packet中存储的信息为: 512byte chunk(真实数据) + 4byte sumchunk(数据校验和)
6.2 HDFS的读取数据流程
客户端通过HDFS Client向HDFS请求下载数据:
- 客户端向NN发送下载数据请求,NN做出应答,并返回目标数据的元数据。
- 客户端拿到元数据后解析元数据信息,找到目标数据所在的DN的位置。
- 客户端会找到最近的DN发送建立数据传输通道请求,如果数据没有全部存放在一个DN上,则由客户端按照就近原则找到下一个文件位置。
注意
:DN在上传数据时,只能串行传输数据,DN1传输结束再由DN2传输数据。 - DN将数据以Packet为单位上传到本地缓存,缓存完成之后再写入磁盘。
6.3HDFS副本节点的选择
NN会根据Client的请求地址,如果Client的本地有DN,则选择本地DN作为DN1,然后再另一个机架选择一个DN作为DN2,再DN2的机架随机选择一个DN3。
6.4NN和2NN的工作流程
NN中存储集群数据的元数据:
- 保存在磁盘中:优点是数据安全,不易丢失;缺点是读写速度慢,效率低。
- 保存在内存中:优点是读写速度快,效率高;缺点是断电内存信息就会消失,数据不安全
- 因此:元数据信息保存在NN的内存和磁盘中
内存中和磁盘中都存储着集群数据的元数据,磁盘中的不允许随即修改,内存中的元数据支持随即修改,因此修改的是内存中的元数据信息
。
NN中元数据管理:
NN中存有两份存储元数据文件,fsimage存放真实的元数据,存放在磁盘中保存。edits_inprocess是在内存中记录编辑元数据操作的日志文件。当满足一定条件时,2NN会通知NN进行元数据合并,NN会生成一份新的edits_inprocess追加编辑日志,2NN合并完成后会将新的fismage文件上传到NN保存,并将之前的fsimage作为历史备份保存,2NN也会保留一份fsimage作为备份。
合并元数据:
- 启动集群时,NN会将最大编号的fsimage文件和edits_inprocess文件进行合并作为最新的元数据文件保存,并在内存中生成一份新的edits_process文件追加元数据操作记录。
- 2NN会每隔1分钟向NN发送CheckPoint请求,检查edits_inprocess文件中的操作记录是否达到100万条。如果记录达到要求,2NN会通知NN进行元数据合并。
- 合并文件时,NN会停止向正在使用的edits文件中追加记录,并产生一个新的edits文件作为日志追加操作记录。2NN将NN中的fsimage和edits文件拷贝到2NN本地内存并完成合并。
- 合并之后2NN会将新的元数据文件fsimage.chkpoint发送给NN。NN会将文件改名后保存作为最新的元数据记录,之前的元数据作为历史记录保存。2NN在上传的同时会保存一份文件作为备份。
- 如果NN中edits的编辑日志一直没有达到100万条,则2NN会自集群启动开始每隔一小时完成一次上述的合并操作。
7. DN的工作机制
- DN首次启动后会向NN注册信息。成功后会每隔6个小时向NN汇报一次DN的所有数据信息。
- DN工作时每
3秒
向NN发送一次心跳,从NN处返回的心跳信号包括NN向DN下达的指令。 - 如果DN掉线,并且心跳信号超过
10分钟 + 30秒
,则NN会将此DN判定为死亡状态,不可用的节点。
DN保证数据完整性
- 当DN读取到Block数据块信息时,每隔10分钟计算该Block的校验和CheckSum。
- 如果CheckSum跟创建Block时的校验和不一致则判定当前数据块损坏。
- 损坏数据的DN会找到最近的保存文件副本的DN,并完成Block更新。
8.新节点的服役、退役
服役
当需要扩展新的存储节点时,只需要将新的服务器设置好目标集群的配置,并更该主机名、IP信息。之后启动DataNode和NodeManager就完成了新节点的扩展。
#单点启动命令
hdfs --daemon start datanode 启动datanode
yarn --daemon start nodemanager 启动nodemanager
退役
当一台服务器需要移出集群,但是服务器的数据需要保留备份时,需要退役服务器。
使用
黑名单、白名单
的机制管理集群服务器。
在NN的节点服务器的**/opt/module/hadoop-3.1.3/etc/hadoop**目录下创建黑名单和白名单文件。
白名单的服务器就是正常运行的服务器。
黑名单中的服务器会在完成数据迁移后退出集群。
创建好黑白名单后,需要向hdfs-site.xml中追加配置信息。并将配置文件和黑白名单文件分发到所有集群服务器。
<!-- 白名单 --><property><name>dfs.hosts</name><value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value></property><!-- 黑名单 --><property><name>dfs.hosts.exclude</name><value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value></property>
服务器完成退役后,不需要重启集群,只需要刷新集群就可以。
hdfs dfsadmin -refreshNodes 刷新hdfs节点信息
yarn rmadmin -refreshNodes 刷新yarn节点信息
版权归原作者 不太会 ๑ 所有, 如有侵权,请联系我们删除。