关于数据块、副本的介绍,请参考文章《HDFS源码分析之数据块Block、副本Replica》

一、数据块状态BlockUCState

数据块状态用枚举类BlockUCState来表示,代码如下:

  1. /**
  2. * States, which a block can go through while it is under construction.
  3. * 状态,一个数据块在under construction(即构建)过程中所应有的状态
  4. */
  5. static public enum BlockUCState {
  6. /**
  7. * Block construction completed.<br>
  8. * The block has at least one {@link ReplicaState#FINALIZED} replica,
  9. * and is not going to be modified.
  10. * 数据块构建完成状态。这个数据块含有至少一个副本,并且不会被修改。
  11. */
  12. COMPLETE,
  13. /**
  14. * The block is under construction.<br>
  15. * It has been recently allocated for write or append.
  16. * 数据块处于构建状态下。它最近被分配,用于write或append。
  17. */
  18. UNDER_CONSTRUCTION,
  19. /**
  20. * The block is under recovery.<br>
  21. * When a file lease expires its last block may not be {@link #COMPLETE}
  22. * and needs to go through a recovery procedure,
  23. * which synchronizes the existing replicas contents.
  24. * 数据块处于恢复阶段状态。
  25. * 当一个文件租约到期,它的最后一个数据块可能不是COMPLETE状态,并且需要经历一个恢复过程,它将同步存在的副本目录。
  26. */
  27. UNDER_RECOVERY,
  28. /**
  29. * The block is committed.<br>
  30. * The client reported that all bytes are written to data-nodes
  31. * with the given generation stamp and block length, but no
  32. * {@link ReplicaState#FINALIZED}
  33. * replicas has yet been reported by data-nodes themselves.
  34. *
  35. * 数据块已被提交状态
  36. * 随着获取到给定的时间戳和数据块长度,客户端汇报所有的字节均已写入数据节点,但是还没有达到FINALIZED状态的副本尚未被数据节点汇报,。
  37. */
  38. COMMITTED;
  39. }

名字节点NameNode内存中文件系统树中的数据块一共有四种状态,分别如下:

1、COMPLETE:数据块构建完成状态。这种状态下,这个数据块含有至少一个副本,并且不会被修改。

COMPLETE状态下,数据块的大小和时间戳均不会再发生变化,而且名字节点NameNode已经至少收到一个数据节点DataNode汇报的FINALIZED状态的副本。同时,该状态下的block会在NameNode内存中保存finalized状态副本replica的位置locations,而当文件的所有block都是COMPLETE状态的,文件才可以被关闭。

2、UNDER_CONSTRUCTION:数据块处于构建阶段状态下。它最近被分配,用于write或append。

UNDER_CONSTRUCTION状态下,文件刚刚被create,或者正在被append,此时的数据块正在被持续的写入,其大小和时间戳都是可以更改的,但是这种状态的下的数据块对于读是可见的,具体能读多少则是由客户端询问DataNode得知的,该block的所有副本replica接收到的数据大小都会大于等于这个可读的数据大小,这样,才能保证所有的副本replica均可用。

3、UNDER_RECOVERY:数据块处于恢复阶段状态。当一个文件租约到期,它的最后一个数据块可能不是COMPLETE状态,并且需要经历一个恢复过程,它将同步存在的副本目录。
        当文件正在被写入时,客户端由于某种原因异常退出,正在被写入的最后一个数据块block处于UNDER_CONSTRUCTION状态下,客户端租约lease就可能超期,此时recovery和block都分别需要继续recovery,而处于recovery过程中的数据块block的状态就称为UNDER_RECOVERY。

4、COMMITTED:数据块已被提交状态。随着获取到给定的时间戳和数据块长度,客户端汇报所有的字节均已写入数据节点,但是还没有达到FINALIZED状态的副本尚未被数据节点汇报。

