关于数据块、副本的介绍,请参考文章《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. wap提交表单

    原文发布时间为:2010-08-31 -- 来源于本人的百度文章 [由搬家工具导入] <%@ page contentType="text/vnd.wap.wml" page ...

  2. 【字符集及字符编码】UTF-8、UTF-16和UTF-32

    UTF-32 用 4 个字节存储每一个字符,以保证能把 UCS 完全表达出来.但实际上 UCS 的字符数量根本不需要用 32 位表示,UTF-32 极大地浪费了空间.另外,由于组合字符的存在,定长表示 ...

  3. [wxPython学习]wx.CallAfter和wx.FutureCall

    [wxPython学习]wx.CallAfter和wx.FutureCall 今天才学到的两个wxPython中的函数:wx.CallAfter和wx.FutureCall.这是两个无关的函数,但又多 ...

  4. Facebook为什么使用PHP编程语言?

    当日本计算机科学家松本行弘决定创造一种名叫 Ruby (这种技术支撑了 Twitter.Hulu以及其他许多现代 Web 流行网站) 的程序语言时,他是从 1966 年一部名为 Babel-17 的科 ...

  5. 洛谷——P1462 通往奥格瑞玛的道路

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  6. SQLITE3 --详解

    由于我主要负责我们小组项目数据库模块的部分所以这几天都一直在研究在iphone中最为常用的一个简单数据库sqlite,自己也搜集很多资料,因此在 这里总结一下这几天的学习成果: Sqlite 操作简明 ...

  7. tensorflow 运行 python convolutional.py时

    Traceback (most recent call last): File "convolutional.py", line 326, in <module> tf ...

  8. NOIP 2014 D2T3 解方程 Hash大法好

    题目大意:给定高次方程an*x^n+...+a1*x^1+a0*x^0=0 求[1,m]区间内有多少个整数根 ai<=10^10000.m<=100W 懒得高精,考场上写的long dou ...

  9. 【京东个人中心】——Nodejs/Ajax/HTML5/Mysql爬坑之功能与数据分析

    一.引言 在学习了Nodejs和HTML5之后,发现了Nodejs的使用很方便,和php是完全不同的另一种后台语言.我也明白了,在一个项目里,是不可能同时存在Apach服务器(php)和Web服务器( ...

  10. T4模板编辑器

    一 二.工具  (T4模板编辑器) 使用效果 1.tangibleT4EditorPlusModellingToolsVS2013.msi 2.devart T4 Editor for Visual ...