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

HBase Region在两个RegionServer出现分析

 
阅读更多

HBase的操作一般都是以region为粒度的,如split,compact,move等操作。因此对于每个region在集群的唯一性就需要得到保证。若region在两个regionserver中出现显然会有各种各样的bug出现。

这里我们通过以下的分析来看看region在上吗情况下会出现分配到两个rs中。


对于一个RS1上的Region A将其move到RS2中,调用HBaseAdmin的move操作:

  1.创建一个到B的RegionPlan

  2.然后unassigned Region A,即将RS1上的Region A的region关闭,主要是关闭region上每个storefile的读数据流,在这个过程中会把memstore内容刷一次磁盘

  3.然后在RS2中open Region A,主要操作是对Region A的初始化,将A的rs地址信息更新Meta表中


假设在move的过程中RS1 down掉了,那么master会调用servershutdownhandler来处理该事件。主要处理步骤如下:

public void process() throws IOException { 
    final String serverName = this.hsi.getServerName(); 

 
拆分日志,把regionserver的hlog按照region的不同进行拆分,分别写入各个region目录下 

LOG.info("Splitting logs for " + serverName); 
    this.services.getMasterFileSystem().splitLog(serverName); 

 

 在master的内存中清除rs中的region和server,并返回在master的RIT队列上的该RS的online region

 

 // Clean out anything in regions in transition.  Being conservative and 
    // doing after log splitting.  Could do some states before -- OPENING? 
    // OFFLINE? -- and then others after like CLOSING that depend on log 
    // splitting. 
    List regionsInTransition = 
      this.services.getAssignmentManager().processServerShutdown(this.hsi); 

 [如该RS包含ROOT或META则需首先分配之 

 // Assign root and meta if we were carrying them. 
    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表中获得RS1上的的region

// Wait on meta to come online; we need it to progress. 
    // TODO: Best way to hold strictly here?  We should build this retry logic 
    //       into the MetaReader operations themselves. 
    NavigableMap hris = null; 
    while (!this.server.isStopped()) { 
      try { 
        this.server.getCatalogTracker().waitForMeta(); 
        hris = MetaReader.getServerUserRegions(this.server.getCatalogTracker(), 
            this.hsi); 
        break; 
      } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
        throw new IOException("Interrupted", e); 
      } catch (IOException ioe) { 
        LOG.info("Received exception accessing META during server shutdown of " + 
            serverName + ", retrying META read"); 
      } 
    } 

 
移除RIT中状态为Closing或是PendingClose的region,得到的就是需要重新分配的regions[
 

 // Skip regions that were in transition unless CLOSING or PENDING_CLOSE 
    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()); 
      } 
    } 

    
我们可以看到,在move过程中,若region尚未上线,此时master的RIT队列中region的状态是OFFLINE,而该region在master的角度来看是offline的,然而在severshutdown的处理中认为该region是要重新分配的。若在此时region在RS2上线了,那么而master依然要对该region进行分配这就导致了region的两次分配过程[code="java"]    

LOG.info("Reassigning " + hris.size() + " region(s) that " + serverName + 
      " was carrying (skipping " + regionsInTransition.size() + 
      " regions(s) that are already in transition)"); 

    // Iterate regions that were on this server and assign them 
    for (Map.Entry e: hris.entrySet()) { 
      if (processDeadRegion(e.getKey(), e.getValue(), 
          this.services.getAssignmentManager(), 
          this.server.getCatalogTracker())) { 
        this.services.getAssignmentManager().assign(e.getKey(), true); 
      } 
    } 
    this.deadServers.finish(serverName); 
    LOG.info("Finished processing of shutdown of " + serverName); 
  } 

  

整个过程起始是在rs shundown以后master需要对rs上的region重新assign到其他rs中去,但是在需要assign的region的序曲上出现了一些问题,将在master中已经offline的但是依然在RIT队列中的region重新分配,由于这些region可能已经在其他地方正在分配,但是还没有上线。当master开始assign region的时候此时region上线了,master依旧会继续分配重而导致region的两次分配

分享到:
评论

