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

HDFS的读写流程

时间:2024-11-03 22:30:53浏览次数:3  
标签:HDFS 流程 ack 读写 packet 队列 NameNode 节点 客户端

HDFS的读写流程

写数据

1、宏观

hdfs写数据宏观流程

1、客户端发起请求到NameNode,调用Hadoop中的一个类叫做DistributedFileSystem创建对象,再利用这个对象通过RPC通信协议调用NameNode去创建一个没有blocks关联的新文件。在创建之前NameNode会做各种校验:比如该文件是否存在,客户端有无权限去创建...如果校验通过,NameNode就会记录下新文件,否则传出IO异常。

2、 如果校验成功,那就会返回给客户端一个FSDataOutoutStream对象(相当于输出流),客户端可以利用这个对象去写数据。客户端开始对文件进行切分,切分成一个个block块。

3、客户端写数据之前要想NameNode询问这个新些block最适合存储的在哪几个datanode里,要向那个节点上写入数据。假设所创建的文件叫a.txt,在NameNode校验成功后,会进行一系列分析生成a.txt的文件信息(副本信息与存放节点的信息)。而且在NameNode分析计算出来哪几个节点适合去存储这个新文件及其副本,在这几个节点之间会生成一个通道pipeline.DataStreamer【pipeline.DataStreamer是通过数据流来处理的,DataStreamer是Hadoop中的一个类,用于接受数据队列data queue】

4、客户端从NameNode得到信息后会将数据打包成一个个packet,一个block块中有2048个packet,一个packet的大小为64kb。客户端会通过机架感知获取最近的子节点建立连接通道。客户端利用NameNode的FSDataOutoutStream将packet发送到第一个子节点上。然后在第一个子节点中,然后根据副本信息将packet通过各个子节点之间的pipeline通道发送到各个子节点上去(由NameNode分析计算得出的节点),当发送到最后一个子节点时,子节点会方向沿着pipeline通道发送一个ack值一直到第一个子节点,最后将这个ack值发送给客户端,客户端以ack值来判断来各个节点已经收到了第一个packet。由此客户端开始已同样的方法发送第二个packet,以此类推。

5、当文件中最后一个block块中 最后一个package返回的ack值到达客户端,客户端关FSDataOutoutStream流,子节点之间的pipeline通道断开,HDFS写数据完毕

宏观写数据角度引出的思考:

package在传输过程中,若突然断电或其他异常导致传输中断,有可能会导致数据丢失
客户端怎么知道当前的ack确认值表示的是最后一个package

2、微观

hdfs写数据微观角度

1、当客户端要上传一个文件时,要先将文件切分为一个个block块,一个block块又分为一个个packet。然后通过FSDataOutoutStream将一个个packet发送到最近的子节点上。

2、一个package由两大部分构成,packet header和packet data。package hearder中有有pkt Len,offset In Pkt,SeqNo,Last Packet In Block,Data Len。Last Packet In Block就是存储是不是最后一个packet的信息true或者false。packetdata又分为ChunkData和Chunk Check sum,每个Check sum是负责校验每个Data是否完整的。

3、当拿到第一个packet时,将packet放入数据队列data queue中,后续的packet依次放入队列中,除了数据队列还有一个确认队列ack queue,当packet要通过FSDataOutoutStream传输给各个子节点之前,客户端会在数据队列中拷贝一份给确认队列然后再发送给第一个子节点,第一个子节点再根据副本信息拷贝给第二个子节点,第二个再拷贝给第三个,节点之间是通过pipeline通道进行数据传输,当packet到达最后一个子节点时,最后一个子节点再拷贝一份packet命名为ack值反向沿着pipeline通道传输给客户端。实际上是传输到客户端中的确认队列,当确认队列收到ackt值时将原本的拷贝的packet删除,至此第一个packet传输完毕。

4、当packet在传输过程中发生异常无法正常传输时,客户端中的确认队列没有收到ack值,然后客户端就会认为在传输过程中出现了异常,然后各个节点删除该packet最后再重新传输。

