字节跳动青训营第4期 第8课 HDFS原理与应用
这是我参与「第四届青训营 」笔记创作活动的第3天
[TOC]
HDFS基本介绍
HDFS:Hadoop Distributed File System
分布式文件系统的优点:
- 大容量
- 高可用
- 低成本
HDFS主要功能特性
- 分布式
- 容错
- 高可用
- 高吞吐
- 可扩展
- 廉价
HDFS架构原理
组件
HDFS的基本组件结构如上
Client/SDK负责和用户交互,NameNode是元数据管理节点,DataNode是数据持久化存储节点。用户数据最终都存储在DataNode上。在实际使用中,NameNode所要管理的数据很少,所以NameNode的数量往往小于DataNode。
Client发起写操作时,先要访问NameNode去获取可以进行存储操作的所有DataNode列表,获取到列表后,访问其中第一个DataNode,把数据全部写入该DataNode,写入完成后直接返回,由这个DataNode向其他副本集进行扩展。
Client发起读操作,直接从NameNode获取目标副本集列表,然后选择其中一个副本集进行读取。
NameNode主要功能
- 维护目录树,保证所有修改可以持久化
- 维护文件和数据块的关系,文件被切分成多个块,以数据块为单位进行多副本存放
- 维护存放块节点信息
- 分配新文件存放节点
DataNode主要功能
- 数据块的存储
- 心跳汇报
- 副本复制
- 数据写入时Pipeline IO
- 机器故障时补全副本
关键设计
分布式存储系统基本概念
NameNode目录树保护
fsimage
- 文件系统目录树
- 完整存放在内存中
- 定时存放到硬盘上
- 修改只会修改内存中的目录树
EditLog
- 目录树修改日志
- Client更新目录树需要持久化EditLog后才能更新成功
- EditLog可存放在本地文件系统,也可以存放在专用系统上
- NameNode HA方案一个关键点就是如何实现EditLog共享
NameNode数据放置
数据块维护
- 目录树保存每个文件的块id
- NameNode维护每个数据块所在的节点信息
- NameNode根据DataNode汇报的信息动态维护存储位置
- NameNode不会持久化数据块位置信息,通过DataNode汇报每个DataNode有哪些数据
数据放置策略
- 新数据存放到哪个结点
- 数据均衡需要怎么合理搬迁
- 副本集如何放置
DataNode关键设计
数据块的硬盘存放
- 文件在NameNode分为Block
- DataNode以Block为单位对数据进行存储
启动扫盘
- DataNode需要知道本机存放了哪些数据块
- 启动时将数据块id加载到内存中
写异常处理 Lease Recovery
场景:文件写了一半,client突然挂了
- 副本不一致
- Lease无法释放
租约:Client要修改一个文件时,需要给NameNode上锁,这个锁也就是租约
解决方式:Lease Recovery
写异常处理 Pipeline Recovery
场景:写文件的过程DataNode侧出现异常
异常出现的时机:
- 创建连接时
- 数据传输时
- Complete阶段
读异常处理 Failover
场景:读文件的过程DataNode侧出现异常
旁路系统
- Balancer:均衡DataNode的容量
- Mover:确定副本放置位置合理
控制面建设
可观测性设施
- 指标埋点
- 数据采集
- 访问日志
- 数据分析
运维体系建设
- 运维操作平台化
- NameNode复杂化
- DataNode机器规模庞大
- 组件控制面API