这是我参与「第四届青训营 」笔记创作活动的第4天
课程概述:
课程以Apache HDFS为蓝本,重点介绍HDFS的原理和应用场景,加深对大规模数据分布式存储系统的理解。课程主要包括三个方面
- HDFS架构原理
- HDFS关键设计
- HDFS应用场景
\
课程回顾:
- 计算框架
-
- Flink
- Spark
- 查询引擎
-
- ·Presto
课程目标:
- HDFS的设计与实现
- HDFS的产品化体系建设
- HDFS多场景的应用
- 分布式存储系统通用基本概念
课程目录:
- HDFS基本介绍
- 架构原理
- 关键设计
- 场景应用
HDFS:Hadoop Distributed File System
1.2:分布式文件系统
- 大容量
- 高可靠
- 低成本
1.3HDFS功能特性
- 分布式
- 容错
- 高可用
- 高吞吐
- 可扩展
- 廉价
架构原理
2.1:HDFS组件
2.2:Client 写流程
2.3:Client读流程
2.4:元数据节点NameNode
- 维护目录树
-
- 维护目录树的增删改查操作,保证所有修改都能持久化,以便机器掉电不会造成数据丢失或不一致
- 维护文件和数据块的关系
-
- 文件被切分成多个快,文件以数据块为单位进行多副本存放
- 维护文件块存放节点关系
-
- 通过接受DataNode的心跳汇报信息,维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表
- 分配新文件的存放节点
-
- Client创建新文件的时候,需要有NameNode来确定分配目标DataNode
2.5:数据节点DataNode
- 数据块存储
-
- DataNode需要高效实现对数据快在硬盘上的存储
- 心跳汇报
-
- 把存放在本机的数据快列表发送给NameNode,以便NameNode能维护数据快的位置信息,同时让NameNode确定该节点处于正常状态
- 副本复制
-
- 数据写入时Pipeline IO操作
- 机器故障时补全副本
关键设计
分布式存储系统基本概念
- 容错能力
-
- 能够处理大部分异常场景
- 一致性模型
-
- 为了实现容错,数据必须多副本存放,即保证多个副本的内容都是一致的
- 可扩展性
-
- 分布式存储系统需要具备横向扩张scale-out的能力
- 节点体系
-
- 常见的有主从模型,对等模型等
- 数据放置
-
- 系统是由多个节点组成,数据是多个副本存放时,需要考虑数据的存放策略
- 单机存储引擎
-
- 大部分存储系统中,数据需要落盘持久化,单机引擎需要解决:根据系统特点,如何高效存取硬盘数据
NameNode目录树维护
- fsimage
-
- 文件系统目录数
- 完整的存放在内存中
- 定时存放到硬盘上
- 修改只会修改内存中的目录树
- EditLog
-
- 目录树修改日志
- client更新目录树需要持久化EditLog后才能表示跟新成功
- EditLog可存放在本地文件系统,也可存放在专用系统上
- NameNode HA方案一个关键点就是如何实现EditLog共享
NameNode数据放置
- 数据快信息维护
-
- 目录树保存每个文件的块id
- NameNode维护每个数据块所在的节点信息
- NameNode根据DataNode汇报信息动态维护位置信息
- NameNode不会持久化数据快位置信息
- 数据放置策略
-
- 新数据存放在那个节点
- 数据均衡怎么合理的搬迁数据
- 3个副本怎么合理放置
DataName
- 数据快硬盘存放
-
- 文件在NameNode已分割成block
- DataNode以block为单位对数据进行存取
- 启动扫盘
-
- DataNome需要知道本机存放了那些数据块
- 启动时把本机硬盘上的数据块列表加载到内存中
HDFS写异常处理:Lease Recovery
- 租约:client要修改一个文件时,需要通过NameNode上锁,这个锁就是租约
-
- 文件写一半,client挂了
HDFS写异常处理:Pipeline Recovery
- 文件写入过程中,DataNode挂了
-
- 创建连接时
- 数据传输时
- complete阶段
Client读异常处理
- 读取文件过程,DataNode挂了
-
- 节点Failover