HDFS的工作原理是怎么样的?是如何实现HA模式?

news2024/11/16 13:25:19

原文链接:http://www.ibearzmblog.com/#/technology/info?id=714dcb3957e29185493239b269a9ef65

前言

HDFS是能够提供一个分布式文件存储的系统,在大型数据文件的存储中,能够提供高吞吐量的数据访问,那么它是如何实现数据文件的读写的呢?作为集群老大的NameNode当出现服务不可用的情况,HDFS又如何启用备用节点来实现HA的呢?今天我们来好好说下。

HDFS的读写流程

在讲述读写流程前,还是很有必要重新复述下数据块这个概念,在分布式文件系统中,一个大型数据文件会被切分成多个部分,并分别存储在多个DataNode上,每个文件部分就是一个数据块,数据块存储在DataNode上后,对应的DataNode就会将块的信息报告给NameNode。

讲完这些,我们开始说如何读写。

如何读

看下面流程图:

可以看到,要读取HDFS中的文件一共分为6个步骤:

  1. 当HDFS客户端需要读取一个数据文件的时候,首先会调用FileSystem的open()方法获取一个dfs对象(DistributedFileSystem)
  2. DFS通过RPC从NameNnode中获取文件第一批块的位置信息后,会返回一个FsDataInputStream对象。
  3. 返回的FsDataInputStream会被封装成DFSInputStream(分布式文件系统输入流),里面提供了管理NameNode和DataNode输入流的方法。当客户端调用read()方法的时候,DFSInputStream就会找出离客户端最近的DataNode并连接。
  4. 找出DataNode后就会开始读取对应的数据块,数据开始流向客户端。
  5. 当第一个块读取完成后,就会关闭第一个块指向的DataNode连接,然后接着读下一个块。
  6. 当第一批块读取完成后,就会向NameNode获取下一批块的位置信息,然后继续读取。
  7. 当所有块都读取完成后,就会关闭所有的流。

当然,在实际情况下,想一直那么顺利的传输数据是不可能的,如果在读取数据的时候,DataNode和DFSInputStream发生异常的时候,那么DFSInputStream会尝试获取当前读取块第二近的DataNode节点,并会记录哪个DataNode发生错误,后面涉及到该出事DataNode读取的时候,就会自动跳过。

如果读取的块已经坏了,那么就会将这种情况汇报给NameNode,并且从其他DataNode读取该块数据。

如何写

看下面流程图:

  1. 和读操作一样,首先通过FileSystem获取一个DFS对象,并通过DFS对象来的create()方法来创建一个新的文件。
  2. DFS通过RPC调用NameNode去创建一个新文件,NameNode在创建前会做一些额外的校验,如文件是否已经存在、客户端是否有权限创建文件等等。
  3. 前面的操作完成后,DFS会返回一个FsDataOutputStream对象,同样,FsDataOutputStream会被封装成DFSOutputStream(分布式文件系统输入流),同样,DFSOutputStream也提供了协调DataNode和NodeNode的方法。
  4. 当客户端开始写数据的时候,就会将数据块切分成一个个数据包,然后将这些数据包排成一条数据队列。
  5. 多个DataNode组成一条数据管道,当开始传输的时候,首先第一个数据包会传到数据管道的第一个DataNode,当第一个DataNode收到后会将这个数据包传给下一个DataNode。
  6. DFSOutputStream除了数据管道外,还维护着另一个队列:响应队列,这个队列也是由数据包组成的,当DataNode收到数据块的数据包后,就会返回一个响应数据包,当管道中所有的DataNode都收到响应数据包的时候,响应队列才把对应的数据包移除
  7. 客户端在写操作完成后,就会调用close()关闭输出流。
  8. 同时,客户端会通知NameNode把文件标记为已完成,然后NameNode会把文件写入成功的结果返回给客户端。这时整个写操作才完成。

