【Hadoop】说下HDFS读文件和写文件的底层原理?

  • 文件读取
  • 文件的写入

文件读取

在这里插入图片描述

  1. 客户端调用 FileSystem 对象的 open()函数,打开想要读取的文件。其中FileSystem 是 DistributeFileSystem 的一个实例;
  2. DistributedFileSystem 通过使用 RPC(远程过程调用) 访NameNode 以确定文件起始块的位置,同一 Block 按照重复数会返回多个位置,这些位置按照 Hadoop 集群拓扑结构排序,距离客户端近的排在前面;
  3. DistributedFileSystem 返 回 FSDataInputStream 输入流给客户端, FSDataInputStream 存储着文件起始块的 DataNode 地址,通过对数据流反复调用 read()方法,可以将数据从 DataNode 传输到客户端;
  4. 当此数据块读取完成时,DFSInputStream 数据流和此 DataNode 的连接被关闭,然后再继续连接此文件下一个数据块的最近的 DataNode
  5. 当客户端读取完全部数据的时,会调用 FSDataInputStream 的 close()方法关闭该HDFS 文件

下面是简略版本:

客户端向NameNode 发起读请求,说我要读取文件了,NameNode进行一些判断,看看这个客户端是否有读取权限呀、这个文件是否存在呀,判断可以之后,NameNode就会查询这个文件的元数据,获取这个文件的数据块位置列表,然后返回给客户端一个输入流对象,客户端就通过这个输入流对象不断的从DataNode中读取数据。在读的过程中,数据是以二进制流传输的。当一个块读完后,就关闭掉这个输入流,再和下一个数据块所在的DataNode建立一个数据流来读取下一个数据块。在整个过程中,因为一个数据块可能拥有多个副本,所以会得到多个DataNode的地址,在读的时候,根据就近原则选择离客户端最近的DataNode。


文件的写入

在这里插入图片描述

  1. HDFS Client 通过调用 DistributedFileSystem 的 create()方法创建新文件;
  2. DistributedFileSystem 通过 RPC 访问 NameNode, 在文件系统的命名空间中创建一个新的文件,创建前 NameNode 会验证客户端地权限并确认该文件不存在,如果检查通过,NameNode 会为新文件添加一条记录,否则就会抛出 IO 异常;
  3. 客户端开始写文件,DFSOutputStream 会将文件分割成 packets 数据包,HDFS 中每个 block 默认情况下是128M,由于每个块比较大,所以在写数据的过程中是把数据块拆分成一个个的数据包( packet )以管道的形式发送的。然后将这些 packets 写到其内部的一个叫做 data queue(数据队列)。data queue 会向 NameNode 节点请求适合存储数据副本的DataNode 节点的列表,然后这些 DataNode 之前生成一个 Pipeline 数据流管道,我们假设副本因子参数为3,那么这个数据流管道中就有三个 DataNode 节点;
  4. 首先 DFSOutputStream 会将 packets 向 Pipeline 数据流管道中的第一个 DataNod e节点写数据,第一个 DataNode 接收 packets 然后把 packets 写向 Pipeline 中的第二个节点,同理,第二个节点保存接收到的数据然后将数据写向 Pipeline 中的第三个 DataNode 节点;
  5. DFSOutputStream 内部同样维护另外一个内部的写数据确认队列——ack queue。当 Pipeline 中的第三个 DataNode 节点将 packets 成功保存后,该节点回向第二个 DataNode 返回一个确认数据写成功的信息,第二个 DataNode 接收到该确认信息后在当前节点数据写成功后也会向 Pipeline 中第一个 DataNode 节点发送一个确认数据写成功的信息,然后第一个节点在收到该信息后如果该节点的数据也写成功后,会将 packets 从 ack queue 中将数据删除;
  6. 当数据写入完成时,就调用 DistributedFileSystem 的 close()函数关闭写入流

下面是简略版本:

客户端向NameNode发出写文件请求。同样,NameNode 接受到请求后,会做一些校验工作,如文件是否存在、客户端是否有写权限等,并将写操作记录到 edits 文件中。接着NameNode 将给客户端返回每个 block 存放的 DataNode 列表。假如一个block总共有三个副本,客户端在向DataNode写的时候,会和这三个副本所在的3个DataNode建立起一个管道,然后客户端通过输出流向第一个DataNode传送数据流,是以包的形式传送的,然后这个包会直接在pipeline里传给第二个、第三个。每个DataNode写完一个块后,会返回确认信息。当客户端收到3个确认信息之后就知道都写好了。如果没收够确认消息,那就再重新指定一个 DataNode 进行写操作。

使用 管道 的方式进行写操作,不需要客户端写三份备份,因为客户端写文件时是通过网络传输,所有备份由客户端写的话将严重影响写操作的速度。

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

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

相关文章

Linux rpm命令教程:如何使用rpm命令进行软件包管理(附实例详解和注意事项)

Linux rpm命令介绍 rpm命令,全称为Red Hat Package Manager,是用于管理Linux各项套件的程序。它最初是由Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎,逐渐受到…

简单讲述网络安全的概念、类型和重要性

什么是网络安全? 网络安全是指用于防止网络攻击或减轻其影响的任何技术、措施或做法。网络安全旨在保护个人和组织的系统、应用程序、计算设备、敏感数据和金融资产,使其免受简单而不堪其绕的计算机病毒、复杂而代价高昂的勒索软件攻击,以及介…

Unity 了解Input Manage下默认的输入轴

