这是我参与「第四届青训营 」笔记创作活动的第4天
HDFS基本介绍
HDFS:hadoop Distributed File System
Hadoop架构,由3个模块组成:分布式存储HDFS,分布式计算MapReduce 或者是其他数据处理计算引擎,如spark等,还有资源调度框架yarn
单机文件系统是十分普遍且成熟的,比如windows 单机文件系统NTFS和 linux单机文件系统EXT4;那为什么还需要分布式文件系统呢?
分布式文件系统:
- 大容量:更多的存储介质
- 高可靠:多副本的容错能力
- 低成本:水平扩展
分布式存储系统的大致分类:
- 对象存储
- 文件系统
- 块存储
- 数据库
HDFS特性
- 分布式
- 容错
- 高可用
- 高吞吐
- 可扩展
- 廉价
可以利用hdfs提供的命令来对hdfs文件系统进行交互,比如上传下载等操作
架构原理
HDFS的三大组件:
- Client:读写操作的发起点,HDFS很多读写逻辑都是在SDK中实现的。
- Namenode:元数据节点,是HDFS的中枢节点,也是服务的入口。
- Datanode:数据节点,存放实际用户数据
Client 写流程
-
服务端启动HDFS中的
NN和DN进程 -
客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件
-
NN处理请求,检查客户端是否有权限上传,路径是否合法等
-
检查通过,NN响应客户端可以上传
-
客户端根据自己设置的块大小,开始上传
第一个块,默认0-128M, NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回 -
客户端根据返回的DN节点,请求
建立传输通道客户端向最近(网络距离最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近) 下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功 -
客户端每读取
64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点 通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点! 每个节点在收到packet后,向客户端发送ack确认消息! -
一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块
-
第一个块传输完成,第二块开始传输,依次重复5-8,直到最后一个块传输完成,NN向客户端响应传输完成!
-
客户端关闭输出流
Client 读流程
- 客户端向NameNode发起获取文件信息请求(getBLockLocations请求)
- NameNode 返回副本目标的DN列表
- 客户端获取列表后进行数据块的读取
无论是写还是读,client都要访问Namenode。
元数据节点 namenode
任务:
- 维护目录树:维护目录树的增删改查操作,保证修改持久化,断电不会出现数据丢失和不一致
- 维护文件和数据块的关系:在hdfs中,文件会被分成多个块,文件以数据块为单位进行多副本存放
- 维护文件块存放节点信息:DataNode的心跳汇报,维护文件类表
- 分配新文件存放节点:主要用在创建新文件时,由Namenode来确定目标DataNode的分配
数据节点 DataNode
- 数据块存取
- 心跳汇报
- 副本复制
关键设计
Namenode目录树的维护
两个关键文件:fsimage,EditLog
HDFS的目录和文件在内存中是以一颗树的形式存储的,目录树由Namenode维护,Namenode会修改这个树形结构以对外提供添加和删除文件等操作。
fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组)等。
fsimage是完全存放在内存中的,同时会定期落在硬盘中
editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作都会被记录到editlog中。
只用持久化在Editlog上后才能表示更新成功
修改操作为什么不直接写在fsimage上?
答:因为fsimage文件一般都很大(GB级别的很常见),如果所有的更新操作都往fsimage文件中添加,这样会导致系统运行的十分缓慢,对于更新操作都会记录在editlog中,为了避免editlog不断增大,secondary namenode会周期性合并fsimage和edits成新的fsimage,新的操作记录会写入新的editlog中
namenode 数据放置
HDFS中文件是以数据块为单位来存储的,所以不一定一个完整的文件在同一台机器,也就是同一台DataNode上
数据块信息维护
- 目录树保存每个文件的块id
- namenode维护每个数据块所在节点信息
- 根据DataNode汇报的信息动态维护位置信息
- 不会持久化数据块位置信息
数据放置策略
- 新数据写在哪个节点
- 数据均衡分配
- 3个副本放置的策略
DataNode
- DataNode以block为单位对数据进行存取
- 需要知道本机存放了哪些数据块
- 启动时把本机上的数据块列表加载在内存中
HDFS 写异常处理:Lease Recovery
租约:Client要修改一个文件时,需要通过Namenode上锁,这个锁就是租约(Lease)
情景:文件写了一半,client自己挂了 会出现:
- 副本不一致
- Lease无法释放
解决方法:Lease Recovery
比较副本的长度大小比较,选取最少最小那个副本作为写入标准写入 对锁进行定时解锁,避免锁没有被释放的问题
Pipeline Recovery
情景:文件写入时,DataNode出现异常挂了
出现时机:创建连接,数据传输,complete阶段
解决方法:Pipeline Recovery
读异常处理
情景:读取文件过程,datanode出现异常
解决方法:节点节点的Failover,关键在于如何检测节点的快慢
旁路系统
数据放置的不平衡,需要各个DataNode的数据平衡
同时数据块的副本存放需要满足某种放置策略。
控制面建设:保障系统稳定运行
- HouseKeeping组件:比如Balancer,Mover等, 这些组件不运行不会马上影响读写操作,但是长时间会积累系统性问题,例如读写不均衡导致IO热点等。
- 可观测性设施:比如系统指标监控设施等,帮助快速发现定位问题。
- 运维体系建设:从最基本的命令行手工操作,脚本自动化再到完善的运维平台。
个人总结
本次课程学习了大数据hadoop生态体系中复制存储层的框架HDFS框架,HDFS的重要组件有NameNode,DataNode和CLient,需要对HDFS的读写流程有一个比较清晰的认识,还需要重点理解namenode和datanode的主要任务和功能,了解它们的一些重要机制,在课下需要进行一定的实践才能更好的理解。