关于数据块、副本的介绍,请参考文章《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. HDU4305 Lightning

    There are N robots standing on the ground (Don't know why. Don't know how). Suddenly the sky turns i ...

  2. 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 2

    继续昨天的思路,今天先google了类似的实现domain0和domainU之间数据传输的方案 [Xen-devel] XenStore as a data transfer path?  这篇帖子讨 ...

  3. enum枚举类型

    枚举类型的实例是常量,且它们都用大写字母表示. 简单枚举例子: public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING } public cla ...

  4. hdu 4858(简单模拟)

    项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. LeetCode OJ--Combinations *

    https://oj.leetcode.com/problems/combinations/ 给一个集合,求个数为k的所有子集 递归调用,深搜 class Solution { public: vec ...

  6. js动态设置根元素的rem方案

    方案需求: rem 单位在做移动端的h5开发的时候是最经常使用的单位.为解决自适应的问题,我们需要动态的给文档的根节点添加font-size 值. 使用mediaquery 可以解决这个问题,但是每一 ...

  7. HDU 6251 Inkopolis(2017 CCPC-Final,I题,环套树 + 结论)

    题目链接 HDU 6251 题意 给出一个$N$个点$N$条边的无向图.然后给出$M$个操作,每个操作为$(x, y, z)$,表示把连接 $x$和$y$的边的颜色改成$z$. 求这张无向图中所有边的 ...

  8. Wildcard Matching - LeetCode

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  9. composer update/require slow when enable XDebug in CLI environment

    Recently I find there will be some issue to use composer command, which seems too slow to finish. Af ...

  10. 363. Max Sum of Rectangle No Larger Than K

    /* * 363. Max Sum of Rectangle No Larger Than K * 2016-7-15 by Mingyang */ public int maxSumSubmatri ...