在Unity菜单Edit->Project Settings->Input Manager->Axes下有一些默认的输入轴,如 这些输入轴代表不同类型的输入,其中: Horizontal:水平移动输入轴。通常与键盘的左右箭头键、A和D键、游戏手柄的左摇杆水平轴等相关联…

【AI视野·今日CV 计算机视觉论文速览 第282期】Wed, 3 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Wed, 3 Jan 2024 Totally 70 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Street Gaussians for Modeling Dynamic Urban Scenes Authors Yunzhi Yan, Haotong Lin, Chenxu Zhou, Weijie Wang, Haiya…

nvm安装教程,实现node的多版本管理(图文界面)

目录 前言1. 安装配置2. 使用方式 前言 由于前端项目不同的node版本,导致重复的卸载安装会比较麻烦,对此需要nvm来管理 类似python版本的差异,可以使用虚拟环境管理(anconda),在我原先的文章也有讲解过 …

js 如何判断对象自身为空?

js 如何判断对象自身为空? 前置知识: js 对象中的可枚举属性 enumerable : 用来控制所描述的属性是否将被包括在 for…in 循环之中(除非属性名是一个 Symbol )。具体来说,如果一个属性的 enumerable 为fa…

从法律和经济学角度看工业数据共享

文章目录 前言一、工业数据利用现状二、工业数据的新特点三、数据再利用和储备的现状(一)防止先行者通过数据进行垄断(二)数据储备情况以及数据成本、数量和价值四、工业数据共享的法律经济学模型分析情形一:在没有数据共享政策的情况下,尝试给出如下命题。情形二:有数据…

LeetCode-加一(66)

题目描述: 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 思路: 这里主要分…

《路由与交换技术》---简答题

1、什么是STP?解决什么问题? STP代表生成树协议(Spanning Tree Protocol)。它是用于在计算机网络中解决环路问题的一种协议。 STP的主要目标是消除环路,保持网络的稳定性和可靠性,同时提供冗余路径以实现网…

快速实现产品智能:用 AI 武装你的 API | 开源日报 No.138

openchatai/OpenCopilot Stars: 3.8k License: MIT OpenCopilot 是一个允许你拥有自己产品的 AI 副驾驶员的项目。它集成了产品底层 API,并可以在需要时执行 API 调用。它使用 LLMs 来确定用户请求是否需要调用 API 端点,然后决定调用哪个端点并根据给定…

【OJ】C++,Java,Python,Go,Rust

for循环语法 // cpp// java// python for i in range(集合): for i, val in enumerate(集合): for v1,v2,v3,... in zip(集合1,集合2,集合3,...):Pair // cpp pair<int, string> first second // java Pair<Integer, String> first() new Pair<>(firstVal…

【设计模式之美】里式替换(LSP)跟多态有何区别?如何理解LSP中子类遵守父类的约定

文章目录 一. 如何理解“里式替换原则”&#xff1f;二. 哪些代码明显违背了 LSP&#xff1f;三. 回顾 一. 如何理解“里式替换原则”&#xff1f; 子类对象能够替换程序中父类对象出现的任何地方&#xff0c;并且保证原来程序的逻辑行为不变及正确性不被破坏。 里氏替换原则…

【办公软件】手机当电脑摄像头Iriun Webcam软件安装与试用

家里电脑是台式的没有摄像头&#xff0c;但老安卓手机有一台。本来想用小爱摄像头做电脑摄像头&#xff0c;但是发现像素有点差&#xff0c;捣鼓了半天没成功。看网上别人都用旧手机来当电脑摄像头&#xff0c;并且也能使用音频&#xff0c;所以还是用旧手机做摄像头比较香。 …

爆肝整理,接口测试+为什么要做接口测试总结,策底贯通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、什么是接口测试…

【Leetcode】707. 设计链表

707. 设计链表 代码 【Leetcode】707. 设计链表 代码 type MyLinkedList struct {Val intNext *MyLinkedList }// 创建链表&#xff0c;需要返回一个链表结构体&#xff0c;因此该链表是一个有头单链表&#xff0c;头结点不为空 func Constructor() MyLinkedList {return MyLi…

dp--198.打家劫舍/medium 理解度B

198.打家劫舍 1、题目2、题目分析3、解题步骤4、复杂度最优解代码示例5、抽象与扩展 1、题目 一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻…

创建Vue3项目

介绍 使用命令创建vue3项目 示例 第一步&#xff1a;执行创建项目命令 npm create vuelatest第二步&#xff1a;填写输入项 第三步&#xff1a;进入study-front-vue3文件夹 cd study-front-vue3第四步&#xff1a;执行npm命令安装依赖 npm install第五步&#xff1a;运行…

YOLO蒸馏原理篇之---MGD、CWD蒸馏

一、MGD蒸馏 论文地址:https://arxiv.org/abs/2205.01529 论文翻译:https://mp.weixin.qq.com/s/FSvo3ns2maTpiTTWsE91kQ 1.1 摘要 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的表现。本文表明,教师还可以通过指导学生的特征恢复来提…

60.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏公告功能的逆向分析与测试

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;文字资源读取类的C还原-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;878db7708de09b448010ef54526fe…

爬虫-3-模拟登录,代理ip,json模块

#本文仅供学习使用(O&#xff40;) 如果服务器响应的数据为json数据: 那么我们可以用 res.json() 或 json模块(将json字符串转换为Python里面的字典类型) 接收数据。