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

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE