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

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
分享到:
评论

相关推荐

    hadoop hive hbase安装过程

    hadoop hive hbase安装过程

    基于springboot集成hbase过程解析

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

    Hbase的安装过程及基本操作

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

    hbase读取数据过程

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

    HbaseTemplate 操作hbase

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

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

    搭建pinpoint需要的hbase初始化脚本hbase-create.hbase

    HBase数据库设计.doc

    1. HBase有哪些基本的特征? 1 HBase特征: 1 2. HBase相对于关系数据库能解决的问题是什么? 2 HBase与关系数据的区别? 2 HBase与RDBMS的区别? 2 3. HBase的数据模式是怎么样的?即有哪些元素?如何存储?等 3 1...

    C#通过thrift连接hbase过程

    C#通过thrift连接hbase操作步骤,含有thrift客户端测试代码。

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

    java大数据作业_3HBase

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

    HBase+ElasticSearch搭建过程详解

    HBase+ElasticSearch搭建过程详解

    HBase学习利器:HBase实战

    HBase开发实战,HBase学习利器:HBase实战

    Hbase资源整理集合

    HBase 官方文档.pdf HBase的操作和编程.pdf HBase Cpressr优化与实验 郭磊涛.pdf null【HBase】Data Migratin frm Gri t Clu Cmputing - Natural Sienes .pdf 分布式数据库HBase快照的设计与实现.pdf 【HBase】...

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

    HBase开启审计日志

    HBase开启审计日志

    hbase-2.3.5单机一键部署工具

    注意:zookeeper3.4.13和hbase2.3.5都是采用docker-compose方式部署 原文链接:https://blog.csdn.net/m0_37814112/article/details/120915194 说明:使用外部zookeeper3.4.13之hbase2.3.5一键部署工具,支持部署、...

    hbase资料api

    HBASE

    HBase海量数据存储实战视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 从HBase的集群搭建、HBaseshell操作、java编程、架构、原理、涉及的数据结构,并且结合陌陌海量消息存储案例来...

    Hbase 二级索引方案

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

Global site tag (gtag.js) - Google Analytics