写文件过程中,每次写完一个数据块,申请另外一个数据块,或者当文件写入完毕而关闭时,都会将上一个数据块(关闭时为最后一个数据块)提交,即数据块状态从UNDER_CONSTRUCTION到COMMITTED,此时客户端通过流式数据管道已将全部数据发送给目标节点列表中的全部数据节点并收到确认的信号,但是NameNode尚未接收到任何一个DataNode汇报FINALIZED状态的副本replica。
        二、数据块副本状态ReplicaState

数据块副本状态用枚举类ReplicaState来表示,代码如下:

  1. /**
  2. * Block replica states, which it can go through while being constructed.
  3. * 数据块副本状态,数据块副本被构造过程中所应有的状态
  4. */
  5. static public enum ReplicaState {
  6. /** Replica is finalized. The state when replica is not modified. */
  7. // 副本为完成状态,不会被修改的状态
  8. FINALIZED(0),
  9. /** Replica is being written to. */
  10. // 副本正在被写入状态
  11. RBW(1),
  12. /** Replica is waiting to be recovered. */
  13. // 副本正在等待被恢复状态
  14. RWR(2),
  15. /** Replica is under recovery. */
  16. // 副本处于恢复阶段状态
  17. RUR(3),
  18. /** Temporary replica: created for replication and relocation only. */
  19. // 仅为数据块复制而创建的临时副本状态
  20. TEMPORARY(4);
  21. private final int value;
  22. private ReplicaState(int v) {
  23. value = v;
  24. }
  25. public int getValue() {
  26. return value;
  27. }
  28. public static ReplicaState getState(int v) {
  29. return ReplicaState.values()[v];
  30. }
  31. /** Read from in */
  32. public static ReplicaState read(DataInput in) throws IOException {
  33. return values()[in.readByte()];
  34. }
  35. /** Write to out */
  36. public void write(DataOutput out) throws IOException {
  37. out.writeByte(ordinal());
  38. }
  39. }

数据节点DataNode内存中数据块副本一共有五种状态,分别如下:

1、FINALIZED:副本为完成状态,不会被修改的状态;

FINALIZED状态下的副本,数据已被完全写入,数据块副本大小及时间戳均不会再发生变化。此时,就等着其所在数据节点DataNode进行数据块汇报,将该数据块副本汇报给名字节点NameNode。

2、RBW:副本正在被写入状态;

此时数据块副本刚刚被create或者append,还处于写状态下的管道流中,正在被写入。但是数据块副本内的数据对于读还是可见的。

3、RWR:副本正在等待被恢复状态;

如果一个数据节点DataNode挂掉并且重启之后,所有处于写状态RBW的副本replica都会被转换为RWR状态。RWR的replica不会出现在数据流管道中,结果就是等着Lease恢复。

4、RUR:副本处于恢复阶段状态;

数据块副本写入过程中,客户端异常退出,租约Lease过期后,租约Lease和数据块副本replica需要被恢复,处于恢复的状态称为RWR。

5、TEMPORARY:仅为数据块复制而创建的临时副本状态;

集群负载均衡,或者数据块副本数需要恢复到正常水平情况下数据节点之间进行数据块副本复制时,需要传输replica,此时的replica就处于TEMPORARY状态,和RBW不同的是,它对读是不可见的,DataNode如果重启直接删除处于TEMPORARY状态的replica。

