在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. 用sql语句写排名

    使用SQL语句求排名 表jh03有下列数据: name score aa 99 bb 56 cc 56 dd 77 ee 78 ff 76 gg 78 ff 50 1. 名次生成方式1 , Score ...

  2. (转载)C++创建对象的两种方法

    (转载)http://blog.sina.com.cn/s/blog_586b6c050100dhjg.html 在C++里,有两种方法创建对象: 方法一: ClassName object(para ...

  3. SQL Server数据库存在判断语句及系统表简介 转

    Transact-SQL Exists Sentences--判断数据库是否存在IF EXISTS(SELECT * FROM master.sysdatabases WHERE name=N'库名' ...

  4. jquery mobile 前言

    引用js: <link rel="stylesheet" href="../jquery.mobile-1.1.0/jquery.mobile-1.1.0.css& ...

  5. python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法

    dict中键只有在值和类型完全相同的时候才视为一个键: mydict = {1:1,':1} #此时mydict[1] 与 mydict['1']是两个不同的键值 dict的一些常用方法: clear ...

  6. HDOJ 1004题 Let the Balloon Rise strcmp()函数

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  7. ReentrantLock Condition 实现消费者生产者问题

    import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.ExecutorService; im ...

  8. POJ 3616 Milking Time 简单DP

    题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量. 详见代码 ...

  9. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

    第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器 ...

  10. curl测试puppet http api接口

    ---恢复内容开始--- 基于证书密钥对 curl --cert /etc/puppetlabs/puppet/ssl/certs/master.puppet.org.pem --key /etc/p ...