`
brianf
  • 浏览: 37310 次
  • 来自: 杭州
社区版块
存档分类
最新评论

HBase MVCC基本原理

阅读更多
HBase  MVCC(Multi Version Consistencey Control)

mvcc多版本并发控制,是相对锁来说对并发处理的一种方法,

在HBase中,当writernumber > reade number

表明这个memstore在写,如此时读需要等待。

1. MVCC初始化
在HRegion 的initializeRegionInternals方法中,初始化
Return the largest memstoreTS found across all storefiles in the given list. Store files that were created by a mapreduce bulk load are ignored,

          long maxStoreMemstoreTS = store.getMaxMemstoreTS();
          if (maxStoreMemstoreTS > maxMemstoreTS) {
            maxMemstoreTS = maxStoreMemstoreTS;
          }
---
mvcc.initialize(maxMemstoreTS + 1);


2. 例如 HRegion中internalFlushcache方法
首先.
w = mvcc.beginMemstoreInsert();
主要是为了设置nextWriteNumber并生成WriteEntry的对象e并加入writeQueue(LinkList)队尾。
简单的说就是通过MVCC表明当前的memstore已经开始写了,并且写的位置是nextWriteNumber
  public WriteEntry beginMemstoreInsert() {
    synchronized (writeQueue) {
      long nextWriteNumber = ++memstoreWrite;
      WriteEntry e = new WriteEntry(nextWriteNumber);
      writeQueue.add(e);
      return e;
    }
  }

mvcc.advanceMemstore(w);
主要是有个while循环从writeQueue队头中取出WriteEntry的对象一个个判断
如果nextWriteNumber>0, if (nextReadValue+1 != queueFirst.getWriteNumber()),抛异常 。
如果WriteEntry的对象已经完成,更新nextReadValue并从writeQueue中删除当前对象,否则break;
跳出while后更新memstoreRead并通知readWaiters.notifyAll().
简单的说这个方法主要是为了更新memstoreRead,也就是可以读的位置, 并通知readWaiters.notifyAll()。

  boolean advanceMemstore(WriteEntry e) {
    synchronized (writeQueue) {
      e.markCompleted();

      long nextReadValue = -1;
      boolean ranOnce=false;
      while (!writeQueue.isEmpty()) {
        ranOnce=true;
        WriteEntry queueFirst = writeQueue.getFirst();

        if (nextReadValue > 0) {
          if (nextReadValue+1 != queueFirst.getWriteNumber()) {
            throw new RuntimeException("invariant in completeMemstoreInsert violated, prev: "
                + nextReadValue + " next: " + queueFirst.getWriteNumber());
          }
        }

        if (queueFirst.isCompleted()) {
          nextReadValue = queueFirst.getWriteNumber();
          writeQueue.removeFirst();
        } else {
          break;
        }
      }

      if (!ranOnce) {
        throw new RuntimeException("never was a first");
      }

      if (nextReadValue > 0) {
        synchronized (readWaiters) {
          memstoreRead = nextReadValue;
          readWaiters.notifyAll();
        }
      }
      if (memstoreRead >= e.getWriteNumber()) {
        return true;
      }
      return false;
    }
  }


3. 例如 HRegion中internalFlushcache方法中调用
mvcc.waitForRead(w);
这个方法就是wait直到memstore可以读,那么memstore什么时候可以读呢?
memstoreRead >= e.getWriteNumber()时才可以读。
  public void waitForRead(WriteEntry e) {
    boolean interrupted = false;
    synchronized (readWaiters) {
      while (memstoreRead < e.getWriteNumber()) {
        try {
          readWaiters.wait(0);
        } catch (InterruptedException ie) {
          // We were interrupted... finish the loop -- i.e. cleanup --and then
          // on our way out, reset the interrupt flag.
          interrupted = true;
        }
      }
    }
    if (interrupted) Thread.currentThread().interrupt();
  }

那么在internalFlushcache中,调用waitForRead主要作用是为了在flush之前等待还在处理中的事务commit到Hlog中,并阻止未提交的事务写到HFile中。
之后就进行flush.


同样在HRegion的doMiniBatchMutation方法中有类似的mvcc应用,通过mvcc实现写完成的数据能被及时读到。

      // ------------------------------------
      // Acquire the latest mvcc number
      // ----------------------------------
      w = mvcc.beginMemstoreInsert();


      // ------------------------------------------------------------------
      // STEP 8. Advance mvcc. This will make this put visible to scanners and getters.
      // ------------------------------------------------------------------
      if (w != null) {
        mvcc.completeMemstoreInsert(w);
        w = null;
      }
1
0
分享到:
评论

相关推荐

    HBase权威指南中文版

    《HBase权威指南中文版》是一本全面深入介绍HBase技术的书籍,涵盖了从基础概念到高级应用的各个层面。...通过学习这本书,读者不仅可以掌握HBase的核心原理,还能获得在实际项目中运用HBase的宝贵经验。

    hbase-0.98.6-cdh5.3.6.zip

    1. **源代码**:允许开发人员深入理解HBase的工作原理,并进行定制化开发或调试。 2. **bin目录**:包含可执行脚本,如启动和停止HBase服务的命令,以及用于管理表和操作数据的工具。 3. **conf目录**:提供默认配置...

    HBase权威指南_Hadoop权威指南_pdf_

    3. **Region管理**:Region是HBase中的基本存储单元,随着数据增长,Region会自动分裂以保持性能。Row Key的设计至关重要,因为它决定了数据的分布和访问效率。 4. **HBase与Hadoop的集成**:HBase构建在HDFS之上,...

    hbase-0.90.3.tar.gz

    3. **Column Family**:列族是HBase的基本存储结构,每个表由一个或多个列族组成,列族内的列可以动态添加。 4. **Versioning**:HBase使用时间戳来管理版本,每个单元格可以有多个版本的数据。 5. **Scanning**:...

    HBaseTest_hbase_源码

    通过分析"HBaseTest"源码,我们可以更直观地理解HBase的工作原理和使用方式,为实际项目中的数据存储和处理提供有力的支持。在实际应用中,还需要根据具体需求进行性能调优,以充分利用HBase的优势,解决大数据场景...

    Hbase分布式数据库 v2.5.6.zip

    源代码的发布对于开发者来说极其重要,因为它允许他们深入理解HBase的工作原理,进行定制化开发,或者为项目贡献代码。 在“hbase-rel-2.5.6”这个压缩包中,我们可以期待找到HBase的源代码目录结构,包括核心模块...

    PhoenixUtils

    它还能帮助设置表的属性,如是否启用压缩、是否是多版本并发控制(MVCC)等。 2. **DML操作**:对于插入、更新和删除数据,PhoenixUtils 提供了一套简洁的API,允许开发者通过SQL语句直接操作HBase数据。这些操作...

    数据库原理教案和数据库原理及应用

    随着大数据和分布式系统的兴起,NoSQL数据库如MongoDB、Cassandra和HBase提供了非关系型、高可扩展和高性能的解决方案。 本教程“数据库原理及应用”将涵盖以上所有知识点,并可能通过实例和练习加深理解,帮助学习...

    数据库系统原理(教材配套_全部).7z

    数据库系统原理是计算机科学中的一个核心领域,它涵盖了数据存储、数据管理、数据查询和数据安全等多个方面。...通过学习,不仅可以理解数据库的基本工作原理,还能掌握实际应用中的设计和管理技巧。

    数据库原理和技术ppt

    - 大数据与云数据库:Hadoop,HBase,MongoDB等,以及云计算环境下的数据库服务。 - 数据库发展趋势:内存数据库,实时分析,数据仓库,数据湖等。 以上各章节覆盖了数据库原理和技术的全面知识,从基础理论到...

    数据库原理课件 ppt

    《数据库系统概论》是学习数据库原理的经典教材,第四版更是结合了最新的技术发展,深入浅出地介绍了数据库的基础理论、设计与管理。本课件PPT将帮助我们全面理解数据库的各个方面。 首先,我们需要了解数据库的...

    数据库复习

    非关系型数据库则更加灵活,如文档数据库(如MongoDB)、键值对存储(如Redis)、列族数据库(如HBase)和图形数据库(如Neo4j)。混合型数据库结合了关系型和非关系型的特点,以适应不同的应用场景。 在复习数据库...

    【分布式数据库】特训营学习资料.zip

    整个特训营的目的是让学员通过理论学习和实践操作,理解分布式数据库的设计理念,熟悉各种分布式数据库系统(如HBase、Cassandra、MySQL Cluster、TiDB等),并能解决实际工作中的挑战。视频教程链接提供了更直观的...

    计算机等级考试三级数据库考前训练题

    6. **事务处理与并发控制**:学习事务的ACID属性(原子性、一致性、隔离性、持久性),了解锁、多版本并发控制(MVCC)和死锁的概念。 7. **备份与恢复**:掌握数据库备份类型(如全备、增量备、差异备),以及如何...

    数据库课件(学校老师的东西)

    这份资料可能包含了数据库的基本概念、设计原理、操作技术以及应用实例,旨在促进大家共同学习,共同进步。 1. **数据库基本概念**:数据库是按照数据结构来组织、存储和管理数据的仓库。它不仅包含数据本身,还...

    database 重点

    以上就是“database 重点”所涵盖的一些关键内容,这些知识点不仅涵盖了数据库的基本原理,还涉及到了实际应用中的重要技术和策略。学习并掌握这些内容,对于提升你在IT行业的专业能力至关重要。

    太原理工大学数据库复习大纲

    9. **NoSQL与大数据**:非关系型数据库(NoSQL)如MongoDB、Cassandra和HBase的原理和应用,以及大数据处理技术,如Hadoop和Spark。 10. **数据库应用开发**:使用JDBC或ODBC接口与数据库交互,开发数据库驱动的...

    数据库系统导论(第7版)

    6. **并发控制**:讲解多用户环境下如何处理事务,避免数据不一致性,如封锁协议、两阶段锁定、多版本并发控制(MVCC)等。 7. **故障恢复**:介绍日志记录、检查点技术、事务的持久性和原子性,以及如何应对系统...

Global site tag (gtag.js) - Google Analytics