首页 > 其他分享 >HDFS的读写流程——宏观与微观

HDFS的读写流程——宏观与微观

时间:2022-08-23 10:38:34浏览次数:74  
标签:DN HDFS ack 读写 packet 微观 block 客户端

HDFS的读写流程——宏观与微观

HDFS:分布式文件系统,负责存放数据

分布式文件系统:就是将我们的数据放到多台电脑上存储。

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

宏观过程

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

    hdfs dfs -put student.txt /shujia/ 客户端发送命令将student.txt文件上传到/shujia/目录下
    
  2. Filesystem通过rpc调用namenode的put方法

    • NN(NameNode)首先检查是否有足够的空间权限等条件来创建这个文件,或者这个路径是否已经存在,有权限会针对这个文件创建一个空的Entry对象,并提示返回成功状态给DFS。没有权限会直接抛出对应的异常,给与客户端错误提示信息
  3. 如果DFS接收到成功的状态,会创建一个FSDataOutputStream的对象给客户端使用

  4. 客户端要向NN询问第一个Block块存放的位置(通过机架感知策略)

  5. 需要将客户端与DN(DataNode)节点通过管道(pipeline)的方式建立连接,DN节点之间也是通过这种方式连接

  6. 客户端会按照块对文件进行切分,但是按照packet的方式来发送数据。默认一个packet的大小是64K,一个块128M就有2048个packet

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

    • 客户端首先将一个packet包发送给node1,同时给予node1一个ack状态
    • node1接收数据后会将数据继续传递给node2,同时给与node2一个ack状态
    • 同理,node2会传给node3,同时给node3一个ack状态
    • node3将这个packet接收完成后会响应这个ack状态,给node2说我的状态为true。
    • node2会响应node1,node2的ack状态为true。
    • node1会响应客户端,node1的ack状态为true
  8. 如果客户端接收到成功的状态,说明这个packet发送成功了。客户端会一直发送,直到当前块的所有packet发完。

  9. 如果客户端接收到最后一个packet的成功状态,说明当前block块传输完成,管道就会撤销,客户端会将这个传递完成的消息给NN,然后询问NN第二个块的存放位置,依次类推。

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

注意:客户端与要存放block块的DN节点进行连接,然后DN与它的副本节点建立管道连接。DataNode中的节点是可以相互通信的,也就是说客户端在DN1上保存block0,然后在DN4、DN6上保存这个块的副本。那么管道连接就是 客户端-->DN1-->DN4-->DN6(双向箭头,这里打不出来)

流程图

hdfs的宏观的写流程图

微观过程

在说微观过程之前我们要考虑两个问题:一是客户端怎么知道packet传输完毕的,二是如果在传输过程中packet丢了,例如断电怎么办。

那么如何保证packet发送的工程中不出错呢

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

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

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

    image-20220523222659558

    offsetInBlock:packet在block中的偏移量

    LastPacketInBlock:是否是一个Block块的最后一个packet,通过这个参数就可以解决前面的第一个问题

  4. 我们生成packet的速度肯定比我们将packet发送到DN上的速度要快,那么客户端就会产生很多的packet包,这时客户端会将多余的packet放入缓冲队列DataQueue。然后调用FSDataOutputStream的对象从缓冲队列调取packet写入DN。在取出的时候会将packet复制一份放入AckQueue,这类似于另一个缓冲队列。当客户端接收到packet写入完成的信息后(ack=true)会删除AckQueue缓冲区的对应packet。这样即使断电,正在传输中的packet丢失,由于AckQueue中对应的packet没有删除,说明这个packet没有传输成功,就会重新传输这个包,这样就解决了我们前面提到的第二个问题。

    HDFS写流程微观角度

读数据

前面的都是从客户端往DN写数据,现在讨论读数据的过程

  • 首先客户端发送请求到DFS,申请读某一个文件
  • DFS去NN查找这个文件的元数据信息
  • DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
  • 客户端获取文件的第一个block块信息,返回DN1 DN2 DN4
  • 客户端直接就近原则选择存放块的DN1
  • 依次类推其他block块的信息,知道最后一个块,将所有的block块合并成一个文件
  • 关闭FSDataInputStream

流程图

HDFS读流程

标签:DN,HDFS,ack,读写,packet,微观,block,客户端
From: https://www.cnblogs.com/bfy0221/p/16615234.html

相关文章

  • Java操作HDFS
    Java操作HDFS```javaimportorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.*;importorg.apache.hadoop.fs.permission.FsPermission;importj......
  • hadoop day3-java实现hdfs
    如何用javaApi的方式来操作hdfs 新建maven项目,然后建立一个子工程在父工程中引入依赖(maven中hadoophdfs,hadoopcommon和hadoopclient) <!--https://mvnrepository......
  • 读写锁的原理
    读写锁的相关知识读写锁是写独占,读共享,若有一个线程正在写,占了写锁,其他线程写锁读锁都拿不到。读写锁高2字节保存读锁,低2字节保存写锁。1、如果一个线程用读锁锁定了临......
  • 微服务治理热门技术揭秘:动态读写分离
      我们从应用的视角出发整理抽象了我们在访问、使用数据库时场景的一些稳定性治理、性能优化、提效等方面的实战经验,对于每一个后端应用来说,数据库无疑是重中之重,我们......
  • mycat读写分离、mysql主从的安装
    数据库安装手册目录数据库安装手册1、数据库安装1.1环境准备1.1.1关闭selinux1.1.2修改主机名1.1.3域名解析1.1.3时间同步1.2mysql安装1.2.1二进制包上传至服务器......
  • 2022.8.21 读写锁与阻塞队列
    9、读写锁   自定义的缓存,没有加锁,就会出现一个没有写入完成,另一个突然插进来的情况 packagecom.xing.rw; ​ importjava.util.HashMap; importjava.util.......
  • go 语言 chan读写数据
    示例demo51packagemainimport("fmt""time")funcsendData(chchanint){//把数据写到通道里fori:=0;i<20;i++{......
  • 大数据Hadoop之——HDFS小文件问题与处理实战操作
    目录一、背景1)小文件是如何产生的?2)文件块大小设置3)HDFS分块目的二、HDFS小文件问题处理方案1)HadoopArchive(HAR)2)Sequencefile3)CombineFileInputFormat4)开启JVM重用5)合并本......
  • 大数据Hadoop之——Hadoop HDFS多目录磁盘扩展与数据平衡实战操作
    目录一、概述二、HadoopDataNode多目录磁盘配置1)配置hdfs-site.xml2)配置详解1、dfs.datanode.data.dir2、dfs.datanode.fsdataset.volume.choosing.policy3、dfs.datanod......
  • 基于Go语言的xmind读写库,我主要用来把有道云笔记思维导图转为xmind
    项目地址xmind基于go语言的xmind接口使用方法参考:example本库主要加载xmind文件为json结构,保存文件时也用的json结构而不是xml结构本库只做了最基本的主题添加功能......