这是我参与「第四届青训营」笔记创作活动的第7天,学习内容为《HDFS原理与应用》,内容包括 HDFS基本介绍、HDFS架构原理、HDFS关键设计、HDFS应用场景。
本节课重点为 HDFS关键设计和HDFS应用场景。思维导图如下:
HDFS基本介绍
- Hadoop技术体系:存储层(HDFS)->调度层(YARN)->应用层(MapReduce、Spark)
- 分布式系统:
特点:
- 大容量:更多的机器,更多的存储介质;
- 高可靠:多个副本提高容错能力;
- 低成本:不需要高端硬件来扩容;
类型:
- 对象存储
- 文件系统
- 块存储
- 数据库
- HDFS功能特性:
- 分布式;
- 容错:自动处理,规避多种错误场景;
- 高可用:副本机制;
- 高吞吐:并发;
- 可扩展:支持联邦集群模式;
- 廉价:通用硬件。
HDFS架构原理
Client/SDK
- Client写流程
- Client读流程
NameNode
- 中枢节点,数量少
- 功能:
- 维护目录树:目录树的增删查改,保证所有修改都能持久化;
- 维护文件和数据块的关系:文件被分成多个块,文件以数据块为单位多副本存放;
- 维护文件块存放节点信息:维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表;
- 分配新文件存放节点:Client创建新文件时,需要有NameNode来确定分配目标DataNode。
DataNode
- 存放数据,数量多;
- 功能:
- 数据块存储;
- 心跳汇报:和NameNode联系,发送本机数据块列表;
- 副本复制:机器故障时补全副本。
HDFS关键设计
分布式存储系统基本概念
- 容错能力
- 一致性模型:保证容错,数据要多副本存放,保证多个数据副本内容都是一致的;
- 可扩展性:加节点;
- 节点体系:主从模式/对等模型,必须保证高可用;
- 数据放置:NameNode决定数据放在哪些节点;
- 单机存储引擎:数据需要落盘持久化,根据系统特点如何高效存取硬盘数据。
NameNode
- 目录树:
- 结构:
DataNode
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应用场景
课程总结: HDFS是大数据存储底座,是分布式存储系统的代表。本节课主要学习HDFS的总体架构和关键设计,从原理上了解HDFS,同时了解它的多方面应用。通过对HDFS的学习进一步理解分布式系统,为以后设计和优化分布式系统提供部分理论依据。