这是我参与「第四届青训营 」笔记创作活动的第7天。
HDFS基本介绍
- HDFS(Hadoop Distributed File System):hadoop三大组件之一,除此之外还有Yarn(资源调度)和MapReduce(计算)。
- 分布式文件系统:大容量(扩容方便),高可靠(多副本容灾),低成本(硬件要求不高)。
- 分布式存储系统除了分布式文件系统外还有(分布式)对象存储、块存储、数据库。
- HDFS特性:分布式、高吞吐、容错、可扩展、高可用、廉价
HDFS架构介绍和组件用途
Client客户端
- 与NameNode交互(获取元数据)、与DataNode交互(读写数据)、提供终端命令管理HDFS等。
NameNode
- 管理HDFS的元数据、接收Client的读写请求、配置副本策略。
- NameNode工作机制
- NameNode 启动时,先滚动Edits 并生成一个空的edits.inprogress,然后加载Edits 和Fsimage到内存中,此时 NameNode 内存就持有最新的元数据信息。
- Client 开始对 NameNode 发送元数据的增删改的请求,这些请求的操作首先会被记录到 edits.inprogress 中(查询元数据的操作不会被记录在 Edits 中,因为查询操作不会更改元数据信息),如果此时 NameNode 挂掉,重启后会从 Edits 中读取元数据的信息。
- 然后,NameNode 会在内存中执行元数据的增删改的操作。
- 由于Edits 中记录的操作会越来越多,Edits 文件会越来越大,导致 NameNode 在启动加载Edits 时会很慢,所以需要对 Edits 和 Fsimage 进行合并(所谓合并,就是将 Edits 和 Fsimage 加载到内存中,照着 Edits 中的操作一步步执行,最终形成新的 Fsimage )。
- Fsimage:NameNode 内存中元数据序列化后形成的文件。
- Edits:记录客户端更新元数据信息的每一步操作(可通过 Edits 运算出元数据)。
DataNode
- 存储实际数据块,执行数据块的读写操作。
- 数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
- DataNode 启动后向 NameNode 注册,通过后,周期性(1 小时)的向 NameNode 上报所有的块信息。
- 心跳是每 3 秒一次,心跳返回结果带有 NameNode 给该DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个DataNode 的心跳,则认为该节点不可用。
- 集群运行中可以安全加入和退出DataNode节点。
关键设计
分布式存储系统基本原理
- 容错能力:部分节点挂了不影响系统运行。
- 一致性模型:多副本存放,且保证数据一致且及时,提高容错能力。
- 可扩展性:具有横向扩容的能力
- 节点体系:主从模式、对等模式等,提高系统的高可用性。
- 数据放置:根据namenode的数据存放决策决定数据及副本放在那里
- 单机存储引擎:根据系统特点,在持久化时提高IO速率。 HDFS各组件的重要设计
高可用
- 通过zookeeper管理启动多个namenode消除单点故障(同一时刻只有一个启动active,其余standby),防止NameNode节点突发状况以及应对机器升级。
- 改变元数据的管理方式:Edits日志只有Active状态的NameNode可写,全可读。
- 在NameNode节点上配置zookeeper监控,利用zk监控NameNode状态及时切换。