HDFS原理与应用 | 青训营笔记
这是我参与「第四届青训营」笔记创作活动的的第8天。
课程回顾
计算框架:Flink、Spark
查询引擎:Presto
一、本课堂重点内容
- HDFS 的设计与实现
- HDFS 的产品优化体系建设
- HDFS 多场景的应用
- 分布式存储系统通用基本概念
二、详细知识点介绍
01.HDFS 基本介绍
HDFS:Hadoop Distributed File System
Linux 目前支持将近100种文件系统。
1.3 分布式文件系统
- 大容量
更多的机器,更多的存储介质
- 高可靠
多个副本提高容错能力
- 低成本
不需要高端硬件来扩容
1.5 HDFS 功能特性
分布式、容错、高可用、高吞吐、可扩展、廉价
02.架构原理
2.2 Client 写流程
2.3 Client 读流程
图源:教学PPT
2.4 元数据节点 NameNode
- 维护目录树
维护目录树的增删改查操作,保证所有修改都能持久化,以便机器掉电不会造成数据丢失或不一致。
- 维护文件和数据块的关系
文件被切分成多个块,文件以数据块为单位进行多副本存放.
- 维护文件块存放节点信息
通过接收 DataNode 的心跳汇报信息,维护集群节点的拓扑结构和每个文件块所有副本所在的 DataNode 类表。
- 分配新文件存放节点
Client 创建新的文件时候,需要有 NameNode 来确定分配目标 DataNode.
2.5 数据节点 DataNode
- 数据块存取
DataNode 需要高效实现对数据块在硬盘上的存取。
- 心跳汇报
存放在本机的数据块列表发送给 NameNode,以便 NameNode 能维护数据块的位置信息,同时让 NameNode 确定该节点处于正常存活状态
- 副本复制
- 数据写入时 Pipeline IO操作
- 机器故障时补全副本
03.关键设计
分布式存储系统基本概念:
- 容错能力
能够处理绝大部分异常场景,例如服务器岩机、网络异常、磁盘故障、网络超时等。
- 一致性模型
为了实现容错,数据必须多副本存放,一致性要解决的问题是如何保障这多个副本的内容都是一致的。
- 可扩展性
分布式存储系统需要具备横向扩张 scale-out 的能力。
- 节点体系
常见的有主从模式、对等模式等,不管哪模式,高可用是必须的功能。
- 数据放置
系统是由多个节点组成,数据是多个副本存放时,需要考虑数据存放的策略。
- 单机存储引
在绝大部分存储系统中,数据都是需要落盘持久化,单机引擎需要解决的是根据系统特点,如何高效得存取硬盘数据。
3.1 NameNode 目录树维护
- fsimage
- 文件系统目录树
- 完整的存放在内存中
- 定时存放到硬盘上
- 修改只会修改内存中的目录树
- EditLog
- 目录树的修改日志
- client 更新目录树需要持久化 EditLog 后才能表示更新成功
- EditLog 可存放在本地文件系统,也可存放在专用系统上
- NameNode HA 方案一个关键点就是如何实现 EditLog 共享
3.2 NameNode 数据放置
数据块信息维护
- 目录树保存每个文件的块id
- NameNode 维护了每个数据块所在的节点信息
- NameNode 根据 DataNode 汇报的信息动态维护位置信息
- NameNode 不会持久化数据块位置信息
数据放置策略
- 新建数据放到哪些节点
- 数据均衡怎么合理搬迁数据
- 2个副本怎么合理放置
3.3 DataNode
数据块的硬盘存放
- 文件在 NameNode 已分割成 block
- DataNode 以 block 为单位对数据进行存取
启动扫盘
- DataNode 需要知道本机存放了哪些数据块
- 启动时把本机硬盘上的数据块列表加载在内存中
3.4 HDFS 写异常处理
—— Lease Recovery
情景: 文件写了一半,client 自己挂掉了。
可能产生的问题:副本不一致;Lease 无法释放。
租约: Client 要修改一个文件时,需要通过 NameNode 上锁,这个锁就是租约(Lease)。
解决方法: Lease Recovery
—— Pipeline Recovery
情景: 文件写入过程中,DataNode 侧出现异常挂掉了。
异常出现的时机: 创建连接时;数据传输时;complete 阶段。
解决方法: Pipeline Recovery
3.5 Client 读异常处理
情景: 读取文件的过程,DataNode 侧出现异常挂掉了。
解决方法: 节点 Failover
增强情景: 节点半死不过,读取很慢
3.6 旁路系统
Balancer: 均衡 DataNode 的容量。
Mover: 确保副本放置符合策略要求。
3.7 控制面板建设
客观性设施: 指标埋点;数据采集;访问日志;数据分析。
运维体系建设: 运维操作需要平台化;NameNode 操作复杂;DataNode 机器规模庞大;组件控制面 API。
04.应用场景
4.3 PySpark 读写 HDFS 文件
- 读取本地文件系统上的文件
- 把查询结果保存到本地文件
- 读取 HDFS 上的文件
- 把查询结果保存到 HDFS 上
PySpark 和 HDFS 交互演示
实验1
l.读取本地表格文件 /tmp/zipcodes.csv
2.执行 SELECT 操作
3.把 SELECT 结果保存 /tmp/zipcodes-lite 日录下
实验2
1.读取 HDFS 上的表格文件 /tmp/zipcodes.csv
2.执行 SELECT 操作
3.把 SELECT 结果保存到 HDFS 的 /tmp/zipcodes-lite目录下
4.6 Hbase
图源:教学PPT
三、课程总结
- HDFS 架构
- HDFS 关键设计
- 大数据应用场景
- 通用存储场景