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

155 阅读6分钟

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

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

一、课程概述

  1. apache HDFS的原理及应用场景
  • HDFS架构原理
  • HDFS关键设计
  • HDFS应用场景
  1. 分布式存储系统基本概念及设计问题

二、详细内容

1.HDFS基本介绍

1.1 Hadoop技术体系

  • 应用层:MapReduce/Spark
  • 调度层:YARN
  • 存储层:HDFS分布式文件系统

1.2 文件系统

  • Windows单机文件系统
    • NTFS/FAT32
  • Linux单机文件系统
    • BTRFS/ZFS/XFS/EXT4

1.3 分布式存储系统

  • 为何需要?

    • 大容量:更多的机器和存储介质
    • 高可靠:多个副本提高容错能力
    • 低成本:不需要高端硬件来扩容
  • 存储系统

    • 对象存储/文件系统/块存储/数据库

1.4 HDFS功能特性与演示环境

  • 功能特性
    • 分布式:受GFS启发用JAVA实现的开源系统,没有完整的POSIX文件系统语义
    • 容错:自动处理、规避多种错误场景,例如常见的网络错误、机器宕机等
    • 高可用:一主多备模式实现源数据高可用,数据多副本实现用户数据高可用
    • 高吞吐:client直接从dataNode读取用户数据,服务端支持海量client并发读写
    • 可扩展:支持联邦集群模式,dataNode数量可达10w级别
    • 廉价:只需要通用硬件,不需要定制高端的昂贵硬件设备

1.5 HDFS访问

  • 命令行访问:hdfs dfs
  • 网页UI访问HDFS观察使用情况

2.HDFS架构原理

HDFS架构介绍和组建用途。

2.1 分布式存储基本概念

  • 容错能力:能够处理绝大部分异常场景,例如服务器宕机、网络异常、磁盘故障、网络超时等
  • 一致性模型:实现容错需要多副本存放数据,一致性解决问题是如何保证多个副本内容一致
  • 可拓展性:分布式存储系统需要具备横向扩张scale-out的能力
  • 节点体系:常有的有主从模式、对等模式等,高可用必须
  • 数据放置:系统有多个节点组成,数据多副本存放,需要考虑数据存放策略
  • 单机存储引擎:数据需要落盘持久化,单机引擎需要解决根据系统特点如何高效存取硬盘数据

2.2 HDFS组件

  • Client/SDK:访问HDFS的机器,读写操作的发起点,HDFS很多读写逻辑都在SDK中实现
  • NameNode:源数据节点,HDFS中枢节点,服务的入口
  • DataNode:数据节点,存放实际用户数据

2.3 Client写流程

  • Client向NameNode请求写入新数据块
  • NameNode返回副本目标DataNode列表
  • Client向DataNode列表的第一个Node写入
  • 第一个DataNode把数据复制到其他节点
  • DataNode返回ACK给Client
  • Client flush写入内容
  • DataNode完成落盘后向NameNode上报新块

2.4 Client读流程

  • Client向NameNode发送getBlockLocation请求
  • NameNode返回副本DataNode列表
  • Client向第一个DataNode发送请求读取数据块

2.5 元数据节点NameNode

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

2.6 数据节点DataNode

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

3. HDFS关键设计

分布式存储系统基本原理 & HDFS各组件设计。

3.1 NameNode目录树设计

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

3.2 NameNode数据放置

  • 数据块信息维护
    • 目录树保存每个文件的块id
    • NameNode维护了每个数据块所在的节点信息
    • NameNode根据DataNode汇报的信息动态维护位置信息
    • NameNode不会持久化数据块位置信息
  • 数据放置策略
    • 数据存放到哪些节点
    • 数据均衡如何搬迁数据
    • 平均放置

3.3 DataNode设计

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

3.4 读写链路异常处理

3.4.1 写链路异常

  • 情景:文件写一半client挂了
    • 副本不一致
    • Lease无法释放
    • 租约Lease:client要修改一个文件时需要通过NameNode上锁,这个锁就是租约Lease。
    • 解决方法:Lease Recovery
      • 租约超时:判定进程die,释放相关内容
  • 情景:文件写入过程中dataNode侧出现异常挂了
    • 异常出现的时机
      • 创建连接时
      • 数据传输时
      • complete阶段
    • 解决方法:pipeline recovery
      • 数据链路进行整体重写

3.4.2 读异常

  • 读取文件过程中dataNode侧异常挂了

    • 解决方法:节点Failover
      • 读取第一节点失败 -> 读取第二节点
  • 节点读取慢

    • 解决方法:client手动切换节点
    • 如何知道慢?

3.5 旁路系统

  • balancer

    • 均衡DataNode容量:某些节点满但其他节点很空 -> 平均化
  • Mover

    • 确保副本放置符合策略要求

3.6 控制面建设

  • 可观测性设施
    • 指标埋点
    • 数据采集
    • 访问日志
    • 数据分析
  • 运维体系建设
    • 运维操作需要平台化
    • NameNode操作复杂
    • DataNode机器规模庞大
    • 组件控制面API

4. HDFS实战

4.1 ETL - Extract,Transform,Load

source --extract--> data(transform) --load-->use

4.2 OLAP查询引擎

  • HDFS -> Drill/SparkSQL/Doris...
  • 需要提供对于HDFS的支持

4.3 HBase

  • Client/ZooKeeper/HMaster负责控制
  • 通过RegionServer实现HDFS

4.4 机器学习

  • TensorFlow原生支持HDFS读写
  • PyTorch通过Alluxio访问HDFS
    • 修改源码增加HDFS支持

4.5 通用存储应用

  • 对象存储/消息队列/冷数据层/海量日志/备份数据
  • 基于HDFS实现存算分离架构

三、实践例

  1. PySpark读写HDFS文件
  • 读取本地文件,把查询结果保存到本地
    • 读取本地表格文件
    • 执行SELECT操作
    • 把SELECT保存到http://
  • 读取HDFS,把结果保存到HDFS
    • save to hdfs://

四、个人总结

本节课学习了HDFS的基础和架构方面的知识。HDFS是大数据存储的基础,是很多大数据计算框架的出发点。进一步通过实际使用学习HDFS是非常有必要的。

五、引用基础

【大数据专场 学习资料三】第四届字节跳动青训营