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

92 阅读5分钟

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

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

课程回顾

计算框架:Flink、Spark

查询引擎:Presto

一、本课堂重点内容

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

二、详细知识点介绍

01.HDFS 基本介绍

HDFS:Hadoop Distributed File System

Linux 目前支持将近100种文件系统。

1.3 分布式文件系统

  • 大容量

更多的机器,更多的存储介质

  • 高可靠

多个副本提高容错能力

  • 低成本

不需要高端硬件来扩容

1.5 HDFS 功能特性

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

02.架构原理

2.2 Client 写流程

68.JPG

2.3 Client 读流程

69.JPG

图源:教学PPT

2.4 元数据节点 NameNode

  • 维护目录树

维护目录树的增删改查操作,保证所有修改都能持久化,以便机器掉电不会造成数据丢失或不一致。

  • 维护文件和数据块的关系

文件被切分成多个块,文件以数据块为单位进行多副本存放.

  • 维护文件块存放节点信息

通过接收 DataNode 的心跳汇报信息,维护集群节点的拓扑结构和每个文件块所有副本所在的 DataNode 类表。

  • 分配新文件存放节点

Client 创建新的文件时候,需要有 NameNode 来确定分配目标 DataNode.

2.5 数据节点 DataNode

  • 数据块存取

DataNode 需要高效实现对数据块在硬盘上的存取。

  • 心跳汇报

存放在本机的数据块列表发送给 NameNode,以便 NameNode 能维护数据块的位置信息,同时让 NameNode 确定该节点处于正常存活状态

  • 副本复制
  1. 数据写入时 Pipeline IO操作
  2. 机器故障时补全副本

03.关键设计

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

  1. 容错能力

能够处理绝大部分异常场景,例如服务器岩机、网络异常、磁盘故障、网络超时等。

  1. 一致性模型

为了实现容错,数据必须多副本存放,一致性要解决的问题是如何保障这多个副本的内容都是一致的。

  1. 可扩展性

分布式存储系统需要具备横向扩张 scale-out 的能力。

  1. 节点体系

常见的有主从模式、对等模式等,不管哪模式,高可用是必须的功能。

  1. 数据放置

系统是由多个节点组成,数据是多个副本存放时,需要考虑数据存放的策略。

  1. 单机存储引

在绝大部分存储系统中,数据都是需要落盘持久化,单机引擎需要解决的是根据系统特点,如何高效得存取硬盘数据。

3.1 NameNode 目录树维护

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

3.2 NameNode 数据放置

数据块信息维护

  • 目录树保存每个文件的块id
  • NameNode 维护了每个数据块所在的节点信息
  • NameNode 根据 DataNode 汇报的信息动态维护位置信息
  • NameNode 不会持久化数据块位置信息

数据放置策略

  • 新建数据放到哪些节点
  • 数据均衡怎么合理搬迁数据
  • 2个副本怎么合理放置

3.3 DataNode

数据块的硬盘存放

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

启动扫盘

  • DataNode 需要知道本机存放了哪些数据块
  • 启动时把本机硬盘上的数据块列表加载在内存中

3.4 HDFS 写异常处理

—— Lease Recovery

情景: 文件写了一半,client 自己挂掉了。

可能产生的问题:副本不一致;Lease 无法释放。

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

解决方法: Lease Recovery

—— Pipeline Recovery

情景: 文件写入过程中,DataNode 侧出现异常挂掉了。

异常出现的时机: 创建连接时;数据传输时;complete 阶段。

解决方法: Pipeline Recovery

3.5 Client 读异常处理

情景: 读取文件的过程,DataNode 侧出现异常挂掉了。

解决方法: 节点 Failover

增强情景: 节点半死不过,读取很慢

3.6 旁路系统

Balancer: 均衡 DataNode 的容量。

Mover: 确保副本放置符合策略要求。

3.7 控制面板建设

客观性设施: 指标埋点;数据采集;访问日志;数据分析。

运维体系建设: 运维操作需要平台化;NameNode 操作复杂;DataNode 机器规模庞大;组件控制面 API。

04.应用场景

4.3 PySpark 读写 HDFS 文件

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

PySpark 和 HDFS 交互演示

实验1

l.读取本地表格文件 /tmp/zipcodes.csv
2.执行 SELECT 操作
3.SELECT 结果保存 /tmp/zipcodes-lite 日录下

实验2

1.读取 HDFS 上的表格文件 /tmp/zipcodes.csv
2.执行 SELECT 操作
3.SELECT 结果保存到 HDFS 的 /tmp/zipcodes-lite目录下

4.6 Hbase

70.JPG

图源:教学PPT

三、课程总结

  • HDFS 架构
  • HDFS 关键设计
  • 大数据应用场景
  • 通用存储场景