这是我参与「第四届青训营」笔记创作活动的的第8天
HDFS基本介绍
- 分布式文件系统:本质上扩展、延伸了单机文件系统,提供了大容量、高可靠、低成本等功能特性;实现上一般也更为复杂。
- 分布式存储系统,
功能特性
分布式;容错;高可用;高吞吐;可拓展;廉价
HDFS演示环境:
- 节点类型:ZooKeeper/JournalNode/NameNode/DataNode
- HDFS 命令行交互
- HDFS Web UI
架构原理
HDFS组件
- Client/SDK:读写操作的发起点,HDFS很多读写逻辑都是在SDK中实现的。
- NameNode:元数据节点,是HDFS的中枢节点,也是服务的入口。
- DataNode:数据节点,存放实际用户数据。
元数据节点NameNode
- 维护目录树
- 维护文件和数据块的关系
- 维护文件块存放节点信息
- 分配新文件存放节点
数据节点DataNode
- 数据块存取
- 心跳汇报
- 副本复制
client写流程
- 请求写入新数据块
- 返回副本目标DataNode列表
- 写数据块
- ACK
- FLUSH
- 发送complete
client读流程
- getBlockLocations请求
- 返回副本目标DataNode列表
- 读取数据块
关键设计
分布式存储系统的基本概念
- 容错能力
- 一致性模型
- 可扩展性
- 节点体系模式
- 数据放置策略
- 单机存储引擎
NameNode目录树设计
- 仅在内存中修改:fsimage
- 需要立即保存到硬盘:EditLog
- 目录树的修改日志,可存放在本地文件系统,也可存放在专用系统上
- client更新目录树需要持久化editLog后才能表示更新成功
- NameNode HA 方案的关键点就是如何实现editLog共享
NameNode数据放置
定位分散在各个节点上的数据:
- 文件和数据块的映射关系
- 数据块的放置分布策略
DataNode设计——数据块的落盘存放
- 文件在NameNode分割成block
- DataNode以block为单位对数据进行存取
- 启动扫盘获得本机文件块列表,加载在内存中
旁路系统
balancer:均衡DataNode的容量 mover:确保副本放置符合策略要求
控制面建设
保障系统稳定运行
- HouseKeeping组件:比如Balancer,Mover等, 这些组件不运行不会马上影响读写操作,但是长时间会积累系统性问题,例如读写不均衡导致IO热点等。
- 可观测性设施:比如系统指标监控设施等,帮助快速发现定位问题。具体有指标埋点、数据采集、访问日志、数据分析。
- 运维体系建设:从最基本的命令行手工操作,脚本自动化再到完善的运维平台。
应用场景
PySpark 读写 HDFS文件
- 读取本地文件系上的文件
- 把查询结果保存到本地文件
- 读取HDFS上的文件
- 吧查询结果保存到HDFS上
ETL
- 数据如何产生、传输,分为Extract, Transform, Load
- 从数据库Extract
OLAP查询引擎
- 解决如何高效地读取分析数据的问题
- Drill, SparkSQL, Doris, PrestoDB, Hive, StarRocks, Clickhouse
通用存储场景
对象存储、消息队列、海量日志、备份数据、冷数据层等