首页 > 其他分享 >二、HDFS的读写流程

二、HDFS的读写流程

时间:2023-11-29 10:22:20浏览次数:41  
标签:HDFS NN ack 读写 packet node1 node2 流程 客户端

一、写数据(宏观)

 

 

写数据就是将客户端上的数据上传到HDFS

 

1.客户端向HDFS发送写数据请求

 

 hdfs dfs -put students.txt /shujia/

 

2. Filesystem通过rpc调用namenode的put方法

 

a. nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在,权限

 

b. 有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS

 

c. 没有:直接抛出对应的异常,给予客户端错误提示信息

 

3.如果DFS接收到成功的状态,会创建一个FSDataOutputStream的对象给客户端使用

 

4.客户端要向nn询问第一个Block存放的位置

 

NN通过机架感知策略 (node1 node 2 node3)

 

5.需要将客户端和DN节点创建连接

 

 pipeline(管道)

客户端 和 node1 创建连接 socket
node1 和 node2 创建连接 socket
node2 和 Node3 创建连接 socket

 

6.客户端按照文件块切分数据,但是按照packet发送数据 默认一个packet大小为64K,Block128M为2048个packet

 

7.客户端通过pipeline管道开始使用FDSOutputStream对象将数据输出

 

   1. 客户端首先将一个 packet 发送给 node1, 同时给予 node1 一个 ack 状态
  2. node1接受数据后会将数据继续传递给 node2, 同时给予 node2 一个 ack 状态
  3. node2接受数据后会将数据继续传递给 node3, 同时给予 node3 一个 ack 状态
  4. node3将这个 packet 接受完成后,会响应这个 ack 给 node2 为 true
  5. node2会响应给 node1 , 同理 node1 响应给客户端

 

8.客户端接收到成功的状态 , 就认为某个 packet 发送成功了,直到当前块所有的 packet 都发送完成

 

1. 如果客户端接收到最后一个 pakcet 的成功状态 , 说明当前 block 传输完成,管道就会被撤销

 

2. 客户端会将这个消息传递给 NN , NN 确认传输完成

 

1. NN会将 block 的信息记录到 Entry, 客户端会继续向 NN 询问第二个块的存储位置 , 依次类推

 

block1 (node1 node2 node3)

 

block2 (node1 node3 node6)

 

....

 

blockn(node1 node4 node6)

 

3. 当所有的 block 传输完成后, NN 在 Entry 中存储所有的 File 与 Block 与 DN 的映射关系关闭

 

FsDataOutPutStream

 

二、写数据(微观)

1.客户端首先从自己的硬盘中以流的形式将自己的数据读取到缓存中

2.然后将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet(64k)

 

1. chunk:checksum=128:1
2. checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
3. Packet中的数据分为两类,一类是实际数据包,另一类是 header 包。
4. 一个 Packet 数据包的组成结构(分两类,一类是实际的数据包,另一类是header包。)

 

 

 

一个数据包的组成结构:

参数理解:

 

 3.(默认生成的快,发送的慢)当packet满的时候添加到dataqueue

4.datastreamer开始从dataqueue队列上读取一个packet,通过FDSDataOPS发送到Poepleline

在取出的时候,也会将 packet 加入到 ackQueue, 典型的生产者消费者模式

客户端发送一个 Packet 数据包以后开始接收 ack ,会有一个用来接收 ack 的 ResponseProcessor 进 程,如果收到成功的 ack

1. 如果某一个 packet 的 ack 为 true, 那么就从 ackqueue 删除掉这个 packet
2. 如果某一个 packet 的 ack 为 false, 将 ackqueue 中所有的 packet 重新挂载到 发送队列 , 重新发送

 

 

 

三、读数据

 

1.首先客户端发送请求到 DFS ,申请读取某一个文件

2.DFS 去 NN 查找这个文件的信息 ( 权限 , 文件是否存在 ) 如果文件不存在,抛出指定的错误 如果文件存在,返回成功状态

