HDFS原理与应用|青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第6天。
一、课程概述
- apache HDFS的原理及应用场景
- HDFS架构原理
- HDFS关键设计
- HDFS应用场景
- 分布式存储系统基本概念及设计问题
二、详细内容
1.HDFS基本介绍
1.1 Hadoop技术体系
- 应用层:MapReduce/Spark
- 调度层:YARN
- 存储层:HDFS分布式文件系统
1.2 文件系统
- Windows单机文件系统
- NTFS/FAT32
- Linux单机文件系统
- BTRFS/ZFS/XFS/EXT4
1.3 分布式存储系统
-
为何需要?
- 大容量:更多的机器和存储介质
- 高可靠:多个副本提高容错能力
- 低成本:不需要高端硬件来扩容
-
存储系统
- 对象存储/文件系统/块存储/数据库
1.4 HDFS功能特性与演示环境
- 功能特性
- 分布式:受GFS启发用JAVA实现的开源系统,没有完整的POSIX文件系统语义
- 容错:自动处理、规避多种错误场景,例如常见的网络错误、机器宕机等
- 高可用:一主多备模式实现源数据高可用,数据多副本实现用户数据高可用
- 高吞吐:client直接从dataNode读取用户数据,服务端支持海量client并发读写
- 可扩展:支持联邦集群模式,dataNode数量可达10w级别
- 廉价:只需要通用硬件,不需要定制高端的昂贵硬件设备
1.5 HDFS访问
- 命令行访问:hdfs dfs
- 网页UI访问HDFS观察使用情况
2.HDFS架构原理
HDFS架构介绍和组建用途。
2.1 分布式存储基本概念
- 容错能力:能够处理绝大部分异常场景,例如服务器宕机、网络异常、磁盘故障、网络超时等
- 一致性模型:实现容错需要多副本存放数据,一致性解决问题是如何保证多个副本内容一致
- 可拓展性:分布式存储系统需要具备横向扩张scale-out的能力
- 节点体系:常有的有主从模式、对等模式等,高可用必须
- 数据放置:系统有多个节点组成,数据多副本存放,需要考虑数据存放策略
- 单机存储引擎:数据需要落盘持久化,单机引擎需要解决根据系统特点如何高效存取硬盘数据
2.2 HDFS组件
- Client/SDK:访问HDFS的机器,读写操作的发起点,HDFS很多读写逻辑都在SDK中实现
- NameNode:源数据节点,HDFS中枢节点,服务的入口
- DataNode:数据节点,存放实际用户数据
2.3 Client写流程
- Client向NameNode请求写入新数据块
- NameNode返回副本目标DataNode列表
- Client向DataNode列表的第一个Node写入
- 第一个DataNode把数据复制到其他节点
- DataNode返回ACK给Client
- Client flush写入内容
- DataNode完成落盘后向NameNode上报新块
2.4 Client读流程
- Client向NameNode发送getBlockLocation请求
- NameNode返回副本DataNode列表
- Client向第一个DataNode发送请求读取数据块
2.5 元数据节点NameNode
- 维护目录树:目录树的增删改查,保证所有修改都能持久化,以便机器掉点不造成数据丢失或不一致
- 维护文件和数据块关系:文件被切分成多个块,文件以数据块为单位进行多副本存放
- 维护文件块存放节点信息:通过接受dataNode的心跳汇报,维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表
- 分配新文件存放节点:client创建新文件时需要有NameNode来分配目标DataNode
2.6 数据节点DataNode
- 数据块存取:DataNode需要高效实现对数据块在硬盘上的存取
- 心跳汇报:把存放在本机的数据块列表发送给nameNode,以便nameNode能维护数据块的位置信息,同时让NameNode确定该节点处于正常存活状态
- 副本复制:数据写入时pipeline IO操作+机器故障时补全副本
3. HDFS关键设计
分布式存储系统基本原理 & HDFS各组件设计。
3.1 NameNode目录树设计
- fsimage
- 文件系统目录树
- 完整的存放在内存中
- 定时存放到硬盘上
- 修改只会修改内存中的目录树
- EditLog
- 目录树的修改日志
- client更新目录树需要持久化EditLog后才能表示更新成功
- EditLog可存放在本地文件系统,也可存放在专用系统上
- NameNode HA方案关键点就是如何实现EditLog共享
- HDFS高可用关键方面:如何实现EditLog共享
3.2 NameNode数据放置
- 数据块信息维护
- 目录树保存每个文件的块id
- NameNode维护了每个数据块所在的节点信息
- NameNode根据DataNode汇报的信息动态维护位置信息
- NameNode不会持久化数据块位置信息
- 数据放置策略
- 数据存放到哪些节点
- 数据均衡如何搬迁数据
- 平均放置
3.3 DataNode设计
- 数据块的硬盘存放
- 文件在NameNode已经分割成block
- DataNode以block为单位对数据进行存取
- 启动扫盘
- DataNode需要知道本机存放了哪些数据块
- 启动时把本机磁盘上的数据块列表加载在内存中
3.4 读写链路异常处理
3.4.1 写链路异常
- 情景:文件写一半client挂了
- 副本不一致
- Lease无法释放
- 租约Lease:client要修改一个文件时需要通过NameNode上锁,这个锁就是租约Lease。
- 解决方法:Lease Recovery
- 租约超时:判定进程die,释放相关内容
- 情景:文件写入过程中dataNode侧出现异常挂了
- 异常出现的时机
- 创建连接时
- 数据传输时
- complete阶段
- 解决方法:pipeline recovery
- 数据链路进行整体重写
- 异常出现的时机
3.4.2 读异常
-
读取文件过程中dataNode侧异常挂了
- 解决方法:节点Failover
- 读取第一节点失败 -> 读取第二节点
- 解决方法:节点Failover
-
节点读取慢
- 解决方法:client手动切换节点
- 如何知道慢?
3.5 旁路系统
-
balancer
- 均衡DataNode容量:某些节点满但其他节点很空 -> 平均化
-
Mover
- 确保副本放置符合策略要求
3.6 控制面建设
- 可观测性设施
- 指标埋点
- 数据采集
- 访问日志
- 数据分析
- 运维体系建设
- 运维操作需要平台化
- NameNode操作复杂
- DataNode机器规模庞大
- 组件控制面API
4. HDFS实战
4.1 ETL - Extract,Transform,Load
source --extract--> data(transform) --load-->use
4.2 OLAP查询引擎
- HDFS -> Drill/SparkSQL/Doris...
- 需要提供对于HDFS的支持
4.3 HBase
- Client/ZooKeeper/HMaster负责控制
- 通过RegionServer实现HDFS
4.4 机器学习
- TensorFlow原生支持HDFS读写
- PyTorch通过Alluxio访问HDFS
- 修改源码增加HDFS支持
4.5 通用存储应用
- 对象存储/消息队列/冷数据层/海量日志/备份数据
- 基于HDFS实现存算分离架构
三、实践例
- PySpark读写HDFS文件
- 读取本地文件,把查询结果保存到本地
- 读取本地表格文件
- 执行SELECT操作
- 把SELECT保存到http://
- 读取HDFS,把结果保存到HDFS
- save to hdfs://
四、个人总结
本节课学习了HDFS的基础和架构方面的知识。HDFS是大数据存储的基础,是很多大数据计算框架的出发点。进一步通过实际使用学习HDFS是非常有必要的。