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

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

阅读更多

Hbase的一个很大的优点就是可扩展性比较强,可以线性扩展,加机器就行,而且机器的配置也不需要太好,就是用大量廉价的机器来替代昂贵的小型机,但是由于大量的相对廉价的机器,由于网络硬盘等各种各样的原因,机器不可避免的会挂掉,那么HBase在面对这种问题时如何处理呢?

 

首先来看HBase的RS在哪几种情况下会down掉:

1. 集群关闭;

2. stop regionserver 关闭当前RS,当然也可启动当前RS

3. 线程kill掉,包括kill + 线程号 and kill -9 + 线程号

4. RS在运行过程中产生自身难以解决的problem,此时它会自己abort自己。

 

而按照HBase对这几种down掉的处理情况又可以吧上述分为3类:

 

第一种是kill -9 类型的此时rs直接退出,直接中断任何运行中的线程,从日志中我们也可以发现没有任何日志记录

 

第二种是abortRequested类型的,这种是由于RS运行期间出错导致RS自己abort自己,这个过程会做很多收尾工作,关闭线程,关闭storefile的reader对象,关闭hlog等等

 

第三种就是stop类型的,包括kill 线程和stop regionserver和集群关闭,与第二种比较相似,而且会把此时内存的数据刷新到磁盘以后,并把hlog移到.oldlogs

 

在0.90版本上,第三种的关闭存在一个bug会造成数据丢失。

 

我们来看看第三中是如何处理的:

 this.leases.closeAfterLeasesExpire();//释放所有的Lease后,关闭Leases线程
    this.server.stop();//close socket和handler
    if (this.splitLogWorker != null) {
      splitLogWorker.stop();//close splitlog 线程
    }
    if (this.infoServer != null) {
      LOG.info("Stopping infoServer");
      try {
        this.infoServer.stop();//close http端的接口,主要是REST应用
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    // Send cache a shutdown.
    LruBlockCache c = (LruBlockCache) StoreFile.getBlockCache(this.conf);
    if (c != null) {
      c.shutdown();// close 每5分钟一次的blockcache信息
    }

    // Send interrupts to wake up threads if sleeping so they notice shutdown.
    // TODO: Should we check they are alive? If OOME could have exited already
    if (this.cacheFlusher != null) this.cacheFlusher.interruptIfNecessary();//关闭memstoreflusher线程,默认是超过64M会刷一次磁盘
    if (this.compactSplitThread != null) this.compactSplitThread.interruptIfNecessary();//关闭split与compact线程
    if (this.hlogRoller != null) this.hlogRoller.interruptIfNecessary();//close hlogRoller,每24小时清理一次
    if (this.majorCompactionChecker != null) this.majorCompactionChecker.interrupt();//close majoreCompactorChecker,默认24小时做一次major compact

    if (this.killed) {//kill - 9
      // Just skip out w/o closing regions.
    } else if (abortRequested) {RS自己abort
      if (this.fsOk) {
        closeAllRegions(abortRequested); // Don't leave any open file handles
        closeWAL(false);
      }
      LOG.info("aborting server at: " + this.serverInfo.getServerName());
    } else {//stop
      closeAllRegions(abortRequested);
      closeWAL(true);
      closeAllScanners();
      LOG.info("stopping server at: " + this.serverInfo.getServerName());
    }
    // Interrupt catalog tracker here in case any regions being opened out in
    // handlers are stuck waiting on meta or root.
    if (this.catalogTracker != null) this.catalogTracker.stop();
    if (this.fsOk) waitOnAllRegionsToClose();

    // Make sure the proxy is down.
    if (this.hbaseMaster != null) {
      HBaseRPC.stopProxy(this.hbaseMaster);
      this.hbaseMaster = null;
    }
    this.leases.close();
    HConnectionManager.deleteConnection(conf, true);
    this.zooKeeper.close();
    if (!killed) {
      join();
    }
    LOG.info(Thread.currentThread().getName() + " exiting");

 

在stop reginserver的过程当中会

else {//stop
      closeAllRegions(abortRequested);
      closeWAL(true);
      closeAllScanners();
      LOG.info("stopping server at: " + this.serverInfo.getServerName());
    }

 首先关闭所有的Region,这里的关闭Region是启动新的线程去关闭Region,正常好像是3个?,若存在meta或是root则分别另启一个线程处理。

然后closeWAL,close Hlog的writer,并把.logs移动到.oldlogs目录下,然后删除.logs的目录

最后关闭所有的scanners,防止下一次打开的时候出错

 

在上述过程中,由于close region是另起线程进行处理的,那么就有可能存在这样的情况,region还未关闭结束如正在flush,而此时closeWal已经结束并且把logs目录删除了,这就可能会造成data loss ,应为在flush的时候比如kill -9了那此时memstore的数据丢失了,而logs也没有数据 ,故无法恢复从而造成data loss

 

解决方案是 等到所有的region close 以后再做close Wal操作

 

 

RS在启动的时候会在ZK下的RS目录注册自己的节点,而master会监听到这个节点,当RS挂掉以后,ZK上的该节点delete掉,而Master会捕捉到这个事件调用nodedeleted来处理

 

 下一篇介绍一下master观察到zk上rs节点delete以后的操作

 

 

分享到:
评论

相关推荐

    Hbase的安装过程及基本操作

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

    hbase读取数据过程

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

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

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

    hadoop hive hbase安装过程

    hadoop hive hbase安装过程

    Hbase的region合并与拆分

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

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

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

    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表中的数据。对...

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

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

    java大数据作业_3HBase

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

    Hbase 删除某一列

    删除Hbase中某个表的一列值 命令 java -jar deleteOneColumn.jar(这个文件的路径) '表名' '列簇名' '列名'

    HbaseTemplate 操作hbase

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

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

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

    基于springboot集成hbase过程解析

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

    HBASE学习分享

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

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

    搭建pinpoint需要的hbase初始化脚本hbase-create.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数据库设计.doc

    HBase的模式Schema设计的一些概念和原则 5 1)模式的创建与更新 5 2)列族的数量 6 3)行键设计RowKey 6 5. HBase的拓扑结构是什么? 7 1)拓扑结构 7 2)HBase与ZooKeeper的关系是什么? 7 3)HBase的内部结构管理...

    Hbase 二级索引方案

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

Global site tag (gtag.js) - Google Analytics