当然,凡是涉及到节点之前的通信,都大概率会出现一些奇怪的问题,例如网络不可用啊、通信节点掉线啊等等,对于这种情况,写操作要比读操作要复杂一点,如果在写操作过程中其中一个DataNode发生错误,那么就有下面几个步骤来处理:

  1. 管道关闭
  2. 正常的DataNode正在写的块会由一个新的ID,并且这个ID会汇报给NameNode,而失败的DataNode上发生错误的块就会在下次上报心跳的时候删掉。
  3. 失败的DataNode会被从管道中移除,而块中剩下的数据包会继续写入到管道里其他的DataNode上。
  4. NameNode同时会标记这个块的副本数量少于指定值,那么会在后面将这个块的副本在其他DataNode上创建。

HDFS的高可用实现

讲完了HDFS的读写流程,我们接下来说下HDFS如何实现高可用。

HDFS的NameNode为单一节点,为HDFS提供对外统一服务,这说明如果NameNode因为某些原因掉线了,那整个HDFS集群就会瘫痪。为了防止这种情况在生产环境中出现,就引入了高可用(HA)模式。

在HA模式中,一般由两个NameNode组成,一个是处于激活(Active)状态,另一个就处于待命(Standby)状态,处于激活状态的NameNode对外提供统一服务,而待命状态的NameNode则不对外提供服务,同时及时同步激活状态的NameNode。当激活的NameNode掉线了,待命的NameNode就马上切换状态,变成Active。

HDFS的高可用架构图如下所示:

在这个架构中出现了一些从没见过的组件,下面我来逐个剖析:

  • NameNode的Active和Standby状态上面说了,这里就不细说。
  • 主备切换器,它是另外一个单独的进程运行,主要负责NameNode的主备切换。主备切换器实时健康NameNode的情况,当NameNode发送故障时,就会通过Zookeeper的选举机制来进行选举和切换。
  • JournalNode集群:这是一个共享数据存储系统,这个系统保存了NameNode在运行过程中产生的HDFS元数据,而备用的NameNode节点则会从通过JournalNode来同步主NameNode的信息。当新的主NameNode确认元数据完全同步后才会对外提供服务。

结尾

HDFS的工作原理已经讲到这里,后面会更新YARN方面的文章。

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

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

相关文章

电机调速执行

一、建立思维导图,将功能分析近而转换成技术要点,逐步实现。 二、编码器 1、机械编码器 (1)机械编码器是什么,张啥样? 如下图,这个就是我们生活应用中常见的机械编码器,我们又叫旋…

【C++】模板初阶——函数模板和类模板

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C 🛹Linux 📕 学习格言:博观而约取&#xff0…

鲍威尔一句话,BTC冲破30000!币圈涨跌不再依赖美联储降息?

仅仅一夜,全球最大的加密货币比特币价格突破30000美元关键阻力位,最高突破至30800美元,创2023年4月以来的最高价。而美联储主席鲍威尔的证词,竟是这波行情的最大催化剂。 鲍威尔周三出席众议院金融服务委员会接受质询,…

为什么独立站做不好?80%的人都走过这5个弯路

最近接触了不少卖家,发现不少独立站因为犯下一些常见的错误,导致最终失败,但是这些都是完全可以避免的。 那些新手卖家常见的问题就是许多人对独立站运营没有基本概念,同时并没有把脑袋中的零散的技巧串起来。要知道独立站运营是…

青大数据结构【2018】【单选、简答】

关键字: 计算机数据结构、存储方式、递归设计、矩阵压缩存储、二叉树形态、哈希冲突、希尔排序 一、单选 二、简答 对于线性表的存储,当采用顺序存储时,插入和删除元素平均需要移动半个表长,而链式存储结构只需要修改相应的指针就可以了。 递归设计要注意递归函数式的内…

【Java系列】深入解析Stream API

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点 希望这篇文章能让你不仅有一定的收获,而且…

看完这篇 教你玩转渗透测试靶机vulnhub—Emplre: Lupinone

Vulnhub靶机Emplre: Lupinone渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:SSH私钥爆破登入:③:pip提权&#xf…

[晕事]今天做了件晕事14,查单词charp

从内核模块的代码里看到一个单词charp,去尝试查单词,发现了一个 Charp impact value 【机】 夏比冲击值 这个直接是音译,肯定不是想要的, 后来使用bing搜索引擎,里面有一个链接: 这个网页真是很有迷惑性&am…

GEE:实现 Lee 杂波滤波器(Lee speckle filter)降低或去除SAR图像中的杂波(speckle noise)

