HDFS的写数据流程以及异常写数据流程

一、HDFS的写数据流程





①服务端启动HDFS中的NN和DN进程

②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件

③NN处理请求,检查客户端是否有权限上传,路径是否合法等

④检查通过,NN响应客户端可以上传

⑤客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回

⑥客户端根据返回的DN节点,请求建立传输通道客户端向最近(网络举例最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功

⑦客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!每个节点在收到packet后,向客户端发送ack确认消息!

⑧一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块

⑨第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!
客户端关闭输出流

二、异常写流程(重要)

①-⑥见上

⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。
每个节点在收到packet后,向客户端发送ack确认消息!
如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!
假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到dataQuene。
重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!
只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!
NN会自动维护副本数!

原文地址:https://www.cnblogs.com/ssshhh/p/12105466.html

时间: 2024-10-31 21:21:57

HDFS的写数据流程以及异常写数据流程的相关文章

Activiti系列:是否可以让某些流程的信息写到历史表,而另外一些不写?

一.起因 打算使用activiti的定时启动事件来定时启动流程,然后再在该流程中针对每个用户启动另外一个流程实例来计算每个用户的实时账单,系统的用户数一般是1000~2000(此处假设是2000),实时账单一般每小时计算一次,那么一天的数据量就是 2000x24=48000,一个月就是150w,一年就是1800w,这样的记录数对于activiti的历史表来说就有点多了,很怀疑他在这样的数据量下是否还可以跑得比较顺畅.我想activiti设计的初衷不是用来做这种大规模的自动触发的.没有人工参与的流

大数据学习之手写MR框架(WordCount程序开发)08

简介:这里先手写一个MR程序,大致实现一个单词计数程序.帮助后面学习MapReduce组件. 1:先自定义一个Mapper接口 package it.dawn.HDFSPra.HandWritingMR; /** * @author Dawn * @date 2019年4月30日23:28:00 * @version 1.0 * * 思路? * 接口设计 */ public interface Mapper { //通用方法 public void map(String line,Context

vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件

vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件.iScroll不仅仅是 滚动.它可以处理任何需要与用户进行移动交互的元素.在你的项目中包含仅仅4kb大小的iScroll,你的项目便拥有了滚动,缩放,平移,无限滚动,视差滚动,旋转功能.iScroll的强大毋庸置疑,本人也非常欢迎大家使用iScr

OR1200数据Cache的通写、回写应用举例

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 13.3 DCache中的特殊寄存器 在DCache中定义了三个特殊寄存器:DCBFR. DCBIR.DCBWR,这三个寄存器都是只可写寄存器,即只能使用指令l.mtspr操作这三个特殊寄存器.其中在通写法策略下只能使用DCBIR.DCBFR,在回写法策略下可以使用全部三个特殊寄存器.各特殊寄存器的含义如表13.1所示,格式都如表13.2所示. 当使用指令l.mtspr向数据缓存块刷新寄存器DCBFR中写入地址时,有如下几种情况: 如果该

springmvc-高级参数绑定-映射-异常-json数据交互-拦截器

1.1. 高级参数绑定 1.1.1. 复制工程 把昨天的springmvc-web工程复制一份,作为今天开发的工程 复制工程,如下图: 粘贴并修改工程名为web2,如下图: 工程右键点击,如下图: 修改工程名,如下图: 1.1.2. 绑定数组 需求 在商品列表页面选中多个商品,然后删除. 需求分析 功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品id删除商品信息. 我们演示可以获取id的数组即可 Jsp修改 修改i

JAVA中的异常(异常处理流程、异常处理的缺陷)

异常处理流程 1)首先由try{...}catch(Exception e){ System.out.println(e); e.printStackTrace(); }finally{...}结构 2)当JVM遇到异常时,会产生一个Exception对象 或 继承自Exception的子类的对象. 3)将异常对象向上层(调用它的代码块)抛出,知道碰到一个catch块(作相应处理) 或 一直抛到了最外层(导致程序异常终止).(并停止异常之后的代码的执行,但是finally块中的代码还会执行!换句

ARMv7用户层发生指令异常的处理流程?是否每个进程都有一个APSR的副本?

1.用户层发生指令异常的处理流程? 用户层程序正在执行时,遇到未定义的指令(ARM不是别的指令)或者SWI软件中断指令(产生系统调用),就会产生异常,这里以未定义指令异常为例进行说明: 一旦出现未定义指令异常,CPU会自动做如下操作: (1)未定义模式(ARM其中运行模式的一种)下对应的lr(即R14)寄存器保存当前发生异常的指令下一条指令的地址.例如,在用户态有A B C 三条指令,指令A发生未定义指令异常,则指令B的地址就会由CPU保存到未定义模式下的lr寄存器中,用于异常返回. (2)CP

大数据技术之_18_大数据离线平台_01_项目开发流程+大数据常用应用/分析平台/业务处理方式+数据分析平台的数据来源+数据处理的流程+项目集群的规模+需求分析+技术架构/选型

一.项目开发流程1.1.项目调研1.2.项目需求分析1.3.方案设计1.3.1.概要设计1.3.2.详细设计1.4.编码实现1.4.1.单元测试1.4.2.集成测试1.4.3.压力测试1.4.4.用户测试二.大数据常用应用2.1.数据出售2.2.数据分析2.2.1.百度统计2.2.2.友盟2.2.3.其他统计分析组织2.3.搜索引擎2.3.1.solr2.3.2.luence2.3.3.luence & solr 对比2.4.推荐系统(高数)2.4.1.技术2.4.2.算法2.5.精准营销2.5

C++作业代写,C++代写,代写C++,编程代写(微信leechanx)

C++作业代写,C++代写,代写C++,编程代写(微信leechanx) 概念区分之线程安全VS可重入 可重入:当被多个线程调用的时候,不引用.操作任何共享数据. 线程安全:被多个线程并发调用,最终会产生正确的结果. 可重入->由于绝对不引用任何共享数据->所以肯定是线程安全的. 线程安全->如果引用了共享数据,即使最终结果正确,也不是可重入的. 虽然引用了共享数据,但最终结果是正确的 这种引用了共享数据的线程是怎么保证安全的呢?->同步,唯一手段! 线程不安全如何改为线程安全?