HDFS 原理与应用|青训营笔记

96 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

课程概述:

课程以Apache HDFS为蓝本,重点介绍HDFS的原理和应用场景,加深对大规模数据分布式存储系统的理解。课程主要包括三个方面

  • HDFS架构原理
  • HDFS关键设计
  • HDFS应用场景

\

课程回顾:

  • 计算框架
    • Flink
    • Spark
  • 查询引擎
    • ·Presto

课程目标:

  • HDFS的设计与实现
  • HDFS的产品化体系建设
  • HDFS多场景的应用
  • 分布式存储系统通用基本概念

课程目录:

  • HDFS基本介绍
  • 架构原理
  • 关键设计
  • 场景应用

HDFS:Hadoop Distributed File System

1.2:分布式文件系统

  • 大容量
  • 高可靠
  • 低成本

1.3HDFS功能特性

  • 分布式
  • 容错
  • 高可用
  • 高吞吐
  • 可扩展
  • 廉价

架构原理

2.1:HDFS组件

2.2:Client 写流程

2.3:Client读流程

2.4:元数据节点NameNode

  • 维护目录树
    • 维护目录树的增删改查操作,保证所有修改都能持久化,以便机器掉电不会造成数据丢失或不一致
  • 维护文件和数据块的关系
    • 文件被切分成多个快,文件以数据块为单位进行多副本存放
  • 维护文件块存放节点关系
    • 通过接受DataNode的心跳汇报信息,维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表
  • 分配新文件的存放节点
    • Client创建新文件的时候,需要有NameNode来确定分配目标DataNode

2.5:数据节点DataNode

  • 数据块存储
    • DataNode需要高效实现对数据快在硬盘上的存储
  • 心跳汇报
    • 把存放在本机的数据快列表发送给NameNode,以便NameNode能维护数据快的位置信息,同时让NameNode确定该节点处于正常状态
  • 副本复制
    • 数据写入时Pipeline IO操作
    • 机器故障时补全副本

关键设计

分布式存储系统基本概念

  • 容错能力
    • 能够处理大部分异常场景
  • 一致性模型
    • 为了实现容错,数据必须多副本存放,即保证多个副本的内容都是一致的
  • 可扩展性
    • 分布式存储系统需要具备横向扩张scale-out的能力
  • 节点体系
    • 常见的有主从模型,对等模型等
  • 数据放置
    • 系统是由多个节点组成,数据是多个副本存放时,需要考虑数据的存放策略
  • 单机存储引擎
    • 大部分存储系统中,数据需要落盘持久化,单机引擎需要解决:根据系统特点,如何高效存取硬盘数据

NameNode目录树维护

  • fsimage
    • 文件系统目录数
    • 完整的存放在内存中
    • 定时存放到硬盘上
    • 修改只会修改内存中的目录树
  • EditLog
    • 目录树修改日志
    • client更新目录树需要持久化EditLog后才能表示跟新成功
    • EditLog可存放在本地文件系统,也可存放在专用系统上
    • NameNode HA方案一个关键点就是如何实现EditLog共享

NameNode数据放置

  • 数据快信息维护
    • 目录树保存每个文件的块id
    • NameNode维护每个数据块所在的节点信息
    • NameNode根据DataNode汇报信息动态维护位置信息
    • NameNode不会持久化数据快位置信息
  • 数据放置策略
    • 新数据存放在那个节点
    • 数据均衡怎么合理的搬迁数据
    • 3个副本怎么合理放置

DataName

  • 数据快硬盘存放
    • 文件在NameNode已分割成block
    • DataNode以block为单位对数据进行存取
  • 启动扫盘
    • DataNome需要知道本机存放了那些数据块
    • 启动时把本机硬盘上的数据块列表加载到内存中

HDFS写异常处理:Lease Recovery

  • 租约:client要修改一个文件时,需要通过NameNode上锁,这个锁就是租约
    • 文件写一半,client挂了

HDFS写异常处理:Pipeline Recovery

  • 文件写入过程中,DataNode挂了
    • 创建连接时
    • 数据传输时
    • complete阶段

Client读异常处理

  • 读取文件过程,DataNode挂了
    • 节点Failover