这是我参与「第四届青训营」笔记创作活动的第9天
以下是我对于HDFS原理相关的知识摘录,不涉及课程中的应用部分。
HDFS
学习重点:了解概念及应用场景
建议:从事分布式系统:lab(MIT 6.824)、参与开源社区
基本介绍
- 应用层:MapReduce、Spark(其不属于HDFS子项目,但很多功能依赖于Hadoop)
- 调度层:YARN
- 存储层:HDFS
分布式存储系统大致分为以下几类:
架构
三大件概览
Client写流程
读流程
NameNode在其中起中枢作用(维护目录树、文件切块等等) DateNode 确保数据在硬盘上的高效存取
从特性看关键设计
总特性
容错能力(服务器宕机、网络异常等异常场景,我的理解是一个节点错了不应该导致整个系统崩溃)---> 一致性模型(为了实现容错,数据必须留有多个副本,要保证副本的一致性)-->数据存放策略--> 节点体系(主从模式、对等模式等,要保证高可用性)
其他:
- 可扩展性(我的理解:允许更多结点(client加入))
- 单机存储引擎中 高效存储硬盘数据
NameNode目录树维护
fsimage(文件系统目录树)
完整存放于内存,修改时只修改内存中的目录树;定时存放到硬盘上。
EditLog(目录树修改日志,为了防止上述结点挂掉后出现问题)
只有持久化到EditLog才能更新成功
Q:Editlog存放在哪里?
A:可存放在本地文件系统或专用系统
Q:如何实现EditLog共享?
A:详见NameNode HA方案
NameNode 数据放置
数据块信息维护
注:文件在NameNode中已分割成block
- 目录树保存每个文件的块id
- NameNode不会持久化数据块位置信息,而是维护其节点信息,并根据DataNode汇报的信息动态维护位置信息。
数据放置策略
选第二个
DataNode
- DataNode以block为单位对数据进行存取(硬盘存放)
- 它需要知道本机存放了哪些数据块,并在启动时把本机硬盘上的数据块列表加载到内存中(启动扫盘)
HDFS写异常处理
-
Q:文件写入过程中client挂掉了会有什么后果?
A: 副本不一致;锁(lease,直译为租约,但功能与锁相近)无法释放
S:lease recovery
-
Q:文件写入过程中DataNode出现异常挂了会是什么原因?
A:异常出现时机:
创建连接时;数据传输;complete阶段
S:pipeline recovery
-
类似:文件读取时DataNode挂了
A:结点failover