HDFS | 青训营笔记

72 阅读3分钟

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

HDFS基本介绍

  • 分布式文件系统:本质上扩展、延伸了单机文件系统,提供了大容量、高可靠、低成本等功能特性;实现上一般也更为复杂。
  • 分布式存储系统,

功能特性

分布式;容错;高可用;高吞吐;可拓展;廉价

HDFS演示环境:

  • 节点类型:ZooKeeper/JournalNode/NameNode/DataNode
  • HDFS 命令行交互
  • HDFS Web UI

架构原理

HDFS组件

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

元数据节点NameNode

  • 维护目录树
  • 维护文件和数据块的关系
  • 维护文件块存放节点信息
  • 分配新文件存放节点

数据节点DataNode

  • 数据块存取
  • 心跳汇报
  • 副本复制

client写流程

  1. 请求写入新数据块
  2. 返回副本目标DataNode列表
  3. 写数据块
  4. ACK
  5. FLUSH
  6. 发送complete

client读流程

  1. getBlockLocations请求
  2. 返回副本目标DataNode列表
  3. 读取数据块

关键设计

分布式存储系统的基本概念

  • 容错能力
  • 一致性模型
  • 可扩展性
  • 节点体系模式
  • 数据放置策略
  • 单机存储引擎

NameNode目录树设计

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

NameNode数据放置

定位分散在各个节点上的数据:

  • 文件和数据块的映射关系
  • 数据块的放置分布策略

DataNode设计——数据块的落盘存放

  • 文件在NameNode分割成block
  • DataNode以block为单位对数据进行存取
  • 启动扫盘获得本机文件块列表,加载在内存中

旁路系统

balancer:均衡DataNode的容量 mover:确保副本放置符合策略要求

控制面建设

保障系统稳定运行

  • HouseKeeping组件:比如Balancer,Mover等, 这些组件不运行不会马上影响读写操作,但是长时间会积累系统性问题,例如读写不均衡导致IO热点等。
  • 可观测性设施:比如系统指标监控设施等,帮助快速发现定位问题。具体有指标埋点、数据采集、访问日志、数据分析。
  • 运维体系建设:从最基本的命令行手工操作,脚本自动化再到完善的运维平台。

应用场景

PySpark 读写 HDFS文件

  • 读取本地文件系上的文件
  • 把查询结果保存到本地文件
  • 读取HDFS上的文件
  • 吧查询结果保存到HDFS上

ETL

  • 数据如何产生、传输,分为Extract, Transform, Load
  • 从数据库Extract

OLAP查询引擎

  • 解决如何高效地读取分析数据的问题
  • Drill, SparkSQL, Doris, PrestoDB, Hive, StarRocks, Clickhouse

通用存储场景

对象存储、消息队列、海量日志、备份数据、冷数据层等