标签:HDFS,流程,ack,读写,packet,队列,NameNode,节点,客户端
From: https://www.cnblogs.com/qianzhiqiang798/p/18524132

相关文章

  • 程序流程结构——循环结构||跳转语句
    一、循环结构(一)while循环语句作用:满足循环条件,执行循环语句语法:while(循环条件){循环语句};解释:只要循环条件为真,就执行循环语句例:当我们想要输入0~9这串连续的数字时,我们先创建初始数值为0,利用while循环输出数字,循环条件写在括号中,我们输入的数字为0~9,故(num<10),num++=nu......
  • 微信小程序的开发流程
    微信小程序开发流程1.注册微信小程序账号进入微信公众平台(mp.weixin.qq.com),选择小程序的账号类型按照流程进行注册。注意每个邮箱只能注册一个账号。2.下载开发工具使用账号登录微信公众平台,在开发->开发设置->开发者ID中找到小程序的AppID。下载微信开发者工具,进入小......
  • Docker | 创建私有库并了解将项目放入和拉取到私有库的流程
    搭建私有库并推送镜像DockerRegistry1.下载Dockerregistry镜像2.运行私有库Registry,相当于本地有个私有Dockerhub3.ubuntu增加ifconfig命令并生成新镜像⭐4.curl验证私服库上有什么镜像什么是curl?5.将新镜像修改符合私服规范的Tag6.修改配置文件使之支持http7.......
  • 入门/粗略版开发流程
    开发流程Q:如果我要我的团队开发一个web翻译系统,集成了大语言模型和OCR技术,前端用html,js在vscode分别开发前台用户使用的系统和后台管理的系统,不使用框架;后端在golang开发,使用fetchapi,mongoDB数据库。写完代码后,前端使用vite构建静态文件,后端使用docker生成镜像文件,然后都放在......
  • Flink历史服务器History Server部署:创建hdfs存储目录、启动和停止
    运行Flinkjob的集群一旦停止,只能去yarn或本地磁盘上查看日志,不再可以查看作业挂掉之前的运行的WebUI,很难清楚知道作业在挂的那一刻到底发生了什么。如果我们还没有Metrics监控的话,那么完全就只能通过日志去分析和定位问题了,所以如果能还原之前的WebUI,我们可以通......
  • 本科阶段讲个透(全)|保研/推免(流程、时间、前期必要的准备、心得感悟)、考试学习(思政类、
    文章目录一、前言二、保研/推免2.1保研流程2.2保研的前期准备2.3保研心得2.4如何择校三、考试学习(学习方法、学习时间、记忆方法、各科的学习大致规划)四、科研竞赛(途径、队友、机会)五、志愿六、社会工作七、就业7.1为什么考虑就业7.1明白自己具体做什么7.2招聘看......
  • 5G核心网之UE初始注册关键流程分析
    1.UE初始注册的关键流程为:(1)UE向AMF发送注册请求(2)AMF查询NRF得到AUSF,获取归属地的AUSF可以发起鉴权请求(3)获取到AUSF地址后,AMF请求AUSF对UE进行鉴权,AUSF通过UDM获取鉴权向量返回给AMF(4)AMF对UE合法性进行鉴权,UE通过鉴权向量计算得到鉴权结果RES转发到AMF(5)AMF首先站在拜访地对UE......
  • 员工借款出差后回来报销的流程和会计处理方法如下‌:
     ‌填写《出差计划申请表》‌:出差前,员工需要填写《出差计划申请表》,明确出差人员、部门、职务、申请日期、到达地点、预计出差天数、计划出差日期和预计借款金额等信息,并报部门经理审批同意‌12。‌借款和报销流程‌:‌借款‌:员工填写“现金借款单”,经相关人员签字后,持借......
  • 一文搞懂JDBC全流程(含MySQL安装和JDK下载)
    前言:1.了解问题1:什么是JDBC?JDBC全称:JavaDatabaseConnectivity,即Java数据库连接JDBC是Java提供的一组独立于任何数据库管理系统的API。Java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现类封装成jar文件,也就是数据库驱动jar包。学习JDBC,充分体现了面向接口......