HDFS读写流程详细过程

HDFS读写流程详细过程

  • HDFS的定义
  • 一、组成架构
  • 二、优缺点
  • 三、读流程
  • 四、NameNode和SeconderyNameNode
  • 五、写流程

HDFS的定义

HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。

一、组成架构

  1. NameNode(NN) : 集群的Master,它是一个主管,管理者
    (1) 管理HDFS的命名空间
    (2) 配置副本策略
    (3) 管理数据块(Block)映射信息
    (4) 处理客户端读写请求
  2. DataNode(DN) : 集群的Slave。NN下达命令,DataNode执行实际操作。
    (1) 存储实际的数据块
    (2) 执行数据块的读/写操作
  3. Client : 客户端
    (1) 文件切分。文件上传HDFS的时候,client将文件切分成一个个的Block,然后进行上传
    (2) 与NameNode交互,获取文件的位置信息
    (3) 与DataNode交互,读取或写入数据
  4. SecondaryNameNode : 并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
    (1) 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode
    (2) 在紧急情况下可辅助恢复NameNode

二、优缺点

  1. 缺点
    在这里插入图片描述

HDFS中文件在物理上是分块存储的(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。

因为数据的分块存储,存储数据时有可能产生大量的小文件。
块设置的太小,会增加寻址时间,程序会一直在找块开始的位置。
块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需要的时间。导致程序处理这个数据块的时间变长。
因此HDFS块大小的设置主要取决于磁盘传输速率的大小。

  1. 优点
    在这里插入图片描述

1.在 HDFS 中,每个数据块都会被分成若干个数据块副本。默认情况下,每个数据块会被复制到HDFS 集群中的三个不同的 DataNode 上。

2.HDFS 会将数据块的多个副本分别存储在不同的 DataNode 上,以提高数据的可靠性和容错性。如果某个 DataNode 发生故障,数据块的其他副本仍然可以被访问。

3.HDFS 会尽量将数据块的多个副本存储在不同的机架上,以避免机架故障导致数据不可用的情况。在 HDFS 中,每个机架都有一个主节点和多个从节点。HDFS 会将数据块的多个副本存储在不同的机架的从节点上。

副本节点的选择
在这里插入图片描述

机架感知:
这样既能增加网络IO的效率,也能通过相邻机架提高数据稳定性。

三、读流程

在这里插入图片描述
1.客户端向 NameNode 发送读取请求,请求包括要读取的文件名和文件块的起始位置。

2.NameNode 根据请求的文件名,查询文件所对应的块列表,并返回给客户端块列表以及每个块所在的 DataNode 列表。

3.客户端根据返回的块列表和 DataNode 列表,选择一个 DataNode 开始读取数据。如果选择的 DataNode 不可用,则会选择另外一个 DataNode。

3.客户端向选择的 DataNode 发送读取请求,请求包括要读取的块的起始位置和长度。

4.DataNode 接收到读取请求后,从本地磁盘读取数据块,并将数据块返回给客户端。

5.如果 DataNode 上的数据块副本不足,则会从其他 DataNode 上获取数据块副本。

客户端接收到数据块后,将数据块缓存在本地内存中,并通过缓存来提高读取性能。 如果要读取的数据超过了一个块的大小,则客户端需要多次向DataNode 发送读取请求,直到读取完所有的数据

四、NameNode和SeconderyNameNode

思考:NameNode中的元数据是存储在哪里的?
NameNode中保存处理数的元数据信息,假设存储只在磁盘中,那么就无法高效率的应对客户的随机读写请求;如果存储只在内存中,一旦断电宕机,整个集群将无法使用。

因此: 引入Fsimage文件,磁盘文件,备份元数据信息。

思考:Fsimage为磁盘文件,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。

因此: 引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。

如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。

SecondaryNameNode工作流程
在这里插入图片描述

  1. 第一阶段:NameNode启动
    (1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
    (2)客户端对元数据进行增删改的请求。
    (3)NameNode记录操作日志,更新滚动日志。
    (4)NameNode在内存中对元数据进行增删改。
  2. 第二阶段:Secondary NameNode工作
    (1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
    (2)Secondary NameNode请求执行CheckPoint。
    (3)NameNode滚动正在写的Edits日志。
    (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
    (5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
    (6)生成新的镜像文件fsimage.chkpoint。
    (7)拷贝fsimage.chkpoint到NameNode。
    (8)NameNode将fsimage.chkpoint重新命名成fsimage。

Fsimage文件:HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件的inode序列号信息。
Edits文件:存放HDFS文件系统的所有更细操作的路径,文件系统客户端执行的所有写操作首先会被记录到该文件中

NameNode的每次启动都会将Fsimage文件读入内存,加载Edits文件里边的更新操作,保证内存中的数据是最新的,同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件合并了。

五、写流程

在这里插入图片描述

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在,客户端是否有写权限
(2)NameNode返回是否可以上传。
(3)客户端请求第一个 Block上传到哪几个DataNode服务器上(数据的切分在客户端完成)。
(4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3(返回dn数据存储列表)。
(5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。(Pipline管道传输)
(6)dn1、dn2、dn3逐级应答客户端。
(7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答(ACK校验)。
(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

1.如果数据块的副本数量不足,NameNode会选择其他可用的DataNode复制数据块,以满足数据块的副本数量要求。
2.如果DataNode发生故障,NameNode会将该DataNode上的数据块复制到其他可用的DataNode上,以保证数据的可靠性和容错性。

值得注意的是:

在HDFS的写流程中,edit文件记录了所有的NameNode操作,包括文件的创建、删除、修改等。当客户端向NameNode发送写请求时,NameNode会将操作记录到内存中的edit文件中。当内存中的edit文件达到一定大小时,NameNode会将其刷写到磁盘上的edit文件中。同时,SecondaryNameNode/JNS会帮助NameNode定期将内存中的edit文件刷写到磁盘中合并fsimage,以避免因为系统崩溃等原因导致内存中的数据丢失。

因此,edit文件的更改与HDFS的写流程是相互独立的。edit文件的更改只与NameNode的操作有关,而不与DataNode的写入操作有关。当NameNode接收到客户端的写请求时,会更新内存中的edit文件,而不是在DataNode写入数据时更新edit文件。因此,edit文件的更改和数据块的写入是两个独立的过程。

在Hadoop中,所有的写操作都首先被写入内存中的Edit文件,然后再由NameNode周期性地将这些操作同步到磁盘上的Edit文件中。这个过程被称为“刷写(flush)”。

在刷写之前,如果NameNode节点宕机了,那么内存中的Edit文件也会丢失,此时可能会造成数据的损失。为了避免这种情况,Hadoop使用了Write Ahead Logging(WAL)技术。WAL技术可以将写操作先写入一个磁盘上的日志文件(称为“先写日志”),然后再执行实际的写操作。这样,即使NameNode节点宕机了,也可以从日志文件中恢复出丢失的写操作。当然,这也会带来一定的性能开销,因为每次写操作都需要写入两次磁盘。

需要注意的是,Edit文件和WAL日志文件是不同的文件。Edit文件是Hadoop用来记录NameNode的元数据操作的文件,而WAL日志文件则是用来记录所有写操作的文件,WAL日志是只写文件。

既然都能够写入WAL日志文件,为什么不干脆直接写入datanode呢?
此处有个可能会忽略的问题,insert操作是随机写入的,会花费大量的寻址时间,而WAL日志文件是顺序写入的,其性能比随机写入快很多,预写日志这种方式在很多组件中都有利用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv实现人脸检测功能----20240704

opencv实现人脸检测 早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。OpenCV 的官方版本中包含了一个更准确、基于深度学习的人脸检测器, 链接:基于深度学习…

码云项目如何弄到gitlab上面

码云项目如何弄到gitlab上面 git remote -v 可查看当前的远程仓库git remote remove origin 删除当前的远程仓库git remote add origin gitXXXX:XXXX/shares.git 添加新的远程仓库 这个是你在远程gitlab上面创建的一个空仓库的ssh 地址git remote -v 验证新的远程仓库是否添加…

C++之boost智能指针

1、boost智能指针 资源获取即初始化:在构造函数中对资源进行初始化,在析构函数中释放。 智能指针的本质思想是:将堆对象的生存期,用栈对象来管理。这个栈对象就是智能指针。 当new 一个堆对象的时候,立刻用智能指针…

AI免费文档处理在线工具:文档总结;论文阅读

1、文档总结 NoteGPT 支持各种类型文档ppt、word、pdf等总结 https://notegpt.io/pdf-summary 另外各种大模型工具一般都支持文档上传总结: 例如kimi、通义等 参考:https://blog.csdn.net/weixin_42357472/article/details/138205261 2、论文阅读 h…

plugin:vite:import-analysis]No known conditions for“./lib/locale/lang/zh-cn“

将原有引入: import zhCn from element-plus/lib/locale/lang/zh-cn 改成: import zhCn from element-plus/es/locale/lang/zh-cn; 原因版本升级,引入路径改变(原先的包在node_modules\element-plus\lib找不到) 新…

c++习题09-分离整数的各个数

目录 一,题目 二,思路 三,代码 一,题目 二,思路 一开始我想到的是将简单容易输出的1000以内的数先进行相应的运算,再输出之后再对1000以上的数字进行判断(主要还是想先将很大的数变小&#x…

如何自动筛选螺丝不良品?

四角螺丝是一种特殊设计的螺丝,其螺纹头部呈四个平行的角状结构,与传统的六角螺丝相比具有独特的外观和功能。这种设计使得四角螺丝在安装和拆卸时更容易使用,并提供了更好的扭矩传递效率。四角螺丝头部呈现四个平行的角,与常见的…

如何通过IP地址查询地理位置及运营商信息

在数字时代,IP地址(Internet Protocol Address,互联网协议地址)已经成为我们日常网络活动的重要组成部分。每台连接到互联网的设备都被分配了一个唯一的IP地址,它不仅可以识别设备,还可以揭示设备的地理位置…

图像信号处理器(ISP)基础算法及处理流程

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块

无线音频应用中,远距离音频传输在许多领域具有广泛的应用需求,例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求,音频传输模块需要具备一些关键特性,包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…

fastzdp_login的第一次构建

概述 为了方便能够快捷的实现fastapi实现登录相关功能代码开发,决定开发一个开源的fastapi组件库,想了很多个名字,在检查pypi的时候发现都被占用了,所以最终决定使用fastzdp_login这个名字。 fast代表的时fastapi。zdp代表的是张…

Springboot与xxl-job

一、下载xxl-job项目 XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 从GitHub上面将项目clone下来,如果网络问题导致速度慢也可以从Gitee上面拉…

JavaScript中的立即执行函数表达式(Immediately Invoked Function Expression, IIFE)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的立即执行函数表达式(Immediately Invoked Function Expression, IIFE)1. 引言2. IIFE的概念2.1 概述2.2 语法2.3 历史背景 3. IIFE的作用3.1 创建独立作用域3.2 模块化代码3.3 防止变量提升3.…

SAPUI5基础知识10 - i18与国际化

1. 背景 i18n 是 “internationalization” 的缩写,其中的 18 是 “internationalization” 这个单词中间的字符数。i18n 是一种让应用程序支持多种语言的方法,也就是我们通常所说的国际化。 在SAPUI5中,i18n主要通过使用资源模型&#xff…

跑腿平台小程序的设计

管理员账户功能包括:系统首页,个人中心,基础数据管理,管理员管理,接单详情管理,跑腿员管理,跑腿任务管理 微信端账号功能包括:系统首页,跑腿任务,接单员&…

RocketMQ源码学习笔记:Producer启动流程

这是本人学习的总结,主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview1.1、创建MQClientInstance1.1.1、检查1.1.1、MQClientInstance的ID 1.2、MQClientInstance.start() 1、Overview 这是发送信息的代码样例, DefaultMQProducer produ…

Gradio 教程四:Building Generative AI Applications with Gradio

文章目录 一、使用interface构建NLP应用1.1 构建文本摘要应用1.1.1 设置API密钥1.1.2 调用文本摘要API1.1.3 运行本地模型获取响应1.1.4 使用interface构建应用 1.2 构建命名实体识别应用1.2.1 调用NER任务API1.2.2 使用interface构建应用1.2.3 加入额外函数,合并to…

CPU/内存/综合性能评估工具汇总-3:unixbench

目录 一、概括二、UnixBench 一、概括 嵌入式开发中对要设计的产品、立项的项目进行设计时,往往需要对关键芯片进行性能评估,本文主要总结基于linux系统的产品在性能评估时的工具使用总结,在aarch64(arm64平台下测试),板卡根文件…

Rhino 犀牛三维建模工具下载安装,Rhino 适用于机械设计广泛领域

Rhinoceros,这款软件小巧而强大,无论是机械设计、科学工业还是三维动画等多元化领域,它都能展现出其惊人的建模能力。 Rhinoceros所包含的NURBS建模功能,堪称业界翘楚。NURBS,即非均匀有理B样条,是计算机图…

【笔记】记录一次全新的Java项目部署过程

记录一次全新的Java项目部署过程 环境:CentOS7 一、初始环境准备 yum install wget -y yum install vim -y yum install net-tools -y mkdir /data mkdir /data/html mkdir /data/backend一、安装JDK 17 安装JDK17 # 下载rpm wget https://download.oracle.com…