在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的更多相关文章

  1. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  2. hibernate三种状态

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3380270.html 学过hibernate的人都可能都知道hibernate有三种状态,transien ...

  3. >hibernate的四种状态

    hibernate的四种状态 1.临时状态 与数据库中没有相对应的数据,也不在session的管理之中,一般是新new出来的对象 2.持久化状态 对象在session的管理中,最后会在事务提交后,在数 ...

  4. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  5. hibernate学习笔记之三 持久化的三种状态

    Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...

  6. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  7. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  8. Hibernate延迟加载、三种状态、脏检查 缓存

    一.持久化对象的唯一标识 java中按内存地址不同区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系 什么是OID? 解析: ...

  9. Hibernate的session缓存和对象的四种状态

    一.session缓存 说session缓存就得说到JAVA对象的生命周期,当没有任何引用指向一个对象时,对象则可以被gc回收,也就是生命周期结束了 而hibernate获取一个对象后,会将对象存入s ...

随机推荐

  1. JAVA用geotools读写shape格式文件

    转自:http://toplchx.iteye.com/blog/1335007 JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2) (后面添加对应geotoo ...

  2. 计算几何(容斥原理,圆交):HDU 5120 Intersection

    Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...

  3. [置顶]VC2013的一个bug

    [置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...

  4. Bzoj 3236: [Ahoi2013]作业 莫队,分块

    3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1113  Solved: 428[Submit][Status ...

  5. malloc的实现

    在做csapp的malloc实验,一开始是按照书上的隐式链表法,发现得分很低.这种方法确实很挫,需要遍历一遍以找到合适的空闲块.于是我想到<STL源码剖析>中stl的内存池,感觉应该可以用 ...

  6. JAVA Web项目的编码过滤器

    首先写一个EncodeFilter的过滤类: package com.djtu.wy.common; import java.io.IOException;import javax.servlet.F ...

  7. useradd、passwd、userdel

    useradd是新建用户 userdel -r 是删除用户 passwd是修改密码 groupadd是新建组 groupdel是删除组 useradd yonghu  为添加用户 echo " ...

  8. UVA 10557 XYZZY

    Problem D: XYZZY ADVENT: /ad�vent/, n. The prototypical computer adventure game, first designed by W ...

  9. JSP实现数据库(MySQL)查询——Java Web练习(二)

    1.创建数据库表student(数据库test01) 2.修改success.jsp页面,修改后的页面整体代码如下: <%@ page language="java" imp ...

  10. AppiumLibrary实用函数介绍

    1. 点击按钮: Click Button index_or_name Click button 实例:Click Button index=0 作者通过实验发现在安卓手机应用测试中,name这个属性 ...