看了下hbase split的代码 记录一下学习心得
private void split(final HRegion parent, final byte [] midKey)
throws IOException {
final long startTime = System.currentTimeMillis();
SplitTransaction st = new SplitTransaction(parent, midKey);
// If prepare does not return true, for some reason -- logged inside in
// the prepare call -- we are not ready to split just now. Just return.
if (!st.prepare()) return;
try {
st.execute(this.server, this.server);
SplitTransation表示处理split是一个类似事务性质的行为,接下来我们会经常和它打交道
初始化了一个path:tablename/parent/split/
st.prepare():构造了两个HRegionInfo:hri_a和hri_b,a是top,其startkey为parent的startkey,endkey是midkey;hri_b是bottom,startkey为midkey,endkey是parent的endkey。
然后st.execute(this.server, this.server);
1.创建splitdir:tablename/parent/split/,在状态机中加入CREATE_SPLIT_DIR
createSplitDir(this.parent.getFilesystem(), this.splitdir);
this.journal.add(JournalEntry.CREATE_SPLIT_DIR);
2.close parentregion,并返回所有的storefile,状态机加入CLOSED_PARENT_REGION
close的过程会刷一次磁盘memstore的数据写入磁盘;
List<StoreFile> hstoreFilesToSplit;
hstoreFilesToSplit = this.parent.close(false);
3.从rs的onlineregion列表中移除parent region,状态机添OFFLINED_PARENT
services.removeFromOnlineRegions(this.parent.getRegionInfo().getEncodedName());
this.journal.add(JournalEntry.OFFLINED_PARENT);
4.splitStoreFiles(this.splitdir, hstoreFilesToSplit);
多线程处理所有的storefiles.创建文件/table/parent/split/hri_a
(hri_b)/family/storefilename. parent,在该文件中写入boolean top和midkey
splitStoreFiles(this.splitdir, hstoreFilesToSplit);
this.journal.add(JournalEntry.STARTED_REGION_A_CREATION);
5.状态机添STARTED_REGION_A_CREATION,创建子Region A。将上面的hri_a下的文件move到table/hri_a下即变为/hbase/hri_a/family/storefilename.parent
6.同理状态机添STARTED_REGION_B_CREATION而后创建子Region B
this.journal.add(JournalEntry.STARTED_REGION_A_CREATION);
HRegion a = createDaughterRegion(this.hri_a,this.parent.flushRequester, this.parent.rsServices);
this.journal.add(JournalEntry.STARTED_REGION_B_CREATION);
HRegion b = createDaughterRegion(this.hri_b, this.parent.flushRequester, this.parent.rsServices);
7.meta表中下线parent;将parent在meta表中offline和split标志置为true,parent
Region添加两列SPLITA和SPLITB,值为HRegioninfo
8.状态机添PONR
try{
if (!testing) {
MetaEditor.offlineParentInMeta(server.getCatalogTracker(),
this.parent.getRegionInfo(), a.getRegionInfo(), b.getRegionInfo());
}
} catch(IOException e){
throw e;
} finally{
this.journal.add(JournalEntry.PONR);
}
9.开两个线程open REGION A和B。
1>调用openRegion函数进行initilize,主要步骤如下
a)向hdfs上写入.regionInfo文件以便meta挂掉以便恢复
b)初始化其下的HStore,主要是LoadStoreFiles函数:
对于该store函数会构造storefile对象,从hdfs上获取路径和文件,每个文件一个
storefile对象,对每个storefile对象会读取文件上的内容创建一个
HalfStoreFileReader读对象来操作该region的父region上的相应的文件,及该
region上目前存储的是引用文件,其指向的是其父region上的相应的文件,对该
region的所有读或写都将关联到父region上
2>将子Region添加到rs的online region列表上,并添加到meta表上
DaughterOpener aOpener = new DaughterOpener(server, services, a);
DaughterOpener bOpener = new DaughterOpener(server, services, b);
aOpener.start();
bOpener.start();
try {
aOpener.join();
bOpener.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IOException("Interrupted " + e.getMessage());
}
整个过程如上所述,如果碰到异常的话,会进行rollback检查状态机上的状态并依次进行rollback
分享到:
相关推荐
当一个Region的大小达到预设阈值时,`org.apache.hadoop.hbase.regionserver.HRegion`会触发分裂过程,这涉及到`org.apache.hadoop.hbase.regionserver.SplitTransaction`类的使用,确保分裂过程中数据的一致性。...
使用HBase的Compaction和Split机制,保持Region的平衡;并考虑使用二级索引提高查询效率。 六、总结 通过SpringBoot搭建的HBase可视化系统,使得非技术人员也能便捷地管理和操作HBase,降低了使用门槛,提高了工作...
Split过程是透明的,对上层应用无感知。 2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region的数量和边界,这称为预分区。这样可以避免数据集中写入某一区域,导致热点现象。 3. **HBase的...
HRegionServer是HBase集群运行在每个工作节点上的服务组件,负责维护Master分配给它的Region,处理对这些Region的读写请求,并在Region运行过程中进行切分。当Region变得过大时,HRegionServer会负责将它分割成两个...
**HBase实验报告** 在本实验中,我们主要聚焦于HBase,这是一个基于谷歌Bigtable设计的开源...在后续的学习和实践中,应深入研究HBase的其他高级特性,如Region Split、Compaction等,以便更好地应用到实际项目中。
在此过程中,“.splits”目录的引入,有效避免了split过程中可能出现的并发操作冲突,起到了类似锁的作用,确保数据一致性。同时,compaction机制在文件数量超出“hbase.hstore.compactionThreshold”阈值时(默认3...
Linux上的HBase是Apache Hadoop生态系统中的一个分布式、版本化、基于列族的NoSQL数据库。...了解其核心概念、安装过程和基本操作,可以帮助你有效地利用这个工具来构建高可用、高性能的数据存储系统。
- 提高`hbase.hregion.max.filesize`的阈值:增加Region的最大文件大小,从而减少Split的发生。 6. **设置数据版本数** - 通过`HColumnDescriptor.setMaxVersions`来设置每个单元格的版本数量,这对于控制存储...
2. Region管理:HBase的Region是数据分区的基本单位,你可以通过Ambari监控Region分布,进行手动Split或Merge操作。 3. 性能调优:通过调整HBase的配置参数,如MemStore大小、BlockCache设置等,可以优化读写性能。...
以下是一个详细的过程,讲解如何实现这个功能。 首先,确保你的开发环境已经配置了Java和HBase的相关依赖。你需要添加HBase的客户端库到你的项目中,这通常通过Maven或Gradle的依赖管理工具来完成。例如,在Maven的...
6. 性能优化:在实际部署中,还需要关注Hadoop和HBase的性能优化,如设置合适的Block Size、副本数量、内存分配等参数,以及使用HBase的Region Split策略来提高数据访问效率。 总结,Hadoop和Hbase是大数据处理的...
5. **数据分布与分区**:解释HBase如何通过Region进行数据分区,以及Split过程。 6. **容错与高可用性**:讨论HBase的故障恢复策略,如RegionServer的故障切换。 7. **性能调优**:分享关于配置优化、读写性能提升、...
Split过程包括以下步骤: - **检测条件**:当Region中的数据量接近预设的最大大小(例如,1GB)时,HBase会触发分裂操作。 - **选择分裂点**:HBase会选择一个中间键作为分裂点,使得左右两边的Region大小大致相等...
数据切割的过程涉及到HBase的内部机制,包括RegionServer、Zookeeper和HFile等组件的协同工作。切割时,HBase会创建新的Region副本,然后更新Meta表信息,最后将客户端的请求路由到新的Region。整个过程需要保证数据...
在数据迁移的过程中,HBase的TableReducer使用`Put`对象来构建行数据,并将其插入到HBase中。值得注意的是,数据插入的过程是一个追加操作,这意味着新的数据会被添加到现有数据之后,而不会覆盖或干扰已有的数据。...
sqoop import --connect jdbc:mysql://master:3306/test --username root --password root --table Student --columns "Sno,Sname,Sex,Sage,Sdept" --split-by Sno --hbase-table "sqooptest" --column-family ...
以下是一个简单的Python示例,展示如何使用HappyBase库(一个Python HBase客户端)来实现这个过程: ```python import happybase # 连接到HBase connection = happybase.Connection('localhost') # 创建表 table ...
- `HBaseAdmin.split()`和`HBaseAdmin.mergeRegions()`方法允许管理员手动控制Region操作。 10. **监控与调试**: - HBase提供了丰富的JMX指标,可以通过JMX客户端监控HBase的运行状态。 - 使用`HBaseAdmin....