3.DFS 创建 FSDataInputStream 对象,客户端通过这个对象读取数据

4.客户端获取文件第一个 Block 信息 , 返回 DN1 DN2 DN8

5.客户端直接就近原则选择 DN1 对应的数据即可

6.依次类推读取其他块的信息,直到最后一个块 , 将 Block 合并成一个文件 7.关闭 FSDataInputStream

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:HDFS,NN,ack,读写,packet,node1,node2,流程,客户端
From: https://www.cnblogs.com/SIKE231310/p/17863936.html

相关文章

  • Hadoop三大组件(HDFS,MapReduce,Yarn)
    1、HDFSHDFS是Hadoop分布式文件系统。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。2、MapReduceMapReduce是一个软件框架,基于该框架能够容易地编写应用......
  • spark离线分析--本地Spark1.6版本读写hive表
    1.搭建好hive环境,并将hive-site.xml文件放到本地工程的resources目录下2.java测试代码  publicclassSparkHiveTest{publicstaticvoidmain(String[]args){JavaSparkContextjavaSparkContext=null;try{SparkContextsparkConf=newS......
  • scrapy 框架的安装及流程-01
    一、简介 scrapy的优势:1、为了更利于我们将精力集中在请求与解析上2、企业级的要求,效率高 二、模块安装scrapy支持Python2.7和python3.4以上版本1.在https://www.lfd.uci.edu/~gohlke/pythonlibs/下载对应的Twisted的版本文件 2.在命令行进入到Twisted的目......
  • 流程控制
    流程控制语句(一)什么是流程控制程序是由语句构成,而流程控制语句是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句,功能也都基本相似。流程控制结构可分为三种:顺序结构分支结构顺序结构......
  • 流程控制
    流程控制语句(一)什么是流程控制程序是由语句构成,而流程控制语句是用来控制程序中每条语句执行顺序的语句。可以通过控制语句实现更丰富的逻辑以及更强大的功能。几乎所有编程语言都有流程控制语句,功能也都基本相似。流程控制结构可分为三种:顺序结构分支结构顺序结构......
  • Scrum敏捷开发流程核心及敏捷支持工具
    ​Scrum是一种敏捷开发框架,用于管理复杂的项目。以下这些步骤构成了Scrum敏捷开发流程的核心。通过不断迭代、灵活应对变化和持续反馈,Scrum框架帮助团队快速交付高质量的产品。以下是Scrum敏捷开发流程的基本步骤:产品Backlog创建: 产品负责人与利益相关者合作,制定产品Backlog......
  • 日志错位读写的问题
    在对象销毁的时候需要记得销毁句柄:classNgLogger:def__init__(self,module,file_name):self.logger=logging.getLogger(module)self.logger.setLevel(logging.DEBUG)self._fh=logging.FileHandler(file_name)self._fh.setLeve......
  • 探索性因子分析流程
    探索性因子分析的步骤:接下来,通过一个案例演示因子分析(探索性因子分析)的各个步骤应该如何进行。案例:欲探究我国不同省份铁路运输能力情况,收集到部分相关数据如下:上传数据至SPSSAU系统,在【进阶方法】模块,选择【探索性因子分析】,将变量拖拽到右侧分析框,勾选“因子得分”与“综合......
  • 登录的具体流程
    1.校验验证码、2.校验用户名和密码3.生成Token(生成令牌) 成功登录后会记录在这表里(不成功等情况也会记录) idutils是再ruoyi-common里面的调用来用。 ......
  • 秦疆的Java课程笔记:42 流程控制 增强For循环
    Java5引入的一种主要用于数组或集合的增强型for循环。这里只是先了解一下。格式如下:for(声明语句:表达式){ //代码语句}声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用于限定在循环语句块,其值与此数组元素的值相等。表达式:表达式是要访问的数组......