- HDFS 是一个分布式文件系统。
- HDFS具有高度的容错能力,旨在部署在低成本硬件上。
- HDFS提供对应用程序数据的高吞吐量访问,并且适用于具有大数据集的应用程序
1 架构设计
** 架构说明**
- HDFS 是一个主从(Master/Slaves)架构
- 集群由一个 NameNode 和 多个 DataNode 组成
- NameNode 负责存储和管理文件的元数据,维护层次型的文件目录树
- DataNode 负责存储文件数据(Block),并提供 Block 的读写
- DataNode 定时向 NameNode 发送心跳和 BlockReport
- Client 和 NameNode 交互文件元数据;和 DataNode 交互文件 Block 数据
2 角色功能
** NameNode**
- 完全基于内存存储文件元数据、目录结构、文件Block的映射
- 提供持久化方案保证数据可靠性(快照+日志)
- 提供副本放置策略
** DataNode**
- 基于本地磁盘存储 Block(文件形式)
- 保存 Block 的校验,保证Block的可靠性
- 与 NameNode 保持心跳,汇报Block 列表的可靠性
2.1 NamNode 数据持久化
HDFS 提供元数据持久化
最近时点的 FsImage + 增量的 EditsLog
- Editslog:日志
体积小,记录少,必然有优势
- FsImage:镜像,快照
如果能更快的滚动的更新时点
如何实现滚动更新:SecondaryNameNode
** 数据持久化的方式 **
- 日志文件
记录实时发生的增删改查操作 mkdir /abc,完整性比较好
加载恢复数据:慢/占空间
- 快照,镜像,dump,db
间隔(小时,天,分种,秒钟),内存全量数据基于某一个时间点做的像的磁盘溢出
恢复速度快过日志文件
因为是间隔的,容易丢失一部分数据
2.2 安全模式
** NameNode 初始格式化**
- HDFS 搭建时会格式化,产生一个空的FsImage
- NameNode 启动时,从硬盘中读取 EditLog + FsImage
- 将Editlog中的事务追加到在内存中的FsImage上
- 将内存中FsImage保存到磁盘,删除旧的EditLog
** NameNode 启动进入安全模式**
- 安全模式下的NameNode不进行数据块的复制
- NameNode 接受所有DataNode的心跳信号和BlockReport
- Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的
- 当一定百分比的数据块被Namenode检测确认是安全之后,(加上一个额外的30秒等待时间),Namenode将退出安全模式状态
- 接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上
2.3 SecondaryNameNode (SNN)
- 非 HA 模式下工作,SNN一般是独立的节点,周期完成对NameNode的EditLog向FsImage合并,减少EditLog大小,减少NameNode启动时间
- 时间间隔设置 fs.checkpoint.period 默认3600秒
- EditLog文件最大值设置:fs.checkpoint.size 默认64MB
2.4 Block 副本放置策略
- 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点
- 第二个副本:放置在于第一个副本不同的 机架的节点上。
- 第三个副本:与第二个副本相同机架的节点
- 更多副本:随机节点
3 读写流程
3.1 HDFS 写流程
- Client 和 NameNode 连接创建文件元数据
- NameNode 判断元素据是否有效,触发副本放置策略,返回一个有序DataNode列表
- Client和DataNode建立Pipeline连接
- 数据写入
Client将块切分成packet(64KB),并使用chunk(512B)+chucksum(4B)填充
Client将packet放入发送队列中,并向第一个DataNode发送类比工厂的流水线 -> 流式其实也是变种的并行计算
第一个DN收到packet后本地保存并发送给第二个DN
第二个DN收到packet后本地保存并发送给第三个DN
这一个过程中,上游节点同时发送下一个packet
- 当block传输完成,DateNode们各自向NameNode汇报,同时client继续传输下一个block
client的传输和block的汇报也是并行的
3.2 HDFS 写流程
- HDFS会尽量让读取程序读取离它最近的副本,降低整体的带宽消耗和读取延时
- 若在读取程序的同一个机架上有一个副本,那么就读取该副本
- 若一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本
- 下载一个文件 -> 获取文件的所有的block元数据
Client和NameNode交互文件元数据获取fileBlockLocation
NameNode会按距离策略排序返回
Client尝试下载block并校验数据完整性
Hdfs支持client给出文件的offset自定义连接哪些block的DataNode,自定义获取数据
这个是支持计算层的分治、并行计算的核心
4 HDFS-HA 解决方案
- NameNode:多台NN主备模式,Active和Standby状态,Active对外提供服务
- JouralNode:(>3台) 负责同步NN的editlog -> 最终一致性
- ZKFC:通过zk集群协调NN的主从选举和切换 -> 事件回调机制
- DN同时向NNs汇报BlockReport
注意 上述存在 NN的压力过大,内存受限问题
** HDFS-Federation 解决方案**
- 元数据分治,复用DN存储
- 元数据访问隔离性
- DN目录隔离block