相关推荐

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

    【HBASERegion数量增多问题描述及解决方案】 在HBase分布式数据库中,Region是表数据的基本存储单元,它将表的数据按照ROWKEY的范围进行分割。随着数据的增长,一个Region会分裂成两个,以此来确保数据的均衡分布。...

    hbase性能调优

    - 这两个参数用于控制MemStore的内存使用,确保不会因为内存不足而发生问题。 ##### 7. `file.block.cache.size` - **含义**:定义了BlockCache的大小。 - **默认值**:0.25。 - **推荐值**:根据业务特点调整。 ...

    HBase性能深度分析

    经过长时间不间断的测试,所得图表展现出规律性的波动,即在一段直线走势中,每隔一定周期会出现明显的峰值,且在两个峰值间存在较小的波谷,且峰值间隔逐渐增大。 #### 波动现象解读与HBase内部机制 为了理解图表...

    Hbase 组件 、架构

    每个RegionServer都管理着多个Region,Region是HBase分布式存储和负载均衡的最小单元,它们分散在不同的RegionServer上,以实现数据的分布存储和并行处理。 HBase中的Region可以理解为关系型数据库中的“分区”,每...

    HBase 应用平台 balancer 功能

    当表的数据量增长时,单个Region可能会变得过大,这时会将Region分裂成两个,以保持大小适中。Region分布在各个RegionServer上,而`balancer`就是负责调整这些Region的分配策略,确保负载均衡。 `balancer`的主要...

    hbase regions数据切割.docx

    切割操作会将当前Region根据中间键(split key)分裂为两个新的Region。 4. 切割完成后,新创建的Region会被Master节点分配到集群中的其他RegionServer,以确保数据的均匀分布。 方法2:切割整个表的所有Region ...

    hbase0.94java源代码

    3. Region分裂:当Region变得过大时,HBase会自动将其分裂成两个新的Region。 4. Compaction:定期合并小的HFile以减少Region中的文件数量,提高读取效率。 5. 数据模型和数据访问层:包括RowKey设计、过滤器...

    第5章Hbase1

    在深入探讨HBase之前,我们先来了解两种主要的数据库类型:OLAP(在线分析处理)和OLTP(在线事务处理)。OLAP主要用于数据分析和报告,支持复杂查询和多维分析,适用于数据仓库系统。而OLTP则是日常业务操作的核心...

    Hadoop2.6.2、Hbase1.1.2 HA

    3. 配置ResourceManager HA:在YARN中,设置两个ResourceManager节点,同样使用ZooKeeper进行监控和故障切换。 4. 配置HBase RegionServer HA:确保RegionServer的健康监测和故障恢复策略有效。 5. 配置Hive ...

    hbase1.0.3_part2

    HBase通过Region Split来解决这个问题,将大的Region分割成两个较小的部分,确保数据分布均匀。Split过程是透明的,对上层应用无感知。 2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region...

    HBase二级索引

    HBase 二级索引的应用场景主要有两个方面:一是大数据分析,使用 HBase 二级索引可以快速查询大量的数据,从而提高大数据分析的效率;二是实时数据处理,使用 HBase 二级索引可以实时处理大量的数据,从而满足实时...

    apache_hbase_reference_guide.pdf

    HBase 的配置文件主要包括 hbase-site.xml 和 hbase-env.sh两个文件,hbase-site.xml 文件用于配置 HBase 的基本参数,hbase-env.sh 文件用于配置 HBase 的环境变量。 3. HBase 运行模式 HBase 支持两种运行模式:...

    java大数据作业_3HBase

    6. **创建新Region**:原始Region被分裂成两个新的Region,各自继承原Region的一部分数据。 7. **更新元数据**:新的Region信息被更新到HMaster和Zookeeper中。 8. **负载均衡**:HMaster负责将新的Region分配给合适...

    Hbase 分区操作

    - **创建新Region**:在主服务器(Master)上创建两个新的子Region,并将原始Region的元数据更新为这两个新Region的信息。 - **数据迁移**:RegionServer将原始Region的数据按分裂点分割到新的子Region中。 - **元...

    Hbase 高可用分布式搭建

    在大数据处理领域,HBase作为一个基于Hadoop的分布式非关系型数据库,因其高效、可扩展性和高可用性而被广泛应用。本篇文章将深入探讨如何进行HBase的高可用分布式搭建,以便实现数据存储和访问的稳定性与可靠性。 ...

    hbase-0.98.6.1-src.zip

    - **Splitting**:当region过大时,会自动分裂成两个新的region,保持region的均衡。 6. **复制与容错**: - **Region Replication**:通过复制region,提供数据冗余,提高可用性。 - **Failover机制**:...

    hadoop ,hbase,zookeeper错误日志及相关应对措施

    第一个问题是,在regionserver区域出现了两个127.0.0.1的regionserver,但是我们并没有在conf/regionservers中将master设置为regionserver。第二个问题是,无法停止master节点。解决方法是,使用netstat -an命令查看...

    hbase的rowkey设计与hbase的协处理器运用.docx

    HBase RowKey 设计与协处理器运用 HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。... RowKey 设计和协处理器运用是 HBase 中两个非常重要的概念,需要细心设计和实施。

Global site tag (gtag.js) - Google Analytics