Hadoop 系列--HDFS

673 阅读5分钟
  • HDFS 是一个分布式文件系统。
  • HDFS具有高度的容错能力,旨在部署在低成本硬件上。
  • HDFS提供对应用程序数据的高吞吐量访问,并且适用于具有大数据集的应用程序

1 架构设计

** 架构说明**

  • HDFS 是一个主从(Master/Slaves)架构
  • 集群由一个 NameNode 和 多个 DataNode 组成
  • NameNode 负责存储和管理文件的元数据,维护层次型的文件目录树
  • DataNode 负责存储文件数据(Block),并提供 Block 的读写
  • DataNode 定时向 NameNode 发送心跳和 BlockReport
  • Client 和 NameNode 交互文件元数据;和 DataNode 交互文件 Block 数据

2 角色功能

** NameNode**

  • 完全基于内存存储文件元数据、目录结构、文件Block的映射
  • 提供持久化方案保证数据可靠性(快照+日志)
  • 提供副本放置策略

** DataNode**

  • 基于本地磁盘存储 Block(文件形式)
  • 保存 Block 的校验,保证Block的可靠性
  • 与 NameNode 保持心跳,汇报Block 列表的可靠性

2.1 NamNode 数据持久化

HDFS 提供元数据持久化

最近时点的 FsImage + 增量的 EditsLog

  • Editslog:日志

体积小,记录少,必然有优势

  • FsImage:镜像,快照

如果能更快的滚动的更新时点
如何实现滚动更新:SecondaryNameNode

** 数据持久化的方式 **

  • 日志文件

记录实时发生的增删改查操作 mkdir /abc,完整性比较好
加载恢复数据:慢/占空间

  • 快照,镜像,dump,db

间隔(小时,天,分种,秒钟),内存全量数据基于某一个时间点做的像的磁盘溢出
恢复速度快过日志文件
因为是间隔的,容易丢失一部分数据

2.2 安全模式

** NameNode 初始格式化**

  • HDFS 搭建时会格式化,产生一个空的FsImage
  • NameNode 启动时,从硬盘中读取 EditLog + FsImage
  • 将Editlog中的事务追加到在内存中的FsImage上
  • 将内存中FsImage保存到磁盘,删除旧的EditLog

** NameNode 启动进入安全模式**

  • 安全模式下的NameNode不进行数据块的复制
  • NameNode 接受所有DataNode的心跳信号和BlockReport
  • Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的
  • 当一定百分比的数据块被Namenode检测确认是安全之后,(加上一个额外的30秒等待时间),Namenode将退出安全模式状态
  • 接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上

2.3 SecondaryNameNode (SNN)

  • 非 HA 模式下工作,SNN一般是独立的节点,周期完成对NameNode的EditLog向FsImage合并,减少EditLog大小,减少NameNode启动时间
  • 时间间隔设置 fs.checkpoint.period 默认3600秒
  • EditLog文件最大值设置:fs.checkpoint.size 默认64MB

2.4 Block 副本放置策略

  • 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
  • 第二个副本:放置在于第一个副本不同的 机架的节点上。
  • 第三个副本:与第二个副本相同机架的节点
  • 更多副本:随机节点

3 读写流程

3.1 HDFS 写流程

  1. Client 和 NameNode 连接创建文件元数据
  2. NameNode 判断元素据是否有效,触发副本放置策略,返回一个有序DataNode列表
  3. Client和DataNode建立Pipeline连接
  4. 数据写入

Client将块切分成packet(64KB),并使用chunk(512B)+chucksum(4B)填充
Client将packet放入发送队列中,并向第一个DataNode发送

类比工厂的流水线 -> 流式其实也是变种的并行计算

第一个DN收到packet后本地保存并发送给第二个DN
第二个DN收到packet后本地保存并发送给第三个DN
这一个过程中,上游节点同时发送下一个packet

  1. 当block传输完成,DateNode们各自向NameNode汇报,同时client继续传输下一个block

client的传输和block的汇报也是并行的

3.2 HDFS 写流程

  1. HDFS会尽量让读取程序读取离它最近的副本,降低整体的带宽消耗和读取延时
  2. 若在读取程序的同一个机架上有一个副本,那么就读取该副本
  3. 若一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本
  4. 下载一个文件 -> 获取文件的所有的block元数据

Client和NameNode交互文件元数据获取fileBlockLocation
NameNode会按距离策略排序返回
Client尝试下载block并校验数据完整性
Hdfs支持client给出文件的offset自定义连接哪些block的DataNode,自定义获取数据

这个是支持计算层的分治、并行计算的核心

4 HDFS-HA 解决方案

  • NameNode:多台NN主备模式,Active和Standby状态,Active对外提供服务
  • JouralNode:(>3台) 负责同步NN的editlog -> 最终一致性
  • ZKFC:通过zk集群协调NN的主从选举和切换 -> 事件回调机制
  • DN同时向NNs汇报BlockReport

注意 上述存在 NN的压力过大,内存受限问题

** HDFS-Federation 解决方案**

  • 元数据分治,复用DN存储
  • 元数据访问隔离性
  • DN目录隔离block