【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,一经查实,立即删除!

相关文章

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),在我原先的文章也有讲解过 …

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

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

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 端点,然后决定调用哪个端点并根据给定…

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

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

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

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

创建Vue3项目

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

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

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

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

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

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

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

高德地图Web服务使用方法——电子围栏

1 高德地图Web服务 1.1 添加Key 注册高德地图,进入控制台,创建新应用,添加Key,选择Web服务,不添加域名白名单,勾选同意政策。 刷新界面,记住获取到的Key。 1.2 下载安装Postman https://www…

线性代数 --- 矩阵行列式的性质

Determinant det A|A| 矩阵的行列式是一个数,这个数能够反应一些关于矩阵的信息。行列式只对方阵有效。 若矩阵A为: 则A的行列式为: 性质1: 单位矩阵的行列式等于1 性质2:行与行之间的交换会改变det的正负号 以2x2单位…

Vue知识总结-中

VUE-生命周期 生命周期概述 生命周期也常常被称为生命周期回调函数/生命周期函数/生命周期钩子生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数生命周期函数的名字不能更改,但函数的具体内容是由我们程序员自己编写的生命周期函数中的this指向是vm或组件实例对象 生命周…

解决在test以外的目录下导入junit无效

以上引用来自src目录下的文件,可以看到,和junit有关的导入都飘红,但明明junit已经被正确导入进了项目中。 再看右侧的Maven的依赖下方,junit的右边有一个很不起眼的(test) 这是因为junit作为测试框架,可能包含仅适用于…

杰发科技AC7840——CAN通信简介(2)

1.时钟频率 2.位时间 3.采样点 4.消息缓冲区 和ST、NXP的邮箱类似,AutoChips用了缓冲区的概念。 5.接收缓冲区 屏蔽掉demo程序的发送,只看接收情况 在回调中接收数据 先判断是不是进了接收中断 接收数据的处理函数 所有buff数据放到Info buff的内容 BUF…

1872_S32K344 MCU基本信息了解

全部学习汇总: GreyZhang/g_s32k344: A new MCU learning notes. I would try to use MCAL instead of SDK. (github.com) 以下的摘录信息来自: S32K Auto General-Purpose MCUs | NXP Semiconductors 安全等级可以到ASIL D。 M7的内核,主频可…

深入理解并解析Flutter Widget

文章目录 完整代码程序入口构建 Widget 结构定义 widget 状态定义 widget UI获取上下文关于build()build() 常用使用 完整代码 import package:english_words/english_words.dart; import package:flutter/material.dart; import package:provider/provider.dart;void main() …