Hadoop | HDFS 学习笔记(三)HDFS 读写流程 | NN、2NN、DN 工作机制 | FsImage与Edits的合并

参考资料


运行环境


  • JDK8
  • Hadoop3.1.3

一、HDFS 体系结构


HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)
所有的HDFS通信协议都是构建在TCP/IP协议基础之上的
名称节点和数据节点之间则使用数据节点协议进行交互

在这里插入图片描述

二、HDFS 存储原理


2.1 冗余数据保存

HDFS采用多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分不到不同的DataNode节点。优点有:

  • 加快数据传输速度
  • 容易检查数据错误
  • 保证数据可靠性

2.2 数据存取策略

2.2.1 数据存放

第一个副本:放置在上传文件的数据节点,若是集群外提交,则随机挑选资源相对充足的节点
第二个副本:放置在与第一个副本不同的机架的节点上
第三个副本:防止在于第二个副本相同机架的其他节点上
更多副本:随机节点

2.2.2 数据读取

HDFS提供一个API可确定数据节点的机架ID,Client可以通过调用API查询。

Client读取HDFS数据时,从NN获得Block不同副本的存放位置列表,列表包含了副本所在的DN,然后可调用API确定Client和这些DN所属的机架ID

当发现某个Block副本的机架ID和Client对应的 机架ID相同时就优先选择该副本读取数据,若没有就随机选择一个副本。

2.3 数据错误与恢复

2.3.1 NN出错

NN存储了FsImageEditLog信息,若损坏则根据2NN中的FsImageEditlog数据进行恢复。

2.3.2 DN出错

  • 每个DN会定期向NN发送“心跳”信息,以汇报自身的状态
  • DN故障,会被标记为“宕机”,NN不会再发送I/O请求
  • NN会定期检查,防止出现Block的副本数小于冗余因子的情况,若发生就数据冗余复制,生成新副本。

HDFS与其他分布式文件系统最大区别就是:可调整冗余数据的位置。

2.3.3 数据出错

可能造成的原因: 网络传输问题 或 磁盘错误 等

Client读取数据后会采用 校验算法(crc、mdk5等)对文件进行校验,以确定读取到正确数据

Client 读取HDFS文件时,先读取信息文件,利用该文件对每个读取的Block进行校验

若出错,那么Client会请求到另一个DN读取该文件的Block,并且向NN报告该Block有错

NN会定期检查并重新复制这些 Block

三、HDFS 读写过程

通过HDFS Java API 的实现来理解HDFS读写流程,可参考文章 【Hadoop | HDFS 学习笔记(二)| HDFS Java API 环境搭建 | Java操作HDFS文件系统 | 多案例】

实现代码(uri为在HDFS需操作的文件路径):

Configuration conf = new Configuration();                          
conf.set("fs.defaultFS","hdfs://localhost:9000");                        
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = FileSystem.get(conf);
FSDataInputStream in = fs.open(new Path(uri));
FSDataOutputStream out = fs.create(new Path(uri));

首先了解这几个类的作用:

类名 描述
FileSystem 通用文件系统的抽象基类,可被分布式文件系统集成,支持Hadoop文件系统相关操作
DistrubutedFileSystem 是FileSystem在HDFS文件系统中的具体实现类
FSDataInputStream HDFS的输入流对象,用于获取HDFS文件的数据
FSDataOutputStream HDFS的输出流对象,用于将数据写入到HDFS文件

在3.x版本中,输入输出流对象的使用都封装到了 org.apache.hadoop.fs.FileUtil里,比如在执行CopyFromLocalFile方法时,笔者通过调试发现了底层调用的部分:

在这里插入图片描述
在这里插入图片描述
通过调试能更好的理解这个调用的流程,不过由于目前的知识面比较浅,暂时只能粗略调试。

3.1 读流程

过程与分析

在这里插入图片描述

主要分为4个步骤:

  1. Client 通过 DistributedFileSystemNN 请求读取/下载文件,NN通过查询元数组,找到Block所在的DN地址
    2.Client 挑选一台DN服务器(就近原则,然后随机),请求读取数据
  2. DN 开始 传输数据给 Client(从磁盘读取数据输入流,以Packet为单位做校验)
  3. ClientPacket 为单位接收,先在本地缓存,然后写入目标文件。

3.2 写流程

3.2.1 过程与分析在这里插入图片描述

主要分为9个步骤:

  1. Client 通过 DistributeFileSystem类向 NN 请求上传文件,NN检查文件是否已存在,父目录是否存在
  2. NN响应此次请求,返回是否可以上传
  3. ClientNN 请求上传第一个 Block
  4. NN 根据选择策略(本机架当前节点 > 其他机架节点 > 本机架其他节点 > 随机节点) ,返回3个存储文件副本的DN节点,DN1、DN2、DN3
  5. 获取到DN节点后,Client通过 FSDataOutputStream 类向DN1请求上传数据,DN1收到请求后会继续调用DN2、DN2又调用DN3,建立成一个通信管道。
  6. DN1、DN2、DN3 逐级应答客户端
  7. 建立通信管道后,Client 开始往 DN1 上传 第一个Block,先从磁盘读取数据放到一个本地内存进行缓存,以 Packet为单位,DN1收到后就传给DN2、DN2收到后就传给DN3DN1每传一个Packet就会放入一个应答队列等待应答
  8. 当一个Block 传输完成之后,Client 再次请求 NN上传到下个Block的服务器,重复执行3-8部分
  9. 最后传输完毕,Client将处理的信息提交给 NN

