zoukankan      html  css  js  c++  java
  • HDFS Segment Block Report方案设计

    前言


    在上文HDFS全量块汇报(FBR)的限流机制中,笔者提到了对于目前HDFS FBR处理新的一个思路方向。大意是指将DataNode的块汇报粒度控制在NameNode这边来决定,而不是在DataNode这边。毕竟block report才是真正负责处理的角色。另一方面,单纯在DataNode端以per storage的方式进行block report拆分还不够灵活,随着实际存储密度性能的不断提升,每个storage所包含的block也将会不断的提升。基于这几点,社区曾经提出过讲block进一步进行逻辑上的拆分,拆成一个个小的segment段,然后在segment级别进行块的汇报。本文笔者来阐述的主题就是HDFS的基于Segment的Block Report设计。

    Block的Segment划分


    在这里Segment的意思是“片段”的意思,而对于FBR(Full Block Report)来说,我们的目标就是将一整块FBR拆成若干个小的Segment Block Report。因此这里需要做的一个事情是
    将现有Block进行Segment划分。一种比较自然联想到的做法是根据Block Id进行区间划分,而社区的方案正是采用了这种方法的。

    在每个Segment段内,代表的其实是一个range范围,从SegmentStart到SegmentEnd。 SegmentEnd-SegmentStart的值代表的是每个Segment所能包含的Block数。然后划分根据每个Block的Block Id进行Segment计算,然后进行划分,划分算法为block id减去最小id值然后除以每个Segment的最大允许存储块数n,公式如下:

    2^30 + floor((​b-​ 2^30) / ​n) ​* n)
    segmentEnd​ = ​segmentStart​ + ​n ​- 1

    划分后的结果如下图所示:

    在这里插入图片描述

    上图显示的Segment的Block块的最大允许值为1000。当我们在为现有Block进行Segment划分好后,发现部分相邻的Segment实际划分Block块数比较稀少的时候,会进行一次merge操作。上图中为Segment2合入Segment1内。

    Block的Segment划分只是逻辑层面的划分,它并需要被持久化出去,在每次NameNode重启时进行一次计算划分即可。当Segment划分好了,NameNode将会在内存中多维护一层[Segment, List<Block>]的映射信息了。这个映射信息将会在后面DataNode的Block Report中发挥作用。

    DataNode的Segment块上报


    相比较于原先的FBR,此时DataNode需要根据的是Segment进行块的汇报。这里的Segment指的是此DataNode上的块按照Segment划分进行上报。而具体汇报Segment的先后顺序由于NN决定,并通过heartbeat进行通信。这块逻辑是可以完全复用上文提到的Blokc Report Lease机制。

    DataNode Segment Block Report上报流程图如下:

    在这里插入图片描述

    上面意思为NN要求DN1汇报Segment1的BR,DN2汇报Segment3的BR以及DN3汇报Segment2的BR。

    引用


    [1].https://issues.apache.org/jira/browse/HDFS-11313 . Segmented Block Reports

  • 相关阅读:
    若干代码坏味及解法
    编程漫谈(十八):编程三境界
    如何不虚度光阴
    打印预览内嵌浏览器的两种方法
    LODOP多个表格带表格页脚关联
    Akka学习笔记
    Spring和Springboot相关知识点整理
    python接口测试:在一个用例文件中调用另一个用例文件中定义的方法
    使用jmeter对字符串进行加密
    (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)
  • 原文地址:https://www.cnblogs.com/bianqi/p/12183526.html
Copyright © 2011-2022 走看看