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数量增多问题描述及解决方案】 在HBase分布式数据库中,Region是表数据的基本存储单元,它将表的数据按照ROWKEY的范围进行分割。随着数据的增长,一个Region会分裂成两个,以此来确保数据的均衡分布。...
- 这两个参数用于控制MemStore的内存使用,确保不会因为内存不足而发生问题。 ##### 7. `file.block.cache.size` - **含义**:定义了BlockCache的大小。 - **默认值**:0.25。 - **推荐值**:根据业务特点调整。 ...
经过长时间不间断的测试,所得图表展现出规律性的波动,即在一段直线走势中,每隔一定周期会出现明显的峰值,且在两个峰值间存在较小的波谷,且峰值间隔逐渐增大。 #### 波动现象解读与HBase内部机制 为了理解图表...
每个RegionServer都管理着多个Region,Region是HBase分布式存储和负载均衡的最小单元,它们分散在不同的RegionServer上,以实现数据的分布存储和并行处理。 HBase中的Region可以理解为关系型数据库中的“分区”,每...
当表的数据量增长时,单个Region可能会变得过大,这时会将Region分裂成两个,以保持大小适中。Region分布在各个RegionServer上,而`balancer`就是负责调整这些Region的分配策略,确保负载均衡。 `balancer`的主要...
切割操作会将当前Region根据中间键(split key)分裂为两个新的Region。 4. 切割完成后,新创建的Region会被Master节点分配到集群中的其他RegionServer,以确保数据的均匀分布。 方法2:切割整个表的所有Region ...
3. Region分裂:当Region变得过大时,HBase会自动将其分裂成两个新的Region。 4. Compaction:定期合并小的HFile以减少Region中的文件数量,提高读取效率。 5. 数据模型和数据访问层:包括RowKey设计、过滤器...
在深入探讨HBase之前,我们先来了解两种主要的数据库类型:OLAP(在线分析处理)和OLTP(在线事务处理)。OLAP主要用于数据分析和报告,支持复杂查询和多维分析,适用于数据仓库系统。而OLTP则是日常业务操作的核心...
3. 配置ResourceManager HA:在YARN中,设置两个ResourceManager节点,同样使用ZooKeeper进行监控和故障切换。 4. 配置HBase RegionServer HA:确保RegionServer的健康监测和故障恢复策略有效。 5. 配置Hive ...
HBase通过Region Split来解决这个问题,将大的Region分割成两个较小的部分,确保数据分布均匀。Split过程是透明的,对上层应用无感知。 2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region...
HBase 二级索引的应用场景主要有两个方面:一是大数据分析,使用 HBase 二级索引可以快速查询大量的数据,从而提高大数据分析的效率;二是实时数据处理,使用 HBase 二级索引可以实时处理大量的数据,从而满足实时...
HBase 的配置文件主要包括 hbase-site.xml 和 hbase-env.sh两个文件,hbase-site.xml 文件用于配置 HBase 的基本参数,hbase-env.sh 文件用于配置 HBase 的环境变量。 3. HBase 运行模式 HBase 支持两种运行模式:...
6. **创建新Region**:原始Region被分裂成两个新的Region,各自继承原Region的一部分数据。 7. **更新元数据**:新的Region信息被更新到HMaster和Zookeeper中。 8. **负载均衡**:HMaster负责将新的Region分配给合适...
- **创建新Region**:在主服务器(Master)上创建两个新的子Region,并将原始Region的元数据更新为这两个新Region的信息。 - **数据迁移**:RegionServer将原始Region的数据按分裂点分割到新的子Region中。 - **元...
在大数据处理领域,HBase作为一个基于Hadoop的分布式非关系型数据库,因其高效、可扩展性和高可用性而被广泛应用。本篇文章将深入探讨如何进行HBase的高可用分布式搭建,以便实现数据存储和访问的稳定性与可靠性。 ...
- **Splitting**:当region过大时,会自动分裂成两个新的region,保持region的均衡。 6. **复制与容错**: - **Region Replication**:通过复制region,提供数据冗余,提高可用性。 - **Failover机制**:...
第一个问题是,在regionserver区域出现了两个127.0.0.1的regionserver,但是我们并没有在conf/regionservers中将master设置为regionserver。第二个问题是,无法停止master节点。解决方法是,使用netstat -an命令查看...
HBase RowKey 设计与协处理器运用 HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。... RowKey 设计和协处理器运用是 HBase 中两个非常重要的概念,需要细心设计和实施。