我们从HRegion.flushcache开始分析。由于这个过程还是比较复杂的,因此,在这一节,我们不会分析的太过详细,只是单单的介绍一下其大体流程,待大家有了整体的把握之后,我们将在下一节详细介绍其持久化的具体流程。
  为了尽可能严谨的描述整个流程,小编在讲解过程中会贴比较多的图来描述。
  好了,闲话不说,下面我们进入正题:
  首先,让我们来到今天的入口方法HRegion.flushcache:下图的代码不少,但是,并没有我们今天要介绍的重点。此图只是用来表示我们今天要讲的方法。
  其实,重点的入口方法是下图的框选方法internalFlushcache。由该方法名,我们就可以猜到该方法应该就是我们要找的方法。
  接着,让我们追踪到该方法内部,看到其调用了下图所示的两个方法。如下图所框选的两个方法。他们都是我们今天要介绍的重量级方法。
  第一个方法主要实现的是内存快照的创建。(为简化描述,以后用方法一描述该方法)
  第二个方法主要实现了将内存中的数据flush到磁盘上。(同理,用方法二描述该方法)
  下面,我们来到第一个方法,也就是HRegion.internalPrepareFlushCache。这个方法的内容很多,但是与我们今天流程相关并不是很多,如下图所示的代码:
  这里,我们简单看一下WALUtil.writeFlushMarker,并不做深入讲解,因为后面的内容还很多,详情让我们放到下一节。
  接着,我们来到StoreFlusherImpl.prepare。下图所框选的方法比较重要,因为这是方法一的核心。它为当前的memstore创建了快照,并且调用了resetActive方法,重置了memstore中的active成员变量。大家可能不太清楚我为什么要强调这里的active成员变量。那么我们跳过这张图。
  来到DefaultMemStore.snapshot,看一下我特地为大家标注的。首先,根据当前的active创建ImmutableSegment,然后将刚刚创建的ImmutableSegment赋给成员变量snapshot,最后,调用resetActive重置了当前的active为MutableSegment。这里不是很难,就不详细介绍了,大家有兴趣可以追查一下源码。
  接下来,让我们来到今天的另一个重量级方法HRegion.internalFlushCacheAndCommit,由于该方法比较长,内容比较多,这里我们仅介绍第一张图,也就是下图。如下图所示,我们框选了两个比较重要的变量prepareResult.storeFlushCtxs、prepareResult.committedFiles。大家可能会对他们有点陌生。没有关系,让我们在下面插一张图稍稍回顾一下
  看了下图,你可能就恍然大悟了,这正是方法一为方法二调用做的必要准备。到这里,大家应该能够理解我这里为什么要将他们二者称之为两个重量级方法了。
  接着,让我们继续往下走,来到HStore.StoreFlusherImpl.flushCache方法。
  继续来到上图所示方法的具体调用,这里就实现了对快照的flush。
  接着,我们来到今天所介绍的方法中最为复杂的方法。在下图,我框选的内容比较多,大家不要担心,我仅介绍其中与我们这一节紧密相关的后三个方法。
  首先,我们来到HStore.createWriterInTmp方法。在这个方法中,获取了familyTempDir路径。该路径是regionDir/.tmp/family.getNameAsString()。然后构建了StoreFileWriter。
  对于StoreFileWriter的构造方法是比较重要的,特别是其writer的构建,我在下图特别作了标示。
  由于上图所示的方法比较重要,在这里,我再附一张图来说明上图所示的writer类型,这关乎后面两个方法的具体调用。
  接着,我们来到StoreFlusher.performFlush。你可能会对我在下图标注的sink比较懵逼。但是仔细想一想,你可能就猜到了,这里的sink正是上面我们重点描述的HFileWriterImpl。也就是说下面调用的sink.append正是HFileWriterImpl.append。
  下图所示正是HFileWriterImpl.append。这里我们就不详细叙述了,留待下一节具体分析。
  接下来,就是真正的持久化方法:finalizeWriter。显然,在这里调用了writer.close。这里的writer类型是StoreFileWriter。
  继续往下走,来到StoreFileWriter.close。而这里的writer正是我们刚刚再三强调的HFileWriterImpl。
  在HFileWriterImpl.close方法中,将相关信息写入到输出流。
  在最后的finishClose方法中,也正如后面的图所示,最后调用了outputStream.close,完成了输出流的关闭。也就是说HStore中存储的CF信息flush到磁盘上。
  这一节描述的信息量还是很大的,还是希望大家耐心阅读。在后面的博文中,小编将做更为详细的描述。
  如果大家感觉不错,希望点一下下面的推荐。你的肯定是小编最大的动力。如果有疑问,也可以发送邮件至15935152719@163.com。

HBase数据持久化之HRegion.flushcache即CF持久化的更多相关文章

  1. HBase之CF持久化系列(续2)

    正如上篇博文所说,在本节我将为大家带来StoreFlusher.finalizeWriter..如果大家没有看过我的上篇博文<HBase之CF持久化系列(续1)>,那我希望大家还是回去看一 ...

  2. HBase之CF持久化系列(续1)

    这一节本来打算讲解HRegion的初始化过程中一些比较复杂的流程.不过,考虑前面的博文做的铺垫并不够,因此,在这一节,我还是特意来介绍HBase的CF持久化.关于这个话题的整体流程性分析在博文< ...

  3. HBase之CF持久化系列(续3——完结篇)

    相信大家在看了该系列的前两篇文章就已经对其中的持久化有比较深入的了解.相对而言,本节内容只是对前两节的一个巩固.与持久化相对应的是打开文件并将其内容读入到内存变量中.而在本节,我就来介绍这一点. 本节 ...

  4. 怎样将关系型数据表转换至hbase数据表

    首先须要把关系型数据库的数据表的数据添加由 "纵向延伸",转变为HBase数据表的"横向延伸" 一.Hbase的存储结构 a)      HBase以表(HTa ...

  5. HBase源代码分析之HRegion上MemStore的flsuh流程(二)

    继上篇<HBase源代码分析之HRegion上MemStore的flsuh流程(一)>之后.我们继续分析下HRegion上MemStore flush的核心方法internalFlushc ...

  6. HBase数据存储格式

    好的数据结构,对于检索数据,插入数据的效率就会很高. 常见的数据结构 B+树 根节点和枝节点非常easy,分别记录每一个叶子节点的最小值,并用一个指针指向叶子节点.  叶子节点里每一个键值都指向真正的 ...

  7. HBase数据备份及恢复(导入导出)的常用方法

    一.说明 随着HBase在重要的商业系统中应用的大量增加,许多企业需要通过对它们的HBase集群建立健壮的备份和故障恢复机制来保证它们的企业(数据)资产.备份Hbase时的难点是其待备份的数据集可能非 ...

  8. HBase数据快速导入之ImportTsv&Bulkload

    导入数据最快的方式,可以略过WAL直接生产底层HFile文件 (环境:centos6.5.Hadoop2.6.0.HBase0.98.9) 1.SHELL方式 1.1 ImportTsv直接导入 命令 ...

  9. HBase伪分布式安装(HDFS)+ZooKeeper安装+HBase数据操作+HBase架构体系

    HBase1.2.2伪分布式安装(HDFS)+ZooKeeper-3.4.8安装配置+HBase表和数据操作+HBase的架构体系+单例安装,记录了在Ubuntu下对HBase1.2.2的实践操作,H ...

随机推荐

  1. nsq 初试

    nsqlookupd tcp 4160 http 4161nsqd 4150nsqadmin 4171 1:安装$ brew install nsq1) 停止nsq默认的启动$ brew servic ...

  2. super()调用父类构造方法

    super()表示调用父类中的构造方法 1.子类继承父类,子类的构造方法的第一行,系统会默认编写super(),在调用子类的构造方法时,先调用父类的无参数构造方法 2.如果父类中只有有参数构造方法,那 ...

  3. Java:ConcurrentHashMap支持完全并发的读

    ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁.(事实上,ConcurrentHashMap支持完全并发的读以及一定程度并发的写.)如果使用传统的技术,如HashMa ...

  4. python 基础 ------字符串的调用详解(1)

    Python 字符串的的调用方法~~~ 废话不多说直接奔主题 >>>>>>>>>>>>>>>>> ...

  5. centos7 防火墙相关命令

    启动:systemctl start firewalld禁用:systemctl stop firewalld重新载入规则:firewall-cmd --reload查看所有打开的端口:firewal ...

  6. web应用与web框架

    一.web应用 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_request(client ...

  7. HelloWorld带我入门JAVA(一)

    基本环境配置可以百度完成,给个比较全面的网址http://c.biancheng.net/java/10/ 创建第一个java工程 通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 ...

  8. 解决Eclipse中无法直接使用Base64Encoder的问题(转载)

    资源出处:https://blog.csdn.net/u011514810/article/details/72725398 Base64的加密解密都是使用sun.misc包下的BASE64Encod ...

  9. Java实现zip压缩文件的解压

    需求描述: 前段时间写了一篇博客<Java实现对文本文件MD5加密并ftp传送到远程主机目录>,实现了一部分的业务需求.然而有些业务可能不止传送一个文件,有时候客户需要传多个文件,原有系统 ...

  10. socket的阻塞与非阻塞,同步与非同步

    网络编程中通常提到四种方式,同步/异步,阻塞/非阻塞.以下对它们的概念进行总结 1.同步/异步:主要针对C端 同步:所谓同步,就是在C端发出一个功能调用时,在没有得到结果之前,调用不返回,也就是必须一 ...