这是我参与「第四届青训营」笔记创作活动的第2天,笔记内容为《总结回顾HDFS原理与应用》,内容包括 HDFS基本介绍、架构原理、关键设计、应用场景。
HDFS基本介绍
Hadoop技术体系:
- 存储层:HDFS
- 调度层:YARN
- 计算框架(存储层):MapReduce。值得注意的是另外一个同属于Apache基金会的开源计算框架Apache Spark,当前业界的使用已经远超于MapReduce,尽管它不属于Hadoop项目,但是和Hadoop也有紧密关系。
- 文件系统: 单机文件系统非常普遍,从Windows NTFS到Linux的Ext4等,分布式文件系统是单机文件的延伸,概念术语是相通的,比如目录、文件、目录树等。
- 单机文件系统: 常见的如Windows NTFS,Linux的Ext4,虽然不同的操作系统和实现,但是本质都是一样的,解决相同的问题。
- 分布式文件系统: 本质上扩展、延伸了单机文件系统,提供了大容量、高可靠、低成本等功能特性;实现上一般也更为复杂。其中:
- 大容量:更多的机器,更多的存储介质;
- 高可靠:多个副本提高容错能力;
- 低成本:不需要高端硬件来扩容;
- 分布式存储系统本质是针对不同的使用场景提供高效合理的系统,其类型分别为:
- 对象存储:例如AWS的S3,阿里云的OSS,开源的Minio。
- 块存储:例如AWS的EBS,开源社区也有Ceph等。
- 文件系统:HDFS、GlusterFS、CubeFS等
- 数据库:KV数据库比如Cassandra,关系型数据库如TiDB、OceanBase等
- HDFS功能特性如下: (HDFS尽管是一个文件系统,但是它没有完整实现POSIX文件系统规范。)
- 分布式;
- 容错:自动处理,规避多种错误场景;
- 高可用:副本机制;
- 高吞吐:并发;
- 可扩展:支持联邦集群模式;
- 廉价:通用硬件。
HDFS常用语句
开启环境: start-all.sh
关闭环境: stop-all.sh
上传文件: hdfs dfs -put 本地路径(或hadoop上路径)/完整文件名 hadoop上路径/
复制到HDFS上: hdfs dfs -copyFromLocal 本地路径/完整文件名 hadoop上路径/
拷贝到本地: hdfs dfs -copyFromLocal 本地路径/完整文件名 hadoop上路径/
复制到HDFS上: hdfs dfs -copyFromLocal 本地路径/完整文件名 hadoop上路径/
创建文件夹: hdfs dfs -mkdir -p -cat hadoop上要创建的文件夹及目录
删除文件夹及文件夹下的内容: hdfs dfs -rm -r 路径
查看文件: hdfs dfs -cat hadoop上路径/文件名
查询前17行样本数据: hdfs dfs -ls t hadoop上路径/
将文件或目录复制到目标路径: hdfs dfs -cp 源路径 目标路径
架构原理
Client/SDK: 读写操作的发起点,HDFS很多读写逻辑都是在SDK中实现的。
Client写流程:
Client读流程:
NameNode 元数据节点: 元数据节点,是HDFS的中枢节点,也是服务的入口,但数量少。
其功能是:
- 维护目录树:目录树的增删查改,保证所有修改都能持久化;
- 维护文件和数据块的关系:文件被分成多个块,文件以数据块为单位多副本存放;
- 维护文件块存放节点信息:维护集群节点的拓扑结构和每个文件块所有副本所在的DataNode类表;
- 分配新文件存放节点:Client创建新文件时,需要有NameNode来确定分配目标DataNode。
DataNode: 数据节点,存放实际用户数据,数量多。
其功能是:
- 数据块存储;
- 心跳汇报: 和NameNode联系,发送本机数据块列表;
- 副本复制: 机器故障时补全副本。
关键设计
分布式存储系统基本概念
- 容错能力
- 一致性模型:保证容错,数据要多副本存放,保证多个数据副本内容都是一致的;
- 可扩展性:加节点;
- 节点体系:主从模式/对等模型,必须保证高可用;
- 数据放置:NameNode决定数据放在哪些节点;
- 单机存储引擎:数据需要落盘持久化,根据系统特点如何高效存取硬盘数据。 NameNode目录树设计
- 仅在内存中修改:fsimage
- 需要立即保存到硬盘:EditLog
NameNode数据放置: 数据分散在各个节点上,how to find them?
- 文件和数据块的映射关系
- 数据块的放置分布策略
DataNode设计:
- 数据块路径
- 启动扫盘获得本机文件块列表
HDFS写异常处理
Lease Recovery
- 租约lease:Client要修改一个文件时,需要通过NameNode上锁,这个锁就是租约;
- 情景:文件写了一半,client自己挂掉了,可能产生的问题: 副本不一致、Lease无法释放;
- 副本不一致:比较系统三个副本内容大小(长度),选择最小的作为最终版本更新,最终的写入结果;
- Lease无法释放:客户端定期续租,如果超过设定时间,踢掉挂掉的client。
Pipeline Recovery
- 情景:文件写入过程中,DataNode侧出现异常挂掉了;
- 异常出现的时机:创建连接时、数据传输时、complete阶段(DN完成落盘后向上(NameNode)报新块);
- 创建连接:重新选一个节点;
- 数据传输:如果有一个节点挂了,pipeline到重新构建阶段,将坏的节点摘除;
- complete阶段:pipeline重新构建,重新选节点。
HDFS读异常处理
Failover
- Client读异常处理;
- 情景:读取文件的过程,DataNode侧出现异常挂掉了;
- 增强情景:节点半死不过,读取很慢--------------->节点切换;
- 检测出快/慢,客户端网络问题导致的慢(客户端不断切换节点)。
旁路系统
Balancer: 均衡DataNode的容量
Mover: 确保副本放置复合策略要求
控制面建设:保障系统稳定运行
可观测性设施:快速发现定位问题
- 指标埋点
- 数据采集
- 访问日志
- 数据分析
运维体系建设:从最基本的命令行手工操作,脚本自动化再到完善的运维平台
- 运维操作需要平台化;
- NameNode操作更复杂;
- DataNode机器规模庞大;
- 组件控制面API
应用场景
HDFS在大数据技术体系中的角色
ETL
OLAP
存储底座
HBase
机器学习
通用存储应用
课程总结: HDFS是分布式存储系统的经典代表。本节课主要了解了HDFS的基本概念,关键设计,大数据应用场景以及通用存储场景。通过这节课的学习使我进一步理解和巩固了HDFS分布式系统基础知识,为以后设计优化和学习更高端的分布式系统打下了坚实的基础。