HDFS - 1 - 介绍

一、HDFS介绍

  1. 介绍

Hadoop Distributed Filesystem 分布式文件系统,主要是用于存储数据。

  1. 特点

适用于分布式存储和处理

hadoop提供的命令接口与HDFS交互

namenode 和 datanode 节点帮助用户轻松的检查和管理集群状态

流式访问文件系统数据

提供文件的权限和验证

  1. 组成

NameNode:名称节点,访问HDFS的唯一入口。主要负责维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限控制等。元文件包括 Fsimage内存元数据镜像、Edits操作日志。

Secondary NameNode:NameNode 的一个工具,在1.x用于做NameNode的备节点,2.x以后由JN替代,主要是帮助NameNode管理元数据信息,定期合并Fsimage、Edits文件推送给NameNode。

DataNode:存储实际的数据,执行客户端的请求,同时定期通过心跳信息向NameNode 汇报自己负责的块列表信息。

Block:Hdfs上操作的最小单元,默认128M。

二、HDFS原理

  1. 核心数据结构

Fsimage 元数据镜像:负责维护文件结构和文件元数据的镜像,作为文件系统元数据的永久检查点。

EditLog 操作日志: 记录对文件的操作,客户端所有写操作会先被记录到该文件,用于后续文件系统恢复。

  1. NameNode HA

核心组件

ZKFC: ZKFailoverControler 独立的进程,对NameNode的主备切换进行总体控制。及时检测NN健康状态,主NN故障时借助ZK实现自动的主备选举和切换。

HealthMonitor:负责检测NN的健康状态,检测到NN状态变化,会回调相应的方法进行主备选举。

ActiveStandbyElector:负责完成自动的主备选举,内部封装ZK的处理逻辑,一旦选举完成,会调用对应的方法进行NN主备切换。

三、HDFS相关流程

  1. 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

  1. 读流程

2.1 客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法。

2.2 分布式对象通过open()方法,使用RPC调用NN, 确定文件中前几块的位置(分批次读取)。

2.3 分布式对象将FSDataInputStream输入流对象返回到客户端供其读取数据。

2.4 客户端在输入流对象调用read()方法,输入流对象连接第一个块的DN,获取数据。

2.5 重复连接、读取,直到完成读取,关闭文件输入流。

  1. 写流程

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配置)。

  1. 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状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值