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

HBase Split 过程

 
阅读更多
看了下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
分享到:
评论

相关推荐

    HBase源代码 hbase-0.98.23

    当一个Region的大小达到预设阈值时,`org.apache.hadoop.hbase.regionserver.HRegion`会触发分裂过程,这涉及到`org.apache.hadoop.hbase.regionserver.SplitTransaction`类的使用,确保分裂过程中数据的一致性。...

    hbase数据可视化系统

    使用HBase的Compaction和Split机制,保持Region的平衡;并考虑使用二级索引提高查询效率。 六、总结 通过SpringBoot搭建的HBase可视化系统,使得非技术人员也能便捷地管理和操作HBase,降低了使用门槛,提高了工作...

    hbase1.0.3_part2

    Split过程是透明的,对上层应用无感知。 2. **表的预分区**:为了优化数据写入,开发者可以在创建表时预先定义Region的数量和边界,这称为预分区。这样可以避免数据集中写入某一区域,导致热点现象。 3. **HBase的...

    Hbase实验报告.pdf

    **HBase实验报告** 在本实验中,我们主要聚焦于HBase,这是一个基于谷歌Bigtable设计的开源...在后续的学习和实践中,应深入研究HBase的其他高级特性,如Region Split、Compaction等,以便更好地应用到实际项目中。

    Hbase 组件 、架构

    HRegionServer是HBase集群运行在每个工作节点上的服务组件,负责维护Master分配给它的Region,处理对这些Region的读写请求,并在Region运行过程中进行切分。当Region变得过大时,HRegionServer会负责将它分割成两个...

    HBase性能深度分析

    在此过程中,“.splits”目录的引入,有效避免了split过程中可能出现的并发操作冲突,起到了类似锁的作用,确保数据一致性。同时,compaction机制在文件数量超出“hbase.hstore.compactionThreshold”阈值时(默认3...

    最新版linux hbase-2.3.3-bin.tar.gz

    Linux上的HBase是Apache Hadoop生态系统中的一个分布式、版本化、基于列族的NoSQL数据库。...了解其核心概念、安装过程和基本操作,可以帮助你有效地利用这个工具来构建高可用、高性能的数据存储系统。

    大数据HBASE考题材料

    - 提高`hbase.hregion.max.filesize`的阈值:增加Region的最大文件大小,从而减少Split的发生。 6. **设置数据版本数** - 通过`HColumnDescriptor.setMaxVersions`来设置每个单元格的版本数量,这对于控制存储...

    hbase-2.0.0.3.0.0.0-1634-bin.tar.gz

    2. Region管理:HBase的Region是数据分区的基本单位,你可以通过Ambari监控Region分布,进行手动Split或Merge操作。 3. 性能调优:通过调整HBase的配置参数,如MemStore大小、BlockCache设置等,可以优化读写性能。...

    java从本地读文件并上传Hbase

    以下是一个详细的过程,讲解如何实现这个功能。 首先,确保你的开发环境已经配置了Java和HBase的相关依赖。你需要添加HBase的客户端库到你的项目中,这通常通过Maven或Gradle的依赖管理工具来完成。例如,在Maven的...

    hadoop+hbase jar包

    6. 性能优化:在实际部署中,还需要关注Hadoop和HBase的性能优化,如设置合适的Block Size、副本数量、内存分配等参数,以及使用HBase的Region Split策略来提高数据访问效率。 总结,Hadoop和Hbase是大数据处理的...

    Hbase中文文档和官方英文文档PDF.7z

    5. **数据分布与分区**:解释HBase如何通过Region进行数据分区,以及Split过程。 6. **容错与高可用性**:讨论HBase的故障恢复策略,如RegionServer的故障切换。 7. **性能调优**:分享关于配置优化、读写性能提升、...

    Hbase 分区操作

    Split过程包括以下步骤: - **检测条件**:当Region中的数据量接近预设的最大大小(例如,1GB)时,HBase会触发分裂操作。 - **选择分裂点**:HBase会选择一个中间键作为分裂点,使得左右两边的Region大小大致相等...

    hbase regions数据切割.docx

    数据切割的过程涉及到HBase的内部机制,包括RegionServer、Zookeeper和HFile等组件的协同工作。切割时,HBase会创建新的Region副本,然后更新Meta表信息,最后将客户端的请求路由到新的Region。整个过程需要保证数据...

    Hadoop数据迁移--从Hadoop向HBase

    在数据迁移的过程中,HBase的TableReducer使用`Put`对象来构建行数据,并将其插入到HBase中。值得注意的是,数据插入的过程是一个追加操作,这意味着新的数据会被添加到现有数据之后,而不会覆盖或干扰已有的数据。...

    sqoop把mysql数据导入hbase2.1.6

    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 ...

    hbase存储csv数据的代码实现

    以下是一个简单的Python示例,展示如何使用HappyBase库(一个Python HBase客户端)来实现这个过程: ```python import happybase # 连接到HBase connection = happybase.Connection('localhost') # 创建表 table ...

    HBase2.x之RIT问题解决.docx

    HBase 2.x中的Region-In-Transition(RIT)机制是一种Region状态变迁机制,例如merge、split、assign、unassign等操作。在RIT过程中,可能会出现异常情况,从而导致Region的状态一直保持在RIT,使得HBase出现异常。 ...

Global site tag (gtag.js) - Google Analytics