HDFS源码分析之数据块及副本状态BlockUCState、ReplicaState的更多相关文章

  1. HDFS源码分析之数据块Block、副本Replica

    我们知道,HDFS中的文件是由数据块Block组成的,并且为了提高容错性,每个数据块Block都会在不同数据节点DataNode上有若干副本Replica.那么,什么是Block?什么又是Replic ...

  2. HDFS源码分析数据块汇报之损坏数据块检测checkReplicaCorrupt()

    无论是第一次,还是之后的每次数据块汇报,名字名字节点都会对汇报上来的数据块进行检测,看看其是否为损坏的数据块.那么,损坏数据块是如何被检测的呢?本文,我们将研究下损坏数据块检测的checkReplic ...

  3. HDFS源码分析数据块校验之DataBlockScanner

    DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独 ...

  4. HDFS源码分析数据块复制监控线程ReplicationMonitor(二)

    HDFS源码分析数据块复制监控线程ReplicationMonitor(二)

  5. HDFS源码分析数据块复制监控线程ReplicationMonitor(一)

    ReplicationMonitor是HDFS中关于数据块复制的监控线程,它的主要作用就是计算DataNode工作,并将复制请求超时的块重新加入到待调度队列.其定义及作为线程核心的run()方法如下: ...

  6. HDFS源码分析心跳汇报之数据块汇报

    在<HDFS源码分析心跳汇报之数据块增量汇报>一文中,我们详细介绍了数据块增量汇报的内容,了解到它是时间间隔更长的正常数据块汇报周期内一个smaller的数据块汇报,它负责将DataNod ...

  7. HDFS源码分析心跳汇报之数据块增量汇报

    在<HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程>一文中,我们详细了解了数据节点DataNode周期性发送心跳给名字节点NameNode的BPServiceAct ...

  8. HDFS源码分析之UnderReplicatedBlocks(一)

    http://blog.csdn.net/lipeng_bigdata/article/details/51160359 UnderReplicatedBlocks是HDFS中关于块复制的一个重要数据 ...

  9. HDFS源码分析之UnderReplicatedBlocks(二)

    UnderReplicatedBlocks还提供了一个数据块迭代器BlockIterator,用于遍历其中的数据块.它是UnderReplicatedBlocks的内部类,有三个成员变量,如下: // ...

随机推荐

  1. 控制台或Winform程序中如何编码或解码Server.URLEncode

    原文发布时间为:2010-07-10 -- 来源于本人的百度文章 [由搬家工具导入] 在Asp.net中可以使用Server.HTMLEncode和Server.URLEncode 将文本或URL的特 ...

  2. MVC3 中使用 Ajax.ActionLink Ajax.BeginForm

    原文发布时间为:2011-05-01 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/dd381533%28VS.98% ...

  3. 基于VUE开发项目

    前言 最近由于公司需要,需要写一个相对来说比较大型的后台管理系统.为了保证管理系统操作体验较为舒适并且项目后期益于维护,最后决定基于VUE全家桶来开发一个高度组件化的单页SPA应用. 技术选型 vue ...

  4. Elasticsearch本地环境安装和常用操作

    本篇文章首发于我的头条号Elasticsearch本地环境安装和常用操作,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干 ...

  5. Java NIO中的FileLock(文件锁)

    FileLock,文件锁. 文件锁在OS中很常见,如果多个程序同时访问.修改同一个文件,很容易因为文件数据不同步而出现问题.给文件加一个锁,同一时间,只能有一个程序修改此文件,或者程序都只能读此文件, ...

  6. 使用nginx实现的灰度发布思路研究(待实践)

    灰度发布也叫 A/B 测试,原理是一套系统在实现了负载均衡,全国节点都部署了系统之后,可以在新功能上线后,让一小部分用户先使用,从中收集使用信息来做对比和发现bug,及时调整,最终分发到全国的节点. ...

  7. vs2010下如何调试带输入参数的程序

    当main函数的输入参数为空时,我们可以很方便的通过设置断点,单步运行的方法调试,可是如果需要调试的是有输入参数的程序该怎么办呢?最终还是让我找到了: 英文版:Project -> Proper ...

  8. 【音乐App】—— Vue-music 项目学习笔记:用户个人中心开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 歌曲列表 收藏歌曲 一.用 ...

  9. CF - 420B - Online Meeting(思维)

    题意:n 个人參加线上会议.某经理记录了中间一段时间的 m 条上下线记录(1 ≤ n, m ≤ 105).+ 表示上线,- 表示下线. leader是指仅仅要有人在线,他都在线的人.求全部可能的lea ...

  10. Web自动化测试框架改进

    Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...