3.2.2 网络拓扑-节点NN与DN之间的距离计算

在HDFS写数据过程,NN会选择距离待上传数据最近距离的DN接收,这个节点距离等于两个节点到达最近的共同祖先的距离总和。尚硅谷机构提供的这张图为例:
在这里插入图片描述
集群分为d1、d2,机架又分为r1、r2、r3、r4、r5、r6,而集群节点都称为n1、n2、n3。可以把它们看成是多叉树里的一个节点。

3.2.3 机架感知(副本存储节点选择)

首先回顾 HDFS的写流程,首先,Client向NN申请上传文件,NN检查文件用户是否有权限、然后再检查是否存在,若符合就响应Client提示允许上传,接着Client请求上传第一个Block,此时NN就需要根据一个策略来选择元数据里的DN负责存储这个副本了,在API中是在 BlockPlacementPolicyDefault类的chooseTargetInOrder方法实现的。
对应包的 Maven 依赖

<dependency>
    <groupId>org.apache.hadoop</
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hadoop是一个分布式存储和计算系统。它由一组节点组成,每个节点都有存储和计算功能。 Hadoop中有两种节点:NameNode和DataNode。 NameNode是Hadoop的管理节点,负责维护文件系统的元数据,即文件名、块位置、块大小等信息。它还负责维护文件系统的命名空间,即文件目录结构。 DataNode是Hadoop的存储节点,负责存储文件的实际数据块。它接收来自NameNode的命令,将数据块入磁盘,并在需要时将数据块取出来。 Hadoop中还有一个组件:SecondaryNameNode。它的作用是定期从NameNode拉取元数据的副本,并与NameNode进行同步。如果NameNode出现故障,可以使用SecondaryNameNode上的元数据副本来恢复。 简而言之,NameNode负责文件系统的元数据管理和命名空间维护,DataNode负责存储文件的实际数据块,SecondaryNameNode负责与NameNode的元数据同步。 ### 回答2: Hadoop中的NameNode(NN)和SecondaryNameNode(2NN)是HDFS(分布式文件系统)的重要组件,它们都承担着维护文件系统元数据的责任,但在工作原理上有所不同。 NameNode是HDFS的主节点,它负责管理文件系统的命名空间和其它重要的元数据信息。当客户端请求执行某个文件操作时,首先会与NameNode通信,NameNode会返回相应的数据块所在的DataNode列表,然后客户端才能与对应的DataNode进行通信。NameNode还记录了文件的层次结构、文件块的位置、复本数量以及各个DataNode的健康状况等信息。NameNode将元数据信息存储在内存中,并定期将其持久化到本地磁盘以防止系统故障时的数据损失。因此,NameNode的工作可简单概括为处理元数据请求、维护文件系统结构、存储数据块位置信息。 SecondaryNameNode(或者称为CheckpointNode)并不是NameNode的替代物,仅用于辅助NameNode进行元数据的备份和合并。SecondaryNameNode根据预定的时间间隔或事务数目,从主节点中得到元数据的快照,并将其存储在本地文件系统上。这样就可以在主节点出现故障的情况下,通过使用SecondaryNameNode上的快照信息来恢复主节点。此外,SecondaryNameNode还负责合并NameNode的编辑日志,将内存中的元数据信息与编辑日志中存储的增量变更合并,减轻了NameNode的元数据负担。 综上所述,NameNode是Hadoop中负责管理文件系统元数据的主节点,而SecondaryNameNode则是辅助NameNode进行备份和合并工作的节点。它们的工作原理是相辅相成的,共同维护HDFS的可靠性和高可用性,在大规模数据存储和处理的分布式环境中起到了关键的作用。 ### 回答3: Hadoop中的NN(NameNode)和2NN(Secondary NameNode)是Hadoop分布式文件系统(HDFS)中的关键组件,它们共同协同工作来保障数据的高可用性和数据一致性。 NNHDFS的主节点,负责存储和管理文件系统的元数据信息,包括文件和目录的命名空间、块到数据节点的映射关系等。NN也负责处理客户端的文件操作请求,例如文件的、创建和删除等。NN将元数据以文件(fsimage)和编辑日志(edits)的形式存储在本地磁盘上。NN工作原理如下: 1. 当客户端发起文件入请求时,NN接收到请求后会先将文件的元数据记录到内存中,并返回给客户端一个文件入路径。 2. 当客户端结束文件入后,NN将文件划分为固定大小的数据块,并记录下每个数据块所在的数据节点信息。 3. 当客户端请求文件取时,NN根据文件元数据信息获取到数据块的位置,并返回给客户端所需的数据节点信息。 2NNNN的辅助节点,它主要用来定期合并NN的文件系统元数据和编辑日志,生成新的文件系统镜像(fsimage)和编辑日志快照(edits),以便在NN发生故障时进行故障恢复。2NN工作原理如下: 1. 2NN定期从NN获取文件系统的编辑日志,并将这些编辑日志合并到之前的镜像文件上,生成新的文件系统镜像和编辑日志快照。 2. 当NN发生故障时,2NN可以用其最新的文件系统镜像和编辑日志快照来帮助恢复NN,以保障文件系统的高可用性。 总结来说,NN负责管理HDFS的文件系统元数据信息和处理客户端的文件操作请求,2NN则负责定期合并NN的元数据信息和编辑日志,以备份和恢复NN的故障。通过NN和2NN的协同工作Hadoop能够提供高可用性的分布式文件存储和处理服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值