【HDFS】从BlockPoolSlice#createRbwF

2023-02-22  本文已影响0人  大数据Zone

从FsDatasetImpl#createRbw,经过FsVolumeImpl#createRbw,最终会调用BlockPoolSlice#createRbwFile的方法。

看下createRbwFile,主要功能就是在rbw目录下根据block的name创建一个文件。

  /**
   * RBW files. They get moved to the finalized block directory when
   * the block is finalized.
   */
  File createRbwFile(Block b) throws IOException {
    File f = new File(rbwDir, b.getBlockName());
    // 如果文件已经存在或创建失败会抛出异常。
    File rbwFile = DatanodeUtil.createFileWithExistsCheck(
        volume, b, f, fileIoProvider);
    // If any exception during creation, its expected that counter will not be
    // incremented, So no need to decrement
    // BlockPoolSlice的numOfBlocks加1。
    incrNumBlocks();
    return rbwFile;
  }

看FsVolumeImpl#createRbw:

  public ReplicaInPipeline createRbw(ExtendedBlock b) throws IOException {
    // 调用上面的createRbwFile创建rbw文件
    File f = createRbwFile(b.getBlockPoolId(), b.getLocalBlock());
    // 构造出LocalReplicaInPipeline对象,这个类我们后面描述
    LocalReplicaInPipeline newReplicaInfo = new ReplicaBuilder(ReplicaState.RBW)
        .setBlockId(b.getBlockId())
        .setGenerationStamp(b.getGenerationStamp())
        .setFsVolume(this)
        .setDirectoryToUse(f.getParentFile())
        .setBytesToReserve(b.getNumBytes())
        .buildLocalReplicaInPipeline();
    return newReplicaInfo;
  }

LocalReplicaInPipeline:
定义了在pipeline中的一个副本,这个副本包括正在被dfs client写入的persistent副本、或者是正在被source datanode做复制的temporary副本,或者是为了做balance正在拷贝的temporary副本。

上一篇 下一篇

猜你喜欢

热点阅读