NameNode对数据块的管理

  1. 关于块跟副本

hadoop中块是一种逻辑概念而副本才是真正的物理概念,即在DataNode中存储的数据块是以一个叫做的Replica来表示的,而在NameNode中则是以Block来表示。BlockInfo是Block的子类,主要用它来表示一个数据块,这个类中最重要的就是triplets这个数组对象了,假设数据块有i个副本,那么这个数组的长度为3*i,其中下标为3*i的元素记录了第i个副本所在的DataNode信息,而3*i+1以及3*i+2则分别记录了这个DataNode上前一个数据副本以及后一个数据副本对应的BlockInfo对象,这样NameNode中跟DataNode相关的对象就只用记录第一个数据块对应的BlockInfo就可以遍历该数据节点对应的所有数据块信息。

2.BlockManager

2.1 总体介绍

BlockManager顾名思义,就是NameNode用来管理集群数据块的类。主要根据每次DataNode心跳发送过来的信息,来整理数据块。

集群刚启动时,DataNode第一次发送心跳信息的时候获得所有数据块的全量汇报时,由于考虑到需要快速启动集群,所以不会根据心跳信息计算那些数据块需要复制、那些数据块需要删除,仅仅只是记录正常状态的数据块、正在构建的数据块以及损坏的数据块。对于后面增量汇报的数据块;

对于后面的增量汇报,新增加的数据块可能是从其他的DataNode复制而来的也有可能是客户端写入的,对于前者,需要考虑更新BlockManager中相关信息,表明复制任务已经完成;如果是删除的数据块则要删掉NameNode中对应的元数据;

当然每间隔6小时还会有一次DataNode关于块的全量汇报,这时会根据NameNode块的状态,将汇报的副本放入toAdd、toRemove、toInvalidate、toCorrupt、toUC这几个队列中,然后会根据这几个队列更新BolckManger中相关信息。

2.2    数据结构

corruptReplicas:损坏的副本集合;

excessReplicateMap:多余的副本集合(例如降低副本数);

invalidateBlocks:源自上面两个集合,等待删除的副本集合;

neededReplications:等待复制的数据块;

pendingReplications:已经生成复制请求的数据块;

blocksMap:保存所有的blockInfo的信息。

2.3    具体用例

2.3.1         删除数据块

删除文件的时候,由RPC调用BlockManager的removeBlocks方法,期间会更新blocksMap、pendingReplications、neededReplications、corruptReplicas相应的信息,并将对应数据块的副本加入invalidateBlocks这个集合,最后向DataNode发送删除副本的指令。

2.3.2         删除副本

删除副本由很多种情况,除了上面的删除文件的时候要删除副本,至少还要考虑删除过多的副本以及删除损坏的副本。除了向DataNode发送删除副本的命令之外,还需要调用removeStoredBlock将副本信息从NameNode中删除。副本过多以及损坏副本有一点不同,前者需要DataNode发出相应心跳的时候才会调用removeStoredBlock方法,而后者在发送删除指令之前就会调用,主要是考虑到如果删除损坏副本的指令没有成功下达,下次心跳中损坏副本在NameNode中没有对应的信息,直接被标识为损坏副本。

2.3.3         增加数据块

当上一个数据块写入完成的时候,客户端向NameNode申请一个新的数据块,写入后面的数据,并且在blockMap中添加相应的键值对。由addBlockCollection方法处理。

2.3.4         增加副本

客户端写入成功一个数据块,或者DataNode之间复制数据块成功之后,由心跳信息,发送给NameNode表示成功添加了一个数据块副本,由addStoredBlock方法响应、处理,并且更新neededReplications、excessReplicateMap、corruptReplicas这些集合。

2.3.5         复制数据块

触发块复制的情况也有很多,例如所有的数据块都在同一个机架上、完成写操作的文件没有足够的副本、有DataNode下线、pendingReplications队列上有超时的任务。这些情况对应的方法都会将这些数据块加入到needReplications队列中。最后如果DataNode能够及时响应,将会从pendingReplications队列中,删除已经成功复制的命令。

时间: 2024-08-09 00:08:41

NameNode对数据块的管理的相关文章

Hadoop0.21内存泄漏问题:数据块映射管理的一个bug

我们的HDFS生产环境是Hadoop-0.21,机器规模200台,block在7KW左右. 集群每运行几个月,NameNode就会频繁FGC,最后不得不restart NameNode. 因此怀疑NameNode存在内存泄漏问题,我们dump出了NameNode进程在重启前后的对象统计信息. 07-10重启前: num     #instances         #bytes  class name ----------------------------------------------

HDFS源码分析数据块校验之DataBlockScanner

DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独的线程中,为该块池扫描.校验数据块.当一个BPOfferService服务变成活跃或死亡状态,该类中的blockPoolScannerMap将会更新. 我们先看下DataBlockScanner的成员变量,如下: // 所属数据节点DataNode实例 private final DataNode

hadoop hdfs数据块探索

1.文件存储的位置 示例查看 ./bin/hadoop fsck /data/bb/bb.txt -files -blocks -racks –locations blk_1076386829_2649976是meta文件名,具体如何找到这个meta文件,可以通过find命令,从图中我们可以看到文件存储在117和229的二台机器上,例如我们登录到117机器上. 首先到dfs.datanode.data.dir的路径(如果忘记啦,可以在$HADOOP_HOME/etc/hadoop/hdfs-si

5.oracle的dump理解五 数据块理论

5.oracle的dump理解五 数据块理论 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51228514 前两篇描述了我们在操作层面看到的一些东西,但是没有理论指导,看到越多我们只会越迷糊.所以,蛤蟆从官方文档上摘取一些老少皆宜的内容来补脑. 块是数据块IO的最小单位. 1     数据块和操作系统块 从物理层面,数据库的块存储时候是由操作系统块组成.操作系统块是操作系统可以读写的最小数据单位.ORACLE块是一个逻辑存

数据块的内容和参数

数据块由3部分组成:块头部分.空闲区.数据区.随着数据量的增加,块头部分从上而下占据空闲区而数据区从下而上占据空闲区.当两部分接触时数据块就满了. 数据区:存储的是数据行,当插入数据时从下而上占据空闲区 块头部分:存储数据块的地址.表目录.行目录和事务槽,事务槽是在事务修改数据行时使用.头部从上而下占据空闲区 空闲区:位于数据块的中部,初始化时是连续的.但是随着删除修改操作使得空闲区碎片化.oracle服务器会根据需要合并空闲区. 一.oracle引入4个参数管理数据块 1.控制并行操作的参数:

DataNode节点的数据块管理 FSVolumeSet、FSVolume

在分布式文件系统HDFS中,DataNode节点被用来存储文件的数据,确切的来说就是HDFS中的每一个文件是分块来存储的,一个文件可能有多个数据块,每一个数据块有多个副本,而且数据块的不同副本存储在不同的DataNode节点上,所以如果把整个HDFS集群看做一台机器的话,那么每一个DataNode节点就可以看做是一块存储磁盘.实际上,HDFS也正是这么干的.前面说过,每一个DataNode节点我们都可以为它配置多个本地存储路径,如果把这些本地存储路径统一看做一块磁盘的话,那每个存储路径就可以看做

【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线

一.段的类型: 1.什么是段:段是存储单元. 1.段的类型有: 表 分区表 簇表 索引 索引组织表(IOT表) 分区索引 临时段 undo段 lob段(blob ,clob) 内嵌表(record类型,table类型) 启动段 :打开数据库时要装入的数据字典系统信息,故在系统表空间内. 注意:smon 回收不用的临时段和undo段. 2.表: 表是存储数据的逻辑单位. 表的功能: 存储.管理数据的基本单元, 表的类型: 普通表:堆表, 例:查询表的行的平均长度 AVG_ROW_LEN 平均长度

Hadoop HDFS源码分析 关于数据块的类

Hadoop HDFS源码分析 关于数据块的类 1.BlocksMap 官方代码中的注释为: /** * This class maintains the map from a block to its metadata. * block's metadata currently includes blockCollection it belongs to and * the datanodes that store the block. */ BlocksMap数据块映射,管理名字节点上的数据

HDFS源码分析(三)-----数据块关系基本结构

前言 正如我在前面的文章中曾经写过,在HDFS中存在着两大关系模块,一个是文件与block数据块的关系,简称为第一关系,但是相比于第一个关系清晰的结构关系,HDFS的第二关系就没有这么简单了,第二关系自然是与数据节点相关,就是数据块与数据节点的映射关系,里面的有些过程的确是错综复杂的,这个也很好理解嘛,本身block块就很多,而且还有副本设置,然后一旦集群规模扩大,数据节点的数量也将会变大,如何处理此时的数据块与对应数据节点的映射就必然不是简单的事情了,所以这里有一点是比较特别的,随着系统的运行