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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术