这是我参与「第四届青训营 」笔记创作活动的的第36天
HDFS原理与应用
6.824项目 开源社区应用
HDFS基本介绍
Linux单机文件系统:BTRFS,ZFS,XFS,EXT4
分布式文件系统:大容量、高可靠、低成本
分布式存储系统
HDFS功能特性:
- 分布式、容错、高可用、高吞吐、可扩展、廉价
架构原理
HDFS组件
Client写流程
多个RPC请求
Client询问NameNode要写到哪里去
DataNode:Pipeline写
Client读流程
三个节点是三个副本,跟第一个交互就可以读到数据
元数据节点NameNode
- 维护目录树:保证所有修改都能持久化
- 维护文件和数据块的关系:文件被切分为多个块,文件以数据块为单位进行多副本存放
- 维护文件块存放节点信息:接收DataNode的心跳汇报信息,维护集群节点的拓扑结构
- 分配新文件存放节点:确定分配目标DataNode
数据节点DataNode
- 数据块存取
- 心跳汇报:数据块列表发给NameNode
- 副本复制:Pipeline IO;补全副本
关键设计
分布式存储
- 容错能力:处理异常场景
- 一致性模型(重点):保障多个副本内容是一致的
- 可扩展性:横向扩张scale-out能力
- 节点体系:主从模式、对等模式;高可用
- 数据放置:多个节点、多个副本;数据存放策略
- 单机存储引擎:高效存取硬盘数据(DataNode)
NameNode目录树维护
fsimage
- 完整地放在内存中
- 定时存放在硬盘上
- 修改只会修改内存中的目录树
EditLog(记录账本)
实时写到硬盘上
- 目录树的修改日志
- client更新目录树需要持久化EditLog后才能表示更新成功
- NameNode高可用关键点之一:实现EditLog共享
- EditLog可存放在专用系统或本地文件系统
NameNode数据放置
以数据块为单位
数据块信息维护
- NameNode不会持久化数据块位置信息
- NameNode根据DataNode汇报的信息动态维护位置信息
- 维护每个数据块所在的节点信息
数据放置策略
- 新数据存放到哪些节点
- 数据均衡需要怎么合理搬迁数据
- 3个副本怎么合理放置
DataNode
数据本身内容、元数据(校验码等)
数据块的硬盘存放
- 文件在NameNode已分割成block
- DataNode以block为单位对数据进行存取
启动扫盘
- DataNode需要知道本机存放了哪些数据块
- 启动时把本机硬盘上的数据块列表加载到内存中
HDFS写异常处理:Lease Recovery
租约:Client需要修改文件时,需要通过NameNode上锁,这个锁就是租约(Lease)
client写入时故障,可能产生的问题及解决
- 副本不一致:比较三个副本的内容大小,选最小的作为最终版本,作为最终写入结果
- Lease无法释放:十分钟超时时间,超时就判断进程挂了,将租约释放
HDFS写异常处理:Pipeline Recovery
写入过程中,DataNode出现异常挂掉
出现时机
- 创建连接时:重新选一个
- 数据传输时:Pipeline重新构建,把坏的节点摘除
- complete时:重新构建,选节点
Client读异常处理
读取文件过程中,DataNode出现异常
解决:节点Failover
旁路系统
旁路系统:异步性,异步解决问题
- Balancer:均衡DataNode的容量
- Mover:确保副本放置符合策略要求
应用场景
ETL:Extract,Transform,Load;解决写问题
多数据源如MySQL、MongoDB等,都会存放有价值的数据,通过ETL把有价值的数据放到数据仓库
OLAP查询引擎
HBase
机器学习:TensorFlow、PyTorch对HDFS支持