Hadoop_Block的几种状态_DataNode
在Hadoop 2.0 中HDFS 引入了 append 和 hflush 功能之后,
需要为 数据块增加新的状态 来尽最大可能的保证数据的一致性。
参阅文档:
http://files.cnblogs.com/inuyasha1027/appendDesign3.pdf
http://stackoverflow.com/questions/10121705/differences-between-hflush-hsync-apis-in-hdfs
为了更好地区分 位于DataNode上面的 block 与位于NameNode上面的 block,
我们将位于DataNode上面的 block 称之为 replica,
位于NameNode上面的 block 称之为 block。
在 append 和 hflush 功能增加之前, 在DataNode上面的 replica 仅处于
1.finalized 2.temporary 这两种状态。
当一个 replica 首次被创建的时候, 它在Datanode上面的状态是 temporary的。
当接收到来自于客户端的 close 命令的时候, 也就是不会向 该 replica 中写入任何数据的时候,
这个 块(replica)的状态将会从 temporary 状态转换 为 finalized状态。
对于处于temporary状态的replica (位于Datanode上的数据块)在Datanode重新启动的时候,
将会被从相关的路径中进行移除。 由于HDFS为处于 under-construction 状态的blocks
要尽最大努力提高它们的数据持久性,所以在 append 和 hflush 功能 被添加之前,这个是可以接受的。
("这个":指的是 在datanode restart 之后,将会把处于temporary状态的 replica全部删除,
但是,试想一下,增加 追加 (append) 功能之后,待 datanode重启之后,
就莫名其妙的把 处于temporary 状态的 replicas 给删除,会造成很多数据丢失的)
但是,在引入append 和 hflush 功能之后,这么做就行不通了。
因为 HDFS 需要为 处于 under-construction状态下的保存了在append 操作之前的 data 的blocks
提供高保证的数据持久性 以及尽最大可能为hflush 中的 data提供 持久性。
所以与先前不同,需要改进的地方就是,即便是 Datanode 重新的启动,也要尽量保证 这些处于
temporary状态的 replicas 也是不会被 removed的 而是 被 preserved 的。
下面就介绍一下,在Datanode上面,在引入 append /hflush 功能之后,所新增的
replica的各种状态
1. Finalized:/完成状态
处于这种状态的 replica 有着固定不变的 bytes。 处于 finalized状态的 replica 是不允许
向其中写入数据的,除非对他执行appen操作 使其重新开启(reopened)。
处于finalized 状态的 block中的 data 和 meta data 数据是相互匹配的。
这个 replica 在不同地方的 冗余备份 和 该 replica 的 replica ID是相同的。
但是, 生成时间戳 并不是保持不变的。
2. Rbw(Replica Being Written to):/ 等待写入状态
一旦一个 replica 被创建 或是被追加(appended),
它就会转换为 rbw 状态。
处于 rbw 状态的replica 是允许 数据被写入的。
在文件系统中,一个文件 对应的是一个 INodeFile 实体, 而该INodeFIle实体中有一个LocatedBlock
的数组,该数组中存放的是 位于DataNode上面的所有 存储文件block的分布情况,
如果该文件正处于被追加状态的话,那么一定是向 该文件对应的INodeFile中的 LocatedBlock 中
的最后一个 block进行写入处理, 这样的话, 这个处于 最后一个 位置的block的状态 一定是
rbw状态的。 上面提到的block 实质上指的是 replica, 由于该文件没有被写完,所以文件长度未定,
该块 replica 的长度也是 未定的。
所以对于存放在 物理介质上的 块中的 data 和meta data 中的数据时不匹配的。
位于不同节点 拥有相同 ID 的 冗余 块 多多少少 与 该块中的数据 也是不一致的。
处于 rbw 状态下的replica 中的部分数据duireaders 是可见的。
为了防止任何错误的发生, 在rbw 状态下的 replica 中的数据 会尽量的被保留的。
3. Rwr (Replica waiting to be recovered):/ 等待恢复状态
如果一个Datanode 死掉 或是重新启动的话, 处于该datanode上面的所有 rbw 状态的 replicas
都会从 rbw 状态转换 为 rwr 状态。
Rwr 状态下的 replicas 不会出现在 任何 pipeline中, 因此 也不会接受任何新的写入数据。
对于处于Rwr 状态下的replicas 要么成为 过期数据,
要么参与一次 租约恢复操作(如果和datanode 建立 租约(lease)的client 同样挂掉的话) .
4. Rur (Replica Under Recovery ): /处于恢复状态
当一个 replica 开始恢复直到 租约到期的时候,该replica 将会转为 state 状态。
5. Temporary: 一个处于temporary状态的 replica 同样 也是 当该replica
是 under-construction 状态的时候, 但是有所不同的是:
rbw: 对应的是 client 向 Datanode中写操作而造成的 该replica 是 under-construction
而 temporary: 对应的是 datanode之间的冗余备份 或是 整个集群的负载均衡操作 造成的。
处于 temporary 状态的 replica 与 rbw 状态 的replica 中共享着很多的 属性,
但是还是有所不同
不同1.处于 temporary 状态的 replica 中的 数据对任何 reader 都是 不可见的。
不同2.处于temporary 状态的 replica 如果 创建失败 或是 该replica 所在的 datanode 重启的话,
该 replica 会被 删除,而 rbw 会从 rbw 状态转换为 rwr 状态即等待被 恢复状态。
上述就是,位于 datanode上面的block : replica 的几种状态。
在 DataNode的数据目中共有三个子目录:
1. current
在这个目录中 保留着 所有处于finalized状态的replicas
2.tmp
在这个目录中保留着 处于temporary状态的replicas,
3.rbw
在这个目录下 保留着 处于 rbw、rwr和rur 状态的replicas。
-----------------------------------------------------------------------
所以,在HDFS接收到来自DFS(client端)创建 replica 的消息, 创建一个replica之后,
该replica首先是被存放在rbw 目录下面的。
而当一个replica 首次被创建,是用于 datanodes 之间的冗余 备份 或是 负载均衡的目的的话,
这个replica 将会被 存放到tmp 目录下面。
一旦一个 replica 被完成之后,即 finalized ,它就会被移动 到 current 目录的下面了。
----------------------------after restart--------------------------------------------
当一个DataNode重新启动之后,位于tmp 目录下面的 replicas将会被删除;
而位于 rbw 目录下面的所有 replicas 将会 被转换为rwr状态;
而位于current 目录下面的 replicas 将会 被正常 加载 且 为 finalized 状态。
下图为 datanode 上面的 block(replica )的状态转换图:
Hadoop_Block的几种状态_DataNode的更多相关文章
- Hibernate 系列 07 - Hibernate中Java对象的三种状态
引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...
- hibernate三种状态
转自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transien ...
- >hibernate的四种状态
hibernate的四种状态 1.临时状态 与数据库中没有相对应的数据,也不在session的管理之中,一般是新new出来的对象 2.持久化状态 对象在session的管理中,最后会在事务提交后,在数 ...
- Hibernate的三种状态及对象生命周期
理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...
- hibernate学习笔记之三 持久化的三种状态
Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- Hibernate中Java对象的三种状态
Hibernate中Java对象的三种 ...
- Hibernate延迟加载、三种状态、脏检查 缓存
一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...
- Hibernate的session缓存和对象的四种状态
一.session缓存 说session缓存就得说到JAVA对象的生命周期,当没有任何引用指向一个对象时,对象则可以被gc回收,也就是生命周期结束了 而hibernate获取一个对象后,会将对象存入s ...
随机推荐
- JAVA用geotools读写shape格式文件
转自:http://toplchx.iteye.com/blog/1335007 JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2) (后面添加对应geotoo ...
- 计算几何(容斥原理,圆交):HDU 5120 Intersection
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...
- [置顶]VC2013的一个bug
[置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...
- Bzoj 3236: [Ahoi2013]作业 莫队,分块
3236: [Ahoi2013]作业 Time Limit: 100 Sec Memory Limit: 512 MBSubmit: 1113 Solved: 428[Submit][Status ...
- malloc的实现
在做csapp的malloc实验,一开始是按照书上的隐式链表法,发现得分很低.这种方法确实很挫,需要遍历一遍以找到合适的空闲块.于是我想到<STL源码剖析>中stl的内存池,感觉应该可以用 ...
- JAVA Web项目的编码过滤器
首先写一个EncodeFilter的过滤类: package com.djtu.wy.common; import java.io.IOException;import javax.servlet.F ...
- useradd、passwd、userdel
useradd是新建用户 userdel -r 是删除用户 passwd是修改密码 groupadd是新建组 groupdel是删除组 useradd yonghu 为添加用户 echo " ...
- UVA 10557 XYZZY
Problem D: XYZZY ADVENT: /ad�vent/, n. The prototypical computer adventure game, first designed by W ...
- JSP实现数据库(MySQL)查询——Java Web练习(二)
1.创建数据库表student(数据库test01) 2.修改success.jsp页面,修改后的页面整体代码如下: <%@ page language="java" imp ...
- AppiumLibrary实用函数介绍
1. 点击按钮: Click Button index_or_name Click button 实例:Click Button index=0 作者通过实验发现在安卓手机应用测试中,name这个属性 ...