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

简介:         我们知道,HDFS中的文件是由数据块Block组成的,并且为了提高容错性,每个数据块Block都会在不同数据节点DataNode上有若干副本Replica。那么,什么是Block?什么又是Replica?         首先,我们看下Block的定义,如下: /**...

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

        首先,我们看下Block的定义,如下:

/**************************************************
 * A Block is a Hadoop FS primitive, identified by a 
 * long.
 *
 **************************************************/
@InterfaceAudience.Private
@InterfaceStability.Evolving
public class Block implements Writable, Comparable<Block> {
  public static final String BLOCK_FILE_PREFIX = "blk_";
  public static final String METADATA_EXTENSION = ".meta";
  
  //....省略部分代码
  
  private long blockId;
  private long numBytes;
  private long generationStamp;
  
  //....省略部分代码
  
}
        Block实际上是HDFS文件数据块在HDFS元数据或者文件树中的一种表现形式。它有三个重要字段,均是long类型的,数据块艾迪blockId、数据块字节数numBytes、数据块时间戳generationStamp。另外,BLOCK_FILE_PREFIX表明了数据块数据文件在物理硬盘上为文件名是以blk_为前缀的,而METADATA_EXTENSION则标识了数据块元数据文件在物理硬盘上是以.meta为文件名后缀的。

        我们再看下副本Replica的定义,它实际上是一个借口,如下:

/** 
 * This represents block replicas which are stored in DataNode.
 */
@InterfaceAudience.Private
public interface Replica {
	//....省略部分代码
}
        Replica实际上代表了存储与数据节点上的数据块副本,是数据块Block在数据节点上的存储形式的抽象。Replica的实现则是ReplicaInfo,它继承自Block,并实现了Replica接口,如下:

/**
 * This class is used by datanodes to maintain meta data of its replicas.
 * It provides a general interface for meta information of a replica.
 * 这个类被数据节点用于保持它副本的元数据信息。它为副本的元数据信息提供了通用的接口。
 */
@InterfaceAudience.Private
abstract public class ReplicaInfo extends Block implements Replica {
	//....省略部分代码
}
        到了这里,我们就可以通俗的理解为,Block是名字节点NanmeNode中对文件数据块的抽象描述,它不区分副本,是组成文件的数据块的统一抽象描述,而Replica则是数据节点DataNode对存储在其上的物理数据块副本的统一抽象描述,它继承自Block,很好的反应了Block与Replica的对应关系。

        我们简单看下抽象类ReplicaInfo都有哪些成员变量,代码如下:

  /** volume where the replica belongs */
  // 数据块副本属于的卷FsVolumeSpi实例volume
  private FsVolumeSpi volume;
  
  /** directory where block & meta files belong */
  
  /**
   * Base directory containing numerically-identified sub directories and
   * possibly blocks.
   * 数据块副本存储的基础路径,其包含以数字标识的子目录,或者干脆是数据块
   */
  private File baseDir;
  
  /**
   * Whether or not this replica's parent directory includes subdirs, in which
   * case we can generate them based on the replica's block ID
   * 标志位:数据块副本的父目录是否包含子目录,如果是的话,我们可以根据数据块副本的数据块ID获取它们。
   */
  private boolean hasSubdirs;
  
  // 内部基础路径
  private static final Map<String, File> internedBaseDirs = new HashMap<String, File>();
        由上面的代码,我们可以知道,它主要包括数据块副本属于的卷FsVolumeSpi实例volume,数据块副本存储的基础路径baseDir,其包含以数字标识的子目录,或者干脆是数据块,还有就是标志位:数据块副本的父目录是否包含子目录,如果是的话,我们可以根据数据块副本的数据块ID获取它们。

        




相关文章
|
11月前
|
存储 分布式计算 Hadoop
HDFS 修改副本数&fsck命令
HDFS 修改副本数&fsck命令
504 0
|
2月前
|
分布式计算 流计算
美团 Flink 大作业部署问题之Checkpoint Replicate Service 跨 HDFS 集群的副本制作是如何实现的
美团 Flink 大作业部署问题之Checkpoint Replicate Service 跨 HDFS 集群的副本制作是如何实现的
|
5月前
|
存储 分布式计算 Hadoop
|
5月前
|
存储 分布式计算 Hadoop
Hadoop节点HDFS数据块的作用
【5月更文挑战第19天】
46 3
|
5月前
|
存储 分布式计算 Hadoop
hadoop节点HDFS数据块基本概念
【5月更文挑战第19天】
65 1
|
5月前
|
存储 分布式计算 Hadoop
hadoop节点HDFS数据块(Block)
【5月更文挑战第18天】
64 1
|
存储 大数据
大数据数据存储的分布式文件系统的HDFS的核心机制理解的副本策略
在 Hdfs 中,数据的复制和原理是基于块的分布式存储。
96 1
|
存储 机器学习/深度学习 缓存
HDFS的元数据和数据块管理
介绍Hadoop文件系统(HDFS)的元数据和数据块管理
385 0
|
2月前
|
存储 分布式计算 Hadoop
【揭秘Hadoop背后的秘密!】HDFS读写流程大曝光:从理论到实践,带你深入了解Hadoop分布式文件系统!
【8月更文挑战第24天】Hadoop分布式文件系统(HDFS)是Hadoop生态系统的关键组件,专为大规模数据集提供高效率存储及访问。本文深入解析HDFS数据读写流程并附带示例代码。HDFS采用NameNode和DataNode架构,前者负责元数据管理,后者承担数据块存储任务。文章通过Java示例演示了如何利用Hadoop API实现数据的写入与读取,有助于理解HDFS的工作原理及其在大数据处理中的应用价值。
61 1
|
2月前
|
存储 缓存 分布式计算

热门文章

最新文章

下一篇
无影云桌面