一、HDFS介绍
介绍
Hadoop Distributed Filesystem 分布式文件系统,主要是用于存储数据。
特点
适用于分布式存储和处理
hadoop提供的命令接口与HDFS交互
namenode 和 datanode 节点帮助用户轻松的检查和管理集群状态
流式访问文件系统数据
提供文件的权限和验证
组成
NameNode:名称节点,访问HDFS的唯一入口。主要负责维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限控制等。元文件包括 Fsimage内存元数据镜像、Edits操作日志。
Secondary NameNode:NameNode 的一个工具,在1.x用于做NameNode的备节点,2.x以后由JN替代,主要是帮助NameNode管理元数据信息,定期合并Fsimage、Edits文件推送给NameNode。
DataNode:存储实际的数据,执行客户端的请求,同时定期通过心跳信息向NameNode 汇报自己负责的块列表信息。
Block:Hdfs上操作的最小单元,默认128M。
二、HDFS原理
核心数据结构
Fsimage 元数据镜像:负责维护文件结构和文件元数据的镜像,作为文件系统元数据的永久检查点。
EditLog 操作日志: 记录对文件的操作,客户端所有写操作会先被记录到该文件,用于后续文件系统恢复。
NameNode HA
![](https://i-blog.csdnimg.cn/blog_migrate/51394358724fd7a28dff8c87b0f98915.png)
核心组件
ZKFC: ZKFailoverControler 独立的进程,对NameNode的主备切换进行总体控制。及时检测NN健康状态,主NN故障时借助ZK实现自动的主备选举和切换。
HealthMonitor:负责检测NN的健康状态,检测到NN状态变化,会回调相应的方法进行主备选举。
ActiveStandbyElector:负责完成自动的主备选举,内部封装ZK的处理逻辑,一旦选举完成,会调用对应的方法进行NN主备切换。
三、HDFS相关流程
NameNode 和 Secondary NameNode
该过程在1.x版本使用,这里主要了解工作方式
第一阶段 NN 启动
1.1 如果是第一次启动NN格式化,创建Fsimage 和 Edits文件。如果不是则先滚动Edits并生成一个空的edits.inprogress, 然后加载Fsimage 和 Edits到内存中,保证内存中的元数据为最新。
1.2 客户端对元数据进行增删改操作
1.3 NN记录日志操作,更新编辑日志
1.4 NN在内存中对元数据进行增删改操作
第二阶段 2NN工作
1.5 2NN询问NN是否需要CheckPoint,并带回响应结果
1.6 2NN请求执行CheckPoint
1.7 NN滚动正常写的edits日志
1.8 将滚动前的edits文件 和 fsimage文件拷贝到2NN
1.9 2NN加载edits 、fsimage 文件到内存中,合并
1.10 生成新的fsimage.chkpoint, 并拷贝到NN
1.11 NN将fsimage.chkpoint 重命名fsimage
读流程
2.1 客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法。
2.2 分布式对象通过open()方法,使用RPC调用NN, 确定文件中前几块的位置(分批次读取)。
2.3 分布式对象将FSDataInputStream输入流对象返回到客户端供其读取数据。
2.4 客户端在输入流对象调用read()方法,输入流对象连接第一个块的DN,获取数据。
2.5 重复连接、读取,直到完成读取,关闭文件输入流。
写流程
3.1 客户端创建对象实例DistributedFileSystem, 调用该对象的create()方法。
3.2 分布式对象通过create()方法,使用RPC调用NN创建文件。NN执行检查,包括目标文件以及父目录是否存在,客户端是否有操作权限等。检查完成后,NN会记下本次操作记录,返回FSDataOutputStream输出流对象给客户端用于写数据。
3.3 客户端将数据分割(默认128M),输出流对象会将数据再次分割64K的数据包,写入到内部队列。数据流对象读取内部队列,请求NN返回DN队列。
3.4 数据流对象将数据包流式传输给第一个DN, 该DN存储完数据后将数据发送给第二个DN,后者保存后复制给第三个DN。
3.5 数据流对象同时维护一个内部的写确认队列 (ack queue)。接收管道节点的确认信息,收到确认信息后将数据包从队列中删除。如果写失败,数据流管道会关闭,ack queue中的packets 会被添加到数据队列的前面,确保数据包不会丢失。接着正常写入到数据的DN节点,已保存好的块的ID版本会升级,最后剩下的数据会写入到数据流管道的其他2个节点中。
3.6 客户端写完数据后,在输入流对象上调用close()方法。
3.7 DFS联系NN,告知写入完成,等待NN确认,NN 等待最小复制块返回成功(dfs.namenode.replication.min配置)。
NameNode HA切换流程
4.1 HealthMonitor初始化完成后,会启动内部的线程定时调用对应的NN的HAServiceProtocol RPC接口的方法,对NN检测。
4.2 如果检测到NN状态发生变化,调用ZKFC注册的相应方法处理。
4.3 如果ZKFC判断需要进行主备切换,会首先是要ActiveStandbyElector进行主动的主备选举。
4.4 主备选举完成后,回到ZKFC相应的方法通知当前的NN成为主或备。
4.5 ZKFC调用对应的NN的HAServiceProtocol RPC的方法将NN转换成Active 或 Standby状态。