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 ...
随机推荐
- 统计难题 HDOJ --1251
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- zoj 3620 Escape Time II
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4744 Escape Time II Time Limit: 2 Seconds ...
- 给Apache加载rewrite模块后,服务器返回500错误,以及a2enmod命令
我的机子是Ubuntu. 今天想给url做一个rewrite,让url看起来更漂亮一点.在Apache配置文件(我的是 /etc/apache/apache2.conf)文件中已经把AllOverri ...
- 图片上传,支持同步/异步、预览(MVC、uploadify异步提交、js预览、ajaxSubmit异步提交)兼容大部分浏览器,含代码
图片上传代码,支持同步/异步和图片的预览 主要用了两种方式,可兼容大部分浏览器. 第一种使用uploadify异步上传,上传后返回图片路径显示到页面. 每二种使用ajaxSubmit异步上传,为兼容I ...
- JavaScript高级程序设计54.pdf
过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...
- php class中public,private,protected的区别,以及实例
一,public,private,protected的区别 public:权限是最大的,可以内部调用,实例调用等. protected: 受保护类型,用于本类和继承类调用. private: 私有类型 ...
- Apache 虚拟主机 VirtualHost 配置
虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同 ...
- hdoj 5443 The Water Problem【线段树求区间最大值】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5443 刷道水题助助兴 #include<stdio.h> #include<stri ...
- 如何在WIN7中关闭JAVA自动更新
在win7系统上面安装了JAVA JRE或JDK后,就会启动一个jusched,它会定时检查更新,每次开机都会推荐更新或者升级,可能有的朋友在win7下无论如何都关不掉java客户端的自动更新,而又不 ...
- linux系统垃圾清理
早上刚来,服务器出502错误了.我登上linux服务器,发现敲一个命令都提示没空间了, 用 df -h 查看了下 发现系统盘目录空间大小占用达到90%多,我觉得有些诧异, 难道是产生系统垃圾 然后用 ...