HDFS读写数据过程原理分析

2024-09-06 20:58

本文主要是介绍HDFS读写数据过程原理分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大数据技术与架构

点击右侧关注,大数据开发领域最强公众号!

暴走大数据

点击右侧关注,暴走大数据!

Hadoop HDFS读写数据过程原理分析

在学习hadoop hdfs的过程中,有很多人在编程实践这块不知道该其实现的原理是什么,为什么通过几十行小小的代码就可以实现对hdfs的数据的读写。

在下面的介绍中会详细的说明该其过程实现的原理(图片选自中国大学MOOC[大数据技术原理与应用]课程)。

一、读数据的原理分析

1. 打开文件。

用Java导入FileSystem类,通过FileSystem.get(conf)声明一个实例对象fs,从而分布式系统底层的配置文件会被项目所调用,如core-site.xml、hdfs-site.xml;进而生成一个子类DistributedFileSystem,这时候实例对象fs与分布式系统也就紧紧相关了。

由于我们要读数据,当然就需要使用到输入流,这时候输入流的类型是FsDataInputStream,其中封装着DFSInputStream。

在这里为什么我们看不见或者无法调用DFSInputStream呢,因为这是Hadoop后台自动给其封装的好的,真正与Hadoop当中的名称节点进行交流的,其实是DFSInputStream,而不是FsDataInputStream。

FsDataInputStream在项目中是干嘛呢,其实是与客户端进行交流的。

2. 获取数据块信息

由于FsDataInputStream内部封装了DFSInputStream,要获取项目所需要的数据被存放到哪些数据节点,因此DFSInputStream会通过conf中的配置文件信息远程与名称节点进行交流。

通过当中的ClientProtocal.getBlockLocations()方法来向名称节点查找项目所需的数据被存放到哪些数据节点,而名称节点会把文件的开始一部分数据位置信息返回去。

3. 读取请求

客户端获得输入流FsDataInputStream返回的数据位置信息,就可以使用read函数读取数据。

这时候肯定不少就近客户端的存在,事实上,名称节点在返回时还包括将数据节点距离客户端的远近进行排序,而客户端会自动选择距离最近的一个数据节点进行连接,接着读取数据。

4. 读取数据

当客户端读取完数据后,FsDataInputStream需要关闭和数据节点的连接。

5. 获取数据块信息

对应刚才的第二步,我们可能只读取了文件数据的部分数据块位置信息,因此需要再次通过ClientProtocal.getBlockLocations()方法来向名称节点查找项目所需的下一个数据被存放到哪些数据节点。

同样的,名称节点会返回下一个数据的数据节点位置信息节点列表给客户端。

6. 读取数据

客户端获取信息后,继续通过read函数与这些数据节点进行连接,不断循环,知道完成所有数据库的读取。

7. 关闭文件

客户端调用FsDataInputStream输入流的关闭操作close,关闭整个文件读取数据的过程。

二、写数据的原理分析

1. 创建文件请求

与读数据一样,通过FileSystem.get(conf)声明一个实例对象fs,从而分布式系统底层的配置文件会被项目所调用,如core-site.xml、hdfs-site.xml;进而生成一个子类DistributedFileSystem,这时候实例对象fs与分布式系统也就紧紧相关了。

由于我们要写数据,当然就需要使用到输出流,这时候输出流的类型是FsDataOutputStream,其中封装着DFSOutputStream。

在这里为什么我们看不见或者无法调用DFSOutputStream呢,因为这是Hadoop后台自动给其封装的好的,真正与Hadoop当中的名称节点进行交流的,其实是DFSOutputStream,而不是FsDataOutputStream。

FsDataOutputStream在项目中是干嘛呢,其实是与客户端进行交流的。

2. 创建文件元数据

DFSOutputStream执行RPC远程调用,让名称节点在文件系统的命名空间中新建一个文件。

名称节点不会直接创建文件,首先会进行检查,检查该文件是否已存在,接着会检查客户端是否有权限去创建该文件。如果检查通过,名称节点则会创建该文件,通过数组返回。

3. 写入数据

由于写数据要写入数据节点,而数据副本也会被相应写入进去,有点类似于流水线。在HDFS中有一种非常高效的写数据方式,叫做流水线的复制方式。

将客户端要写的数据,分成一个个小的数据包,这些数据包会被放在DFSOutputStream对象的内部队列,之后DFSOutputStream向名称节点申请保存这些数据块的数据节点。

4. 写入数据包

名称节点返回信息后,客户端可以知道写入到哪些数据节点,一个数据节点列表有很多个数据节点,这些数据节点会被排成一个队列, 并且把一个数据保存到多个数据节点上,形成数据流的管道。

而放在队列的数据包会被再次打包成数据包,将其发送到整个数据流管道当中的第一个数据节点,接着第一个数据节点发送给第二个数据节点以此类推。因为这些数据包要重复写到这些数据块上,一模一样的数据块也叫数据副本。这些数据节点就形成一个流水线。

5. 接收确认包

当最后一个数据节点写好数据块后,就会返回一个确认包。最后一个数据节点发送给最后第二个数据节点以此类推,传回到第一个数据节点,再传回到客户端。

6. 关闭文件

客户端接收到时则说明数据的整个写操作完成。完成后就可以关闭文件。

7. 写操作完成

由此整个HDFS写操作就就完成。

欢迎点赞+收藏+转发朋友圈素质三连

文章不错?点个【在看】吧! ????

这篇关于HDFS读写数据过程原理分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143100

相关文章

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da