这是我参与「第四届青训营 」笔记创作活动的第8天
- High Availability: 高可用
- Throughput: 吞吐量
- Scale Out: 水平扩展
- Scale Up:纵向扩展
- Fault-Tolerance: 容错
- Erasure Coding/EC: 纠删码
HDFS架构原理
NameNode
我们客户端需要读一个文件的信息时,必须知道我们这个文件被分成了多少个block,各个block又分别存储在哪个服务器上,这种用于描述文件的信息被称为文件的元数据信息(metaData),而metaData就是存储在NameNode的内存中的。
什么说HDFS适合存储大文件而不适合存储小文件?
metaData的大小:文件,block,目录占用大概150byte字节的元数据,可想而知存储一个大文件就只有一份150byte的元数据,存储N多个小文件就会伴随存在N份150Byte字节的元数据文件,这就非常地不划算
元数据信息以命名空间镜像文件(以下称为fsimage)和编辑日志(以下称为edits log)的方式保存,两者的作用分别是
fsimage:元数据镜像文件,保存了文件系统目录树信息以及文件和块的对应关系
edits log:日志文件,保存了文件的更改记录
-
NameNode目录树设计,重点理解EditLog的设计,可类比关系型数据库中的Transaction Log概念。
- 仅在内存中修改:fsimage
- 需要立即保存到硬盘:EditLog
block
HDFS3.x上的文件会按照128M为单位切分成一个个的block,分散存储在集群的不同的数据节点datanode上,需要注意的是,这个操作是HDFS自动完成的。一个文件被分成了几块存储在不同的datanode上,万一其中的一个datanode挂掉,那岂不是这个文件就找不回来了吗,所以hadoop还对我们的每一个数据块做了一个副本,保证数据的可靠性
HDFS关键设计
心跳机制
1.NameNode全权管理数据块的复制,它周期性从集群中的每个DataNode接收心跳信号和块状态报告(blockReport),接收到心跳信号意味着该DataNode节点工作正常,块状态报告包含了该DataNode上所有数据块的列表
2.DataNode启动时向NameNode注册,通过后周期性地向NameNode上报blockReport,每3秒向NameNode发送一次心跳,NameNode返回对该DataNode的指令,如将数据块复制到另一台机器,或删除某个数据块等···而当某一个DataNode超过10min还没向NameNode发送心跳,此时NameNode就会判定该DataNode不可用,此时客户端的读写操作就不会再传达到该DataNode上
3.hadoop集群刚开始启动时会进入安全模式(99.99%),就用到了心跳机制,其实就是在集群刚启动的时候,每一个DataNode都会向NameNode发送blockReport,NameNode会统计它们上报的总block数,除以一开始知道的总个数total,当 block/total < 99.99% 时,会触发安全模式,安全模式下客户端就没法向HDFS写数据,只能进行读数据。
负载均衡
HDFS应用场景
-
大数据技术中的应用
-
HDFS在大数据技术体系中的角色
-
演示:PySpark读取分析HDFS上的文件
- 数据如何产生
- 数据如何读取
- 数据如何保存
-
ETL:数据如何产生、传输
-
OLAP:如何高效地读取分析数据
-
-
存储底座
- HBase
- 机器学习
- 通用场景