HDFS基础原理与架构 | 青训营笔记

268 阅读7分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

HDFS基本介绍

HDFS:hadoop Distributed File System

Hadoop架构,由3个模块组成:分布式存储HDFS,分布式计算MapReduce 或者是其他数据处理计算引擎,如spark等,还有资源调度框架yarn

单机文件系统是十分普遍且成熟的,比如windows 单机文件系统NTFS和 linux单机文件系统EXT4;那为什么还需要分布式文件系统呢?

分布式文件系统:

  • 大容量:更多的存储介质
  • 高可靠:多副本的容错能力
  • 低成本:水平扩展

分布式存储系统的大致分类:

  1. 对象存储
  2. 文件系统
  3. 块存储
  4. 数据库

HDFS特性

  1. 分布式
  2. 容错
  3. 高可用
  4. 高吞吐
  5. 可扩展
  6. 廉价

可以利用hdfs提供的命令来对hdfs文件系统进行交互,比如上传下载等操作

架构原理

HDFS的三大组件:

  • Client:读写操作的发起点,HDFS很多读写逻辑都是在SDK中实现的。
  • Namenode:元数据节点,是HDFS的中枢节点,也是服务的入口。
  • Datanode:数据节点,存放实际用户数据

Client 写流程

  1. 服务端启动HDFS中的NN和DN进程

  2. 客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件

  3. NN处理请求,检查客户端是否有权限上传,路径是否合法等

  4. 检查通过,NN响应客户端可以上传

  5. 客户端根据自己设置的块大小,开始上传第一个块,默认0-128M, NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回

  6. 客户端根据返回的DN节点,请求建立传输通道 客户端向最近(网络距离最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近) 下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功

  7. 客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点 通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点! 每个节点在收到packet后,向客户端发送ack确认消息!

  8. 一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块

  9. 第一个块传输完成,第二块开始传输,依次重复5-8,直到最后一个块传输完成,NN向客户端响应传输完成!

  10. 客户端关闭输出流

hdfs写流程.png

Client 读流程

  1. 客户端向NameNode发起获取文件信息请求(getBLockLocations请求)
  2. NameNode 返回副本目标的DN列表
  3. 客户端获取列表后进行数据块的读取

hdfs读流程.png

无论是写还是读,client都要访问Namenode。

元数据节点 namenode

任务:

  1. 维护目录树:维护目录树的增删改查操作,保证修改持久化,断电不会出现数据丢失和不一致
  2. 维护文件和数据块的关系:在hdfs中,文件会被分成多个块,文件以数据块为单位进行多副本存放
  3. 维护文件块存放节点信息:DataNode的心跳汇报,维护文件类表
  4. 分配新文件存放节点:主要用在创建新文件时,由Namenode来确定目标DataNode的分配

数据节点 DataNode

  1. 数据块存取
  2. 心跳汇报
  3. 副本复制

关键设计

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

  1. DataNode以block为单位对数据进行存取
  2. 需要知道本机存放了哪些数据块
  3. 启动时把本机上的数据块列表加载在内存中

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的主要任务和功能,了解它们的一些重要机制,在课下需要进行一定的实践才能更好的理解。

引用

HDFS读写流程(重点) - 腾讯云开发者社区-腾讯云 (tencent.com)

【大数据专场 学习资料三】第四届字节跳动青训营 - 掘金 (juejin.cn)