这是我参与「第四届青训营」笔记创作活动的第1天,学习内容为《HDFS原理与应用》,内容包括 HDFS基本介绍、HDFS架构原理、HDFS关键设计、HDFS应用场景。
HDFS基本介绍
1.0 Hadoop技术体系:存储层(HDFS)->调度层(YARN)->应用层(MapReduce、Spark)
1.1WinDows
1.2Linux单机文件系统
1.4分布式文件系统
额外好处:大容量 高可靠 低成本
- HDFS功能特性:
- 分布式;
- 容错:自动处理,规避多种错误场景;
- 高可用:副本机制;
- 高吞吐:并发;
- 可扩展:支持联邦集群模式;
- 廉价:通用硬件。
HDFS架构原理
CLIENT/SDK
1. Client写流程
Client读流程
元数据节点 NameNode
1.维护目录树 维护目录树的增删改查操作,保证所有修改都能持久化,以便机器掉电不会造成数据丢失或不一致。
2.维护文件和数据块的关系 文件被切分成多个块,文件以数据块为单位。进行多副本存放
3.维护文件块存放节点信息 通过接收DataNode的心跳汇报信息,维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表。
4.分配新文件存放节点 Client创建新的文件时候,需要有NameNode来确定分配目标DataNode
NameNode
中枢节点,数量少
- 功能:
- 维护目录树:目录树的增删查改,保证所有修改都能持久化;
- 维护文件和数据块的关系:文件被分成多个块,文件以数据块为单位多副本存放;
- 维护文件块存放节点信息:维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表;
- 分配新文件存放节点:Client创建新文件时,需要有NameNode来确定分配目标DataNode。
DataNode
- 存放数据,数量多;
- 功能:
- 数据块存储;
- 心跳汇报:和NameNode联系,发送本机数据块列表;
- 副本复制:机器故障时补全副本。
HDFS关键设计
分布式存储系统基本概念
- 容错能力
- 一致性模型:保证容错,数据要多副本存放,保证多个数据副本内容都是一致的;
- 可扩展性:加节点;
- 节点体系:主从模式/对等模型,必须保证高可用;
- 数据放置:NameNode决定数据放在哪些节点;
- 单机存储引擎:数据需要落盘持久化,根据系统特点如何高效存取硬盘数据。
目标树
结构
数据块放置策略
多副本放在不同的位置
HDFS读写异常处理
HDSF写异常处理
Lease Recovery
- 情景:文件写了一半,client自己挂掉了,可能产生的问题: 副本不一致、Lease无法释放;
- 租约lease:Client要修改一个文件时,需要通过NameNode上锁,这个锁就是租约;
- 副本不一致:比较系统三个副本内容大小(长度),选择最小的作为最终版本更新,最终的写入结果;
- Lease无法释放:客户端定期续租,如果超过设定时间,踢掉挂掉的client。
Pipeline Recovery
- 情景:文件写入过程中,DataNode侧出现异常挂掉了;
- 异常出现的时机:创建连接时、数据传输时、complete阶段(DN完成落盘后向上(NameNode)报新块);
- 创建连接:重新选一个节点;
- 数据传输:如果有一个节点挂了,pipeline到重新构建阶段,将坏的节点摘除;
- complete阶段:pipeline重新构建,重新选节点。
HDFS读异常处理
- Client读异常处理;
- 情景:读取文件的过程,DataNode侧出现异常挂掉了;
- 解决办法:节点Failover;
- 增强情景:节点半死不过,读取很慢--------------->节点切换;
- 检测出快/慢,客户端网络问题导致的慢(客户端不断切换节点)。
旁路系统与控制面建设
旁路系统
- 异步解决问题,这些问题不是马上出现,而是不断积累恶化,影响系统运行;简化了系统的实现;
- Balancer:均衡DataNode的容量;
- Mover:确保副本放置符合策略要求,NameNode选择块放在哪里,分布在不同DataNode,且在两个不同的机架上;
- 这些组件不运行不会马上影响读写操作,但是长时间会积累系统性问题,例如读写不均衡导致IO热点等。
控制面建设
- 保障系统稳定性;
- 可观测性设施:快速发现定位问题
- 指标埋点
- 数据采集
- 访问日志
- 数据分析
- 运维体系建设:从最基本的命令行手工操作,脚本自动化再到完善的运维平台
- 运维操作需要平台化;
- NameNode操作更复杂;
- DataNode机器规模庞大;
- 组件控制面API
应用场景
使用HDFS的公司
大数据生态
PYSPARK
ETL
OLAP查询引擎
Hbase
机器学习
通用存储应用