`
sid1211
  • 浏览: 50894 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

BlocksMap结构

阅读更多
    之前看了HDFS代码,做了一些整理,陆续贴上来,Namenode中最重要的结构是Namespace和BlocksMap,先把BlocksMap写一下。

BlocksMap里面最重要的一个结构是BlocksInfo,先来看一下BlocksInfo
1. Class BlocksInfo extends Block
Block类有三个变量,分别是long blockId;        每个block的id值,唯一的
                         long numBytes;      block的大小
                          long generationStamp; 时间戳,在修改和append有用
BlockInfo在Block的基础上加入了INodeFile inode; 代表此block对应文件INodeFile
            Object[] triplets;      三元组结构,其结构如下




       其中,对于副本个数为replica的三元组,其i*replica对应的是该block对应的Datanode对象,保存了其Datanode位置的信息,i*replica+1和i*replica+2为该block对应的Datanode对象上面其他block对象,即形成了一个链表结构。三元组是为了减少内存消耗。
       下面是BlockInfo中的重要方法:
1) BlockInfo(Block blk, int replication)
构造函数,设定该blockInfo对象的block属性,同时根据设定的replication对三元组初始化。
2) DatanodeDescriptor getDatanode(int index)
获得三元组中对应副本的Datanode对象,使用的方法是
DatanodeDescriptor node = (DatanodeDescriptor)triplets[index*3];
3) BlockInfo getPrevious(int index)
获得该副本所在Datanode上面前一块BlockInfo对象(链表结构)
方法是:
BlockInfo info = (BlockInfo)triplets[index*3+1];
4) BlockInfo getNext(int index)
获得该副本所在Datanode上面后一块BlockInfo对象(链表结构)
方法是:
BlockInfo info = (BlockInfo)triplets[index*3+2];
5) int numNodes()
获得已经保存到datanode上面的副本个数,如设定副本为3目前保存了2,还有一个没有保存,则返回2
6) int ensureCapacity(int num)
返回最后一个还没有保存datanode信息的三元组中位置,方法是:
int last = numNodes();
if(triplets.length >= (last+num)*3)
        return last;
7) boolean addNode(DatanodeDescriptor node)
保存该block对应的Datanode对象,首先找到最后一个没有保存datanode信息的三元组位置,在set即可(一个block对应多个副本,存储在不同的datanode上面,以后再说存储策略),主要方法为:
setDatanode(lastNode, node);
setNext(lastNode, null);
setPrevious(lastNode, null);
8) int findDatanode(DatanodeDescriptor dn)
查看Datanode对象是否在三元组中,如果在则返回其所在位置,否则返回-1。
9) boolean removeNode(DatanodeDescriptor node)
将Datanode对象从三元组中删除,步骤为:首先上面通过findDatanode()方法获得该Datanode在三元组中位置,再找到最后一个已经赋值的Datanode对象,将最后一个已赋值对象放置在要删除的对象位置,并将所有属性修改,最后将最后一个已赋值对象置为null。代码为:
int lastNode = numNodes()-1;
// replace current node triplet by the lastNode one
setDatanode(dnIndex, getDatanode(lastNode));
setNext(dnIndex, getNext(lastNode));
setPrevious(dnIndex, getPrevious(lastNode));
// set the last triplet to null
setDatanode(lastNode, null);
setNext(lastNode, null);
setPrevious(lastNode, null);
return true;
10) BlockInfo listInsert(BlockInfo head, DatanodeDescriptor dn)
参数中head为头结点,在DatanodeDesciptor中维护着一个头结点变量。本函数涉及三元组结构中i*replica+1和i*replica+2结构,功能是向该Datanode对象添加一个block,方法是将三元组中对应的Datanode对象对应的其他block对象修改为前一个节点为null,后一个节点为head。即将链表的头结点置为head。代码为:
int dnIndex = this.findDatanode(dn);
this.setPrevious(dnIndex, null);
this.setNext(dnIndex, head);
11) BlockInfo listRemove(BlockInfo head, DatanodeDescriptor dn)
参数中head为头结点,此函数功能是datanode中不在保存该block对象,从三元组的i*replica+1和i*replica+2结构中删除。代码为:
int dnIndex = this.findDatanode(dn);
BlockInfo next = this.getNext(dnIndex);
BlockInfo prev = this.getPrevious(dnIndex);
this.setNext(dnIndex, null);
this.setPrevious(dnIndex, null);
if(prev != null)
prev.setNext(prev.findDatanode(dn), next);
if(next != null)
next.setPrevious(next.findDatanode(dn), prev);
if(this == head)  // removing the head
  head = next;
return head;
是一个典型的链表删除操作。
12) int listCount(DatanodeDescriptor dn)
一个链表遍历操作,将特定datanode上面的所有block遍历,代码是
for(BlockInfo cur = this; cur != null;
              cur = cur.getNext(cur.findDatanode(dn)))
       count++;
13) boolean listIsConsistent(DatanodeDescriptor dn)
检查一致性,即检查链表中next->prev==cur,代码为
while(cur != null) {
        next = cur.getNext(cur.findDatanode(dn));
        if(next != null) {
          nextPrev = next.getPrevious(next.findDatanode(dn));
          if(cur != nextPrev) {
            System.out.println("Inconsistent list: cur->next->prev != cur");
            return false;
          }
        }
        cur = next;
        count++;
      }

以上是blocksInfo中的所有方法和结构,总的来说blockInfo维护了一个三元组,并对三元组进行一个操作,设计了所有副本对应的datanode对象以及datanode对象上面保存的其他block对象的信息。


2. BlocksMap中的第二个结构是NodeIterator,下面说明
private static class NodeIterator implements Iterator<DatanodeDescriptor>
这里,NodeIterator是一个迭代器模式,迭代某个blockInfo对象对应的所有datanode对象。在此类中,维护了一个nextIdx,是游标,初始为0,然后根据next()方法不断增加,获得所有的datanode对象。

3. BlocksMap中最重要的结构出现了,为private Map<BlockInfo, BlockInfo> map;
其中key为Block对象,前面说了Block对象之保存了基本信息,该信息是存储在FSImage中的,value为BlockInfo对象,BlockInfo对象是要通过blockReport从datanode上面获得的。如果知道一个Block对象,通过HashMap即可得到该Block的其它信息,维护了一个映射关系。
下面是围绕着该映射关系的一些重要方法。
4. private BlockInfo checkBlockInfo(Block b, int replication)
     检查该Block是否在map中,如果不在,生成一个BlockInfo对象,放入map中。
5. INodeFile getINode(Block b)
     根据Block对象在map中找到BlockInfo,如果BlockInfo对象存在,获得其对应的INodeFile对象。
6. BlockInfo addINode(Block b, INodeFile iNode)
     将Block对象存储在BlocksMap结构中,并且该Block对应的INodeFile指定。
7. void removeINode(Block b)
     将该Block对象对应的INodeFile对象删除,同时检查该Block对象如果不属于任何Datanode,则从BlocksMap中删除。
8. removeBlock(BlockInfo blockInfo)
     从BlocksMap结构中删除Block对象,同时为了删除Block对象,首先将其对应的INodeFile对象置为null,然后将所有其对应的Datanode对象将该块移除。
9. BlockInfo getStoredBlock(Block b)
     从BlocksMap中检索出Block对象对应的BlockInfo对象。
10. Iterator<DatanodeDescriptor> nodeIterator(Block b)
     返回迭代器,该迭代器迭代某个Block对象对应的所有Datanode对象。
11. int numNodes(Block b)
     返回某个Block对象对应的所有Datanode对象个数,比迭代器快。
12. addNode(Block b, DatanodeDescriptor node, int replication)
removeNode(Block b, DatanodeDescriptor node)
都涉及了DatanodeDescriptor的方法,在DatanodeDescriptor类中在解释。
  • 大小: 55.3 KB
分享到:
评论

相关推荐

    hdfs源码.zip

    3.2.1 Block、Replica、BlocksMap 162 3.2.2 数据块副本状态 167 3.2.3 BlockManager类(done) 177 3.3 数据节点管理 211 3.3.1 DatanodeDescriptor 212 3.3.2 DatanodeStorageInfo 214 3.3.3 ...

    毕业设计基于STC12C5A、SIM800C、GPS的汽车防盗报警系统源码.zip

    STC12C5A通过GPS模块获取当前定位信息,如果车辆发生异常震动或车主打来电话(主动请求定位),将通过GSM发送一条定位短信到车主手机,车主点击链接默认打开网页版定位,如果有安装高德地图APP将在APP中打开并展示汽车当前位置 GPS模块可以使用多家的GPS模块,需要注意的是,当前程序对应的是GPS北斗双模芯片,故只解析 GNRMC数据,如果你使用GPS芯片则应改为GPRMC数据即可。 系统在初始化的时候会持续短鸣,每初始化成功一部分后将长鸣一声,如果持续短鸣很久(超过20分钟),建议通过串口助手查看系统输出的调试信息,系统串口默认输出从初始化开始的所有运行状态信息。 不过更建议你使用SIM868模块,集成GPS.GSM.GPRS,使用更加方便

    基于tensorflow2.x卷积神经网络字符型验证码识别.zip

    基于tensorflow2.x卷积神经网络字符型验证码识别 卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    【三维装箱】遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】.zip

    【三维装箱】遗传和模拟退火算法求解三维装箱优化问题【含Matlab源码 031期】.zip

    自己编写的python 程序计算cpk/ppk

    cpk&ppk python 小程序,品友点评

    基于Springboot开发的分布式抽奖系统.zip

    基于springboot的java毕业&课程设计

    课设毕设基于SpringBoot+Vue的影城管理系统 LW+PPT+源码可运行.zip

    课设毕设基于SpringBoot+Vue的影城管理系统 LW+PPT+源码可运行.zip

    MC教育版(免登录版)

    MC教育版(免登录版)

    农作物叶片病害分类和分割数据集【数据集+标签】

    包含13993张数据和对应的13993张mask分割模版,数据集用不同目录保存,也可以用作分类数据集 类别包含:桃子、辣椒、覆盆子、大豆、南瓜、草莓

    基于vue+springboot二手交易网站.zip

    基于springboot的java毕业&课程设计

    【三维装箱】遗传算法求解三维装箱优化问题【含Matlab源码 3408期】.zip

    【三维装箱】遗传算法求解三维装箱优化问题【含Matlab源码 3408期】.zip

    基于javaspring 开发框架的培训教程 TP1.zip

    基于javaspring 开发框架的培训教程 TP1.zip

    信号和系统 MATLAB 代码:探索信号生成、系统建模、傅立叶分析、滤波器设计、采样和控制系统仿真.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    医院网上预约系统设计与开发/毕业设计

    医院网上预约系统设计与开发/毕业设计 JSP基于SSM网上医院预约挂号系统 科室信息: 科室id,科室名称,科室介绍,成立日期,负责人 医生信息: 医生工号,登录密码,所在科室,医生姓名,性别,医生照片,出生日期,医生职位,工作经验,联系方式,擅长,医生介绍 病人信息: 病人id,医生,病人姓名,性别,身份证号,联系电话,病人病例,登记时间 预约信息: 预约id,预约用户,预约医生,预约日期,时段,联系电话,下单时间,处理状态,医生回复 新闻信息: 新闻id,新闻标题,新闻图片,新闻内容,新闻日期,新闻来源 留言: 留言id,留言标题,留言内容,留言人,留言时间,管理回复,回复时间 用户: 用户名,登录密码,姓名,性别,出生日期,用户照片,联系电话,邮箱,家庭地址,注册时间

    企业数据治理之数据质量治理方案.pptx

    企业数据治理之数据质量治理方案

    MySQL8.4.0 LTS(mysql-8.4.0-10.fc38.x86-64.rpm-bundle.tar)

    MySQL8.4.0 LTS(mysql-8.4.0-10.fc38.x86_64.rpm-bundle.tar)适用于Linux Fedora 38 (x86, 64-bit)

    1659 jsp游乐园管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目源码

    一、源码特点 java 医疗数据管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了数据模型进行区块链设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。 二、功能介绍 如博客中介绍 三、注意事项 1、管理员账号:admin 密码:admin 数据库配置文件DBO.java ,权限包括管理员,用户 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。 3、数据库文件名是jspyly 系统名称yly 4、地址:http://127.0.0.1:8080/yly/qt/index.jsp

    基于SpringBoot 搭建的番茄短视频-后台管理系统.zip

    基于springboot的java毕业&课程设计

    54.医院分诊管理系统的设计与实现-基于SSM框架+ Mysql+Java设计与实现(可运行源码+数据库+lw)毕业设计管理系统

    可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) java期末大作业毕业设计项目管理系统计算机软件工程大数据专业 内容概要:通过陆丰市医院门诊分诊系统设计的研究背景、研究的意义和目的,通过运用java语言和ssm框架来建立一款分诊管理系统,能够帮助医院提高工作效率,减少工作中出现的错误率。设计出挂号管理、排队候诊管理以及叫号管理等多个子模块,绘制出实体关系图,利用MySQL技术建立数据库达成了软件与数据库的互通。最后对工作进行了总结和展望。 关键词:分诊管理系统;功能建模;java 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。

Global site tag (gtag.js) - Google Analytics