作者:CSDN @ _养乐多_ 这段代码实现了一种叫做Refined Lee滤波器的雷达图像处理算法。Lee speckle filter(Lee杂波滤波器)是一种常用的合成孔径雷达(SAR)图像处理算法,用于降低或去除SAR图像中的杂波(speckle noise)。SAR图像中的杂波是由于SAR工作原理导致的干涉和散…

图形编辑器开发:缩放至适应画布

大家好,我是前端西瓜哥。 之前我们实现了画布缩放的功能,本文来讲讲如何让内容缩放至适应画布大小(Zoom to fit)。 我们看看效果。 文中的动图演示来自我正在开发的图形设计工具: https://github.com/F-star/suika 线…

SpringBoot 统⼀功能处理

目录 SpringBoot 统一功能处理概念 统一用户登录权限验证 登录功能代码 Spring拦截器实现步骤: 统一项目访问前缀 第一种方法:重写configurePathMatch方法进行配置 第二种方法:在系统的配置文件.properties中进行配置 统一异常处理返回…

香橙派4 2. 驱动usb2.0芯片cy7c68013

0. 环境 - 香橙派4(Orangepi4_2.1.2_ubuntu_bionic_desktop_linux4.4.179.img) - EZ-USB FX2LP CY7C68013A USB 核心板 1. 下载FX3_SDK_1.3.4_linux EZ-USB™ FX3 Software Development Kit https://www.infineon.com/cms/en/design-support/tools/sdk…

Autosar模式管理实战系列08-BswM与EcuM模块交互详解

本文框架 前言EcuM及BswM交互EcuM及BswM交互总览启动时BswM与EcuM的状态管理交接下电时BswM与EcuM的状态管理交接前言 在Autosar模式管理系列介绍01-BswM文章中,我们对BswM基本内容进行了介绍,我们知道了BswM是根据既定的仲裁规则对来自应用层SWCs或其他底层BSW模块,同时也…

InnoDB 和 MyISAM 的区别

1、InnoDB支持事务,MyISAM不支持; 2、InnoDB支持外键,MyISAM不支持; 3、InnoDB是簇索引,MyISAM是非簇索引; 4、Innodb不支持fulltext全文索引,MyISAM支持; 5、InnoDB支持到行级锁&am…

JavaSE基础语法--数组的拷贝

数组的拷贝方法有好几种,第一种是简单的for循环。通过遍历原数组来给新数组赋值完成数组的拷贝代码如下: import java.util.Arrays;public class TestDemo {public static void main(String[] args) {int[] arr1{1,2,3,4,5,6};int[] arr2new int[arr1.l…

MySQL高级SQL语句操作之存储过程

MySQL高级SQL语句操作之存储过程 一、存储过程介绍二、存储过程操作1、创建存储过程2、调用存储过程3、查看存储过程4、存储过程的参数5、删除存储过程6、存储过程的控制语句6.1 条件语句6.2 循环语句 一、存储过程介绍 存储过程是一组为了完成特殊功能的SQL语句集合存储过程在…

Tik Tok 如何提高账户的活跃度和吸引力?

Tik Tok 是一款非常受欢迎的应用程序,它在全球范围内拥有大量的用户和创作者。Tik Tok 在人工智能技术方面投入了大量的资源,并且正在不断改进和扩展其人工智能技术。Tik Tok 正在不断扩展其业务,例如在音乐、视频制作等方面扩展。这表明 Tik…

如何提升虚拟机性能?除了绑核还有它可以!

第一章 大页内存与小页内存 1.1 小页内存 在Linux系统中,默认情况下,内存管理器将物理内存划分为小页(4KB)或大页(2MB或1GB)的大小。Linux内核会根据需要分配和释放内存,以确保系统的稳定性和性能。 在默认情况下,Linux系统会使用…

在spring事务中扩展业务操作;spring事务同步器TransactionSynchronizationManager

概述 业务上经常会有一些需求是需要在某个数据库操作事务提交之后再去操作。 我常用的就方式有TransactionalEventListener和TransactionSynchronizationManager. 其实TransactionalEventListener背后使用的也是TransactionSynchronizationManager。 注意点:在a…