这是我参加「第四届青训营」笔记创作活动的的第 5天。
01.HDFS基本介绍
HDFS:Hadoop Distributed File System
认识Hadoop技术体系,理解“计算+存储”的程序应用逻辑
- 存储层:HDFS
- 调度层:YARN
- 计算框架:MapReduce。值得注意的是另外一个同属于Apache基金会的开源计算框架Apache Spark,当前业界的使用已经远超于MapReduce,尽管它不属于Hadoop项目,但是和Hadoop也有紧密关系。
文件系统:单机文件系统非常普遍,从Windows NTFS到Linux的Ext4等,分布式文件系统是单机文件的延伸,概念术语是相通的,比如目录、文件、目录树等。
- 单机文件系统:常见的如Windows NTFS,Linux的Ext4,虽然不同的操作系统和实现,但是本质都是一样的,解决相同的问题。
- 分布式文件系统:本质上扩展、延伸了单机文件系统,提供了大容量、高可靠、低成本等功能特性;实现上一般也更为复杂
02.架构原理
2.1 HDFS组件
三大件
- Client/SDK:读写操作的发起点,HDFS很多读写逻辑都是在SDK中实现的。
- NameNode:元数据节点,是HDFS的中枢节点,也是服务的入口。
- DataNode:数据节点,存放实际用户数据。
2.2 Client写流程
- client询问NameNode写到哪
- pipeline写
2.3 Client读流程
2.4 元数据节点 NameNode
- 维护目录树
- 维护文件和数据块的关系
- 维护文件块存放节点信息
- 分配新文件存放节点
2.5 数据节点 DataNode
- 数据块存取
- 心跳汇报
- 把存放在本机的数据块列表发送给NameNode,以便NameNode能维护数据块的位置信息
- 副本复制
- 数据写入时Pipeline IO操作
03.关键设计
分布式存储系统基本概念
- 容错能力
- 服务器宕机、网络异常、磁盘故障
- 一致性模型
- 为了实现容错,数据必须多副本存放
- 可扩展性
- 具备横向扩张能力
- 节点体系
- 主从模式、对等模式 高可用是必须的功能
- 数据放置
- 数据存放的策略
- 单机存储引擎
- 如何高效存取硬盘数据
3.1 NameNode 目录树维护
- 仅在内存中修改:fsimage
- 需要立即保存到硬盘:EditLog
3.2 NameNode 数据放置
-
数据块信息维护
-
一个文件分为固定大小的数据块
-
维护每个数据块所在的节点信息
-
-
数据放置策略
- 新数据存放到哪些节点
- 3个副本怎么合理放置
3.3 DataNode
-
数据块的硬盘存放
-
文件再NameNode已经分割成block
-
DataNode以block为单位对数据进行存取
-
-
启动扫盘
- DataNode需要知道本机存放了哪些数据块
- 启动时把本机硬盘上的数据块列表加载在内存中
3.4 HDFS写异常处理
Lease Recovery
-
文件写了一半,client挂了。可能问题:
-
副本不一致
-
Lease无法释放
-
租约:Client修改文件时,需要通过NameNode上锁,这个锁就是租约Lease
-
Pipeline Recovery
文件写入过程中,DataNode侧出现异常挂掉了
- 创建连接时
- 数据传输时
- complete阶段
3.5 Client读异常处理
-
读取文件时,DataNode侧出现异常挂掉了
- 切换节点读
-
节点半死不过,读取很慢
- 慢节点检测 - 节点切换
3.6 旁路系统
- Balancer:均衡DataNode的容量
- Mover:确保副本放置符合策略要求