`
punishzhou
  • 浏览: 141327 次
社区版块
存档分类
最新评论

HBase的RS关闭过程和Region重分配(二)

阅读更多

上一篇blog谈到了rs挂掉的几种情况。

 

HBase作为nosql的一种产品,应用于大规模分布式的海量数据,其中有一个优点就是其对于机器down掉的容错性。

客户端不需要关注机器是否挂掉或者怎么样,server会自动处理down的server,处理器上的region并分配到其他server从而最大限度地提高系统可用性

 

今天来看看当rs挂掉以后的处理情况。

 

前面我们说过rs启动以后会在zk上的rs目录下注册自己的节点,而master监听了这一节点的变化包括delete,changed,created等动作。此时master监听到了node deleted事件会按如下处理:

    this.deadservers.add(serverName);
    this.onlineServers.remove(serverName);
    this.serverConnections.remove(serverName);    CatalogTracker ct = this.master.getCatalogTracker();
    // Was this server carrying root?
    boolean carryingRoot;
    try {
      HServerAddress address = ct.getRootLocation();
      carryingRoot = address != null &&
        hsi.getServerAddress().equals(address);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      LOG.info("Interrupted");
      return;
    }
     HServerAddress address = ct.getMetaLocation();
    boolean carryingMeta =
      address != null && hsi.getServerAddress().equals(address);
    if (carryingRoot || carryingMeta) {
      this.services.getExecutorService().submit(new MetaServerShutdownHandler(this.master,
        this.services, this.deadservers, info, carryingRoot, carryingMeta));
    } else {
      this.services.getExecutorService().submit(new ServerShutdownHandler(this.master,
        this.services, this.deadservers, info));
    }
 

 逻辑也比较简单,从master内存中删除该rs,删除connection,判断是否有root或是meta在其上

然后起线程servershutdown来处理,servershutdown的处理如下:

首先把该rs的log split掉,按region分别放到每个region目录下的recovered.edits 目录下,一个线程读3个线程写

splitLog(serverName)

 

 清除所有到该rs的regionplan,清楚master内存上的该rs的region,找到online的处于rit队列中的该rs的region

List<RegionState> regionsInTransition =
      this.services.getAssignmentManager().processServerShutdown(this.hsi);

  若包含root或是meta则需assign

    if (isCarryingRoot()) { // -ROOT-
      try {
    	 this.services.getAssignmentManager().assignRoot();
      } catch (KeeperException e) {
        this.server.abort("In server shutdown processing, assigning root", e);
        throw new IOException("Aborting", e);
      }
    }

    // Carrying meta?
    if (isCarryingMeta())this.services.getAssignmentManager().assignMeta(); 

 等待meta表上线,扫描meta表,寻找需要重新assign的region,其中为处于RIT队列中的会重新分配,处于RIT中且状态是PENDINGCLOSE或是CLOSING的将重新assign,而RIT中的其他状态不许重新分配,因为RIT超时后会自动reassign这些region

 for (RegionState rit : regionsInTransition) {
      if (!rit.isClosing() && !rit.isPendingClose()) {
        LOG.debug("Removed " + rit.getRegion().getRegionNameAsString() +
          " from list of regions to assign because in RIT");
        hris.remove(rit.getRegion());
      }
    }
for (Map.Entry<HRegionInfo, Result> e: hris.entrySet()) {
      if (processDeadRegion(e.getKey(), e.getValue(),
          this.services.getAssignmentManager(),
          this.server.getCatalogTracker())) {
        this.services.getAssignmentManager().assign(e.getKey(), true);
      }
    }

 而在上面的挑选region assign的过程当中会存在bug

 

如一个region 从A move 到B ,其操作为close region IN A 然后 open region In B 。但是当region在B上线之前,此时由于已经关闭了region,故该region在master处是offline的,但是在meta表中还存在,而且RIT队列中也有。

如此时A server 挂掉,那么通过上述的分配规则,显然region 要assign,而此时 region 在B中上线,然后RIT队列中又存在一个对region的分配,从而造成region的二次分配,二者会对数据的一致性造成很大的影响

 

分享到:
评论

相关推荐

    Hbase的安装过程及基本操作

    来自一位老学姐的Hbase安装详细教程(清华大学镜像下)及基本操作,希望能带给你们些许帮助。主要包含Hbase的下载过程及其遇到的小问题,后续会继续完善该文档!

    hbase读取数据过程

    HBASE的一个读取数据流程的解析,清晰的画出整个过程,十分有利于理解

    hadoop hive hbase安装过程

    hadoop hive hbase安装过程

    HBASERegion数量增多问题描述及解决方案.docx

    HBASERegion数量增多问题描述及解决方案.docx

    Hbase 二级索引方案

    在 Hbase 中,表的 RowKey 按照字典排序, Region 按照 RowKey 设置 split point 进行 shard, 通过这种方式实现的全局、分布式索引. 成为了其成功的最大的砝码。 然而单一的通过 RowKey 检索数据的方式,不再满足更多...

    Hbase的region合并与拆分

    1、region 拆分机制 ...当region大小大于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分,一个region等分为2个region。 但是在生产线上这种切分策略却有相当大的弊端:切分策略对于大表和小表没有

    HBase(hbase-2.4.9-bin.tar.gz)

    HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...

    java大数据作业_3HBase

    2. 请简述HBase中数据写入最后导致Region分裂的全过程 3. 如果设计一个笔记的表,表中要求有笔记的属性和笔记的内容,怎么做 4. HBase部署时如何指定多个zookeeper 5. HBase shell是基于哪种JVM运行的语言实现的 6. ...

    HBaseRegion自动切分的所有细节都在这里了

    HBase系统中Region自动切分是如何实现的,这里面涉及很多知识点,比如Region切分的触发条件是什么、Region切分的切分点在哪里、如何切分才能最大的保证Region的可用性、如何做好切分过程中的异常处理、切分过程中要...

    hbase-region-inspector, HBase区域统计信息的可视化仪表板.zip

    hbase-region-inspector, HBase区域统计信息的可视化仪表板 hbase-region-inspectorHBase区域统计信息的可视化仪表板。 用法下载与HBase集群版本匹配的可执行二进制插件,添加execute权限,并使用以下命令行参数启动...

    HBase二级索引

    本方案主要参照了华为公布的HBase二级索引实现方案。基于hadoop平台,设计了Hbase的二级索引机制。

    HbaseTemplate 操作hbase

    java 利用 sping-data-hadoop HbaseTemplate 操作hbase find get execute 等方法 可以直接运行

    基于springboot集成hbase过程解析

    主要介绍了基于springboot集成hbase过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    HBASE学习分享

    HBASE的主要原理解读:包括HBase 读写逻辑、HBase region拆分和合并

    pinpoint的hbase初始化脚本hbase-create.hbase

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架

    hbase-sdk是基于hbase-client和hbase-thrift的原生API封装的一款轻量级的HBase ORM框架。 针对HBase各版本API(1.x~2.x)间的差异,在其上剥离出了一层统一的抽象。并提供了以类SQL的方式来读写HBase表中的数据。对...

    hbase 权限配置.docx

    介绍hbase 权限配置。

    hbase安装和使用

    本资源为hbase的安装和使用,内含hbase安装工具包,hbase的安装说明,hbase的使用说明 。

    hive和hbase整合

    hadoop jar /usr/lib/hbase/hbase-0.90.4-cdh3u3.jar importtsv -Dimporttsv.columns=HBASE_ROW_KEY, catgyname,catgyid1,catgyname1,catgyid2,catgyname2,catgyid3,catgyname3,catgyid4,catgyname4,catgyid5,...

    hbase原理和设计

    hbase原理和设计,包括二级索引,rowkey设计,常见的坑.

Global site tag (gtag.js) - Google Analytics