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

114 阅读3分钟

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

HDFS原理与应用

6.824项目 开源社区应用

HDFS基本介绍

Linux单机文件系统:BTRFS,ZFS,XFS,EXT4

分布式文件系统:大容量、高可靠、低成本

分布式存储系统

HDFS功能特性:

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

架构原理

HDFS组件
Client写流程

多个RPC请求

Client询问NameNode要写到哪里去

DataNode:Pipeline写

Client读流程

三个节点是三个副本,跟第一个交互就可以读到数据

元数据节点NameNode
  • 维护目录树:保证所有修改都能持久化
  • 维护文件和数据块的关系:文件被切分为多个块,文件以数据块为单位进行多副本存放
  • 维护文件块存放节点信息:接收DataNode的心跳汇报信息,维护集群节点的拓扑结构
  • 分配新文件存放节点:确定分配目标DataNode
数据节点DataNode
  • 数据块存取
  • 心跳汇报:数据块列表发给NameNode
  • 副本复制:Pipeline IO;补全副本

关键设计

分布式存储

  • 容错能力:处理异常场景
  • 一致性模型(重点):保障多个副本内容是一致的
  • 可扩展性:横向扩张scale-out能力
  • 节点体系:主从模式、对等模式;高可用
  • 数据放置:多个节点、多个副本;数据存放策略
  • 单机存储引擎:高效存取硬盘数据(DataNode)
NameNode目录树维护

fsimage

  • 完整地放在内存中
  • 定时存放在硬盘上
  • 修改只会修改内存中的目录树

EditLog(记录账本)

实时写到硬盘上

  • 目录树的修改日志
  • client更新目录树需要持久化EditLog后才能表示更新成功
  • NameNode高可用关键点之一:实现EditLog共享
  • EditLog可存放在专用系统或本地文件系统
NameNode数据放置

以数据块为单位

数据块信息维护

  • NameNode不会持久化数据块位置信息
  • NameNode根据DataNode汇报的信息动态维护位置信息
  • 维护每个数据块所在的节点信息

数据放置策略

  • 新数据存放到哪些节点
  • 数据均衡需要怎么合理搬迁数据
  • 3个副本怎么合理放置
DataNode

数据本身内容、元数据(校验码等)

数据块的硬盘存放

  • 文件在NameNode已分割成block
  • DataNode以block为单位对数据进行存取

启动扫盘

  • DataNode需要知道本机存放了哪些数据块
  • 启动时把本机硬盘上的数据块列表加载到内存中
HDFS写异常处理:Lease Recovery

租约:Client需要修改文件时,需要通过NameNode上锁,这个锁就是租约(Lease)

client写入时故障,可能产生的问题及解决

  • 副本不一致:比较三个副本的内容大小,选最小的作为最终版本,作为最终写入结果
  • Lease无法释放:十分钟超时时间,超时就判断进程挂了,将租约释放
HDFS写异常处理:Pipeline Recovery

写入过程中,DataNode出现异常挂掉

出现时机

  • 创建连接时:重新选一个
  • 数据传输时:Pipeline重新构建,把坏的节点摘除
  • complete时:重新构建,选节点
Client读异常处理

读取文件过程中,DataNode出现异常

解决:节点Failover

旁路系统

旁路系统:异步性,异步解决问题

  • Balancer:均衡DataNode的容量
  • Mover:确保副本放置符合策略要求

应用场景

ETL:Extract,Transform,Load;解决写问题

多数据源如MySQL、MongoDB等,都会存放有价值的数据,通过ETL把有价值的数据放到数据仓库

OLAP查询引擎

HBase

机器学习:TensorFlow、PyTorch对HDFS支持