HBase的数据写入操作,会先记录到HLog中,再真正写入到MemStore中。
前者是对写入友好的格式,后者是对查询友好的格式。所以前者吞吐量更高,写入成功率大,提高了系统的可靠性,“基本”可以实现宕机后继续没有完成的数据更新操作。

API

WAL interface提供了对外的WAL API。

其中最常用的方法是append()。

long append(HRegionInfo info, WALKey key, WALEdit edits, boolean inMemstore) throws IOException;

它追加写入一系列WALEdit。

API的调用方

每一个HBase region有一个单独的WAL interface的实例:

HBase客户端 == Protobuf协议 ==> HRegionServer.execRegionServerService() => MultiRowMutationProtos.callMethod() => MultiRowMutationProtos.mutateRows()=> MultiRowMutationEndpoint.mutateRows() => HRegion.processRowsWithLocks() =>HRegion.doWALAppend()会写入WAL。

HRegion.processRowsWithLocks()是HRegion更新操作的总控方法——驱动了 获取所、写入WAL、写入MemStore 这一流程。

原子性

为了实现HBase写入一行里的多个列时的原子性,对一行上所有列(即所有KeyValue)的更新操作,都包含在同一个WALEdit对象中:

所以WALEdit中最主要的成员变量,是一系列KeyValue(也就是Cell)的集合:

AbstractFSWAL —— 为基于文件系统的WAL实现,提供通用支持

AbstractFSWAL.findRegionsToForceFlush() - 返回当前WAL实例中最老的文件所包含的、还完全被Flush掉的Region

所谓Flush应该是指将这个Region的业务数据从MemStore写入Store。

如果一个Region被Flush了,那么其业务数据已经落地到了HFile中。则这个Region的WAL日志(数据操作记录)就没有必要存在了,可以删除,以腾出磁盘空间。

AbstractFSWAL.findRegionsToForceFlush() 用于找到已经被Flush的、相应WAL日志可以被删除的Region。

1. 从AbstractFWSAL.byWalRegionSequenceIds找到第一个文件。

ConcurrentNavigableMap<Path, Map<byte[], Long>> byWalRegionSequenceIds 维护了当前WAL的所有文件,以及每个文件所涉及的Region (包括Region的byte[]名称和这个Region中最后一次append操作的sequence id)

即 Path (WAL文件名) =>  (byte[] Region名称, Long sequence id)

2. 从第一个文件,找到它的所有Region中,哪些还没有被Flush

ConcurrentMap<byte[], ConcurrentMap<byte[], Long>> AbstractFWSAL.SequenceIdAccounting.lowestUnflushedSequenceIds 维护了byte[] Region名称 + byte[] family名称 到第一个(即最小的)没有被Flush的sequence id的映射,称为lowestUnflushedSequenceId。这里,每一次append操作对应一个自增的sequence id。所有大于等于lowestUnflushedSequenceId的sequence id,其对应的append操作都没有被Flush。

因此对于第一步得到的第一个WAL日志文件所涉及的所有Region, 和每个Region的最大sequence id,如果这个最大的sequece id大于这个Region的lowestUnflushedSequenceId,说明这个Region有WAL日志还没有被Flush。那么这个Region就会被包含在findRegionsToForceFlush()的结果中。

HBase的Write Ahead Log (WAL) —— API与基本概念的更多相关文章

  1. HBase的Write Ahead Log (WAL) —— 整体架构、线程模型

    解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回放机制.每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中. 如果出 ...

  2. HBase的Write Ahead Log (WAL) —— 整体架构、线程模型【转】

    转自:http://www.cnblogs.com/ohuang/p/5807543.html 解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回 ...

  3. HBase的Write Ahead Log (WAL)

    HBase的Write Ahead Log (WAL) 一.预写日志WAL(Write-Ahead-Log) HLog HLogKey LogFlusher LogRoller Replay 问题 二 ...

  4. RocksDB 之Write Ahead Log(WAL)

    Overview RocksDB 中有三个基本的数据结构概念:memtable, sstfile 和 logfile memtable 是个内存数据结构,新写入会插入memtable 切回选择性地写入 ...

  5. SparkStreaming “Could not read data from write ahead log record” 报错分析解决

    # if open wal org.apache.spark.SparkException: Could not read data from write ahead log record FileB ...

  6. HBase源码分析之WAL

    WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能.在hbase中写入数据时,会将数据写入内 ...

  7. JAVA—API和SPI概念

    JAVA—API和SPI概念 目录 概念 JDBC实例 自己实现一个SPI 总结 概念英文: What is the difference between Service Provider Inter ...

  8. HBase 6、用Phoenix Java api操作HBase

    开发环境准备:eclipse3.5.jdk1.7.window8.hadoop2.2.0.hbase0.98.0.2.phoenix4.3.0 1.从集群拷贝以下文件:core-site.xml.hb ...

  9. HBase操作(Shell与Java API)

    版权声明:本文为博主原创文章,未经博主允许不得转载.     转: http://blog.csdn.net/u013980127/article/details/52443155 下面代码在Hado ...

随机推荐

  1. C# 连接Oracle ,免安装客户端

    在.NET平台下开发Oracle应用的小伙伴们肯定都知道一方面做Oracle开发和实施相比SqlServer要安装Oracle客户端(XCopy.自己提取相关文件也有一定复杂性),另一方面相比JAVA ...

  2. 使用Vue构建中(大)型应用

    init 首先要起一个项目,推荐用vue-cli安装 $ npm install -g vue-cli $ vue init webpack demo $ cd demo $ npm install ...

  3. Windows Phone 十七、Socket

    Socket 常用类型 StreamSocket:Socket对象 StreamSocketListener:Socket监听对象,适用于服务端 服务端代码 <Grid x:Name=" ...

  4. [MacOS] 终端使用ssh时,中文乱码问题处理

    终端显示中文问题处理: vim ~/.inputrc 加入以下代码 set meta-flag on set convert-meta off set input-meta on set output ...

  5. 初始化datetimepicker的时候就报了js异常

    全栈眼中的http这一章分别从前端视角和后端视角来分析前后端所关注的侧重点.前端可以通过抓包工具或者chrome devtools 查看每个请求,同域下的资源请求数量等来找出优化点,更关注的是一个页面 ...

  6. YbSoftwareFactory 代码生成插件【十五】:Show 一下最新的动态属性扩展功能与键值生成器功能

    YbSoftwareFactory 各种插件的基础类库中又新增了两个方便易用的功能:动态属性扩展与键值生成器,本章将分别介绍这两个非常方便的组件. 一.动态属性扩展 在实际的开发过程中,你肯定会遇到数 ...

  7. iOS多线程同步锁

    在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安全 @s ...

  8. hadoop-2.6.0-src源码导入Eclipse 转载

    转载地址:http://m.blog.csdn.net/blog/le119126/42009281 一.导入 先修改源码 参考 二.改错里面的第3条 1.cd到 hadoop-2.6.0-src/h ...

  9. 利用反射+AOP,封装Basehandler

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点, ...

  10. 用hexdump获取event的输出信息

    当我们在调试输入设备时,如:键盘,触摸屏 会使用到hexdump工具.其内容如下: 1. 键盘: # cat /dev/input/event0 | hexdump 0000000 f6a6 4e15 ...