HBase的Write Ahead Log (WAL) —— API与基本概念
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与基本概念的更多相关文章
- HBase的Write Ahead Log (WAL) —— 整体架构、线程模型
解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回放机制.每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中. 如果出 ...
- HBase的Write Ahead Log (WAL) —— 整体架构、线程模型【转】
转自:http://www.cnblogs.com/ohuang/p/5807543.html 解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回 ...
- HBase的Write Ahead Log (WAL)
HBase的Write Ahead Log (WAL) 一.预写日志WAL(Write-Ahead-Log) HLog HLogKey LogFlusher LogRoller Replay 问题 二 ...
- RocksDB 之Write Ahead Log(WAL)
Overview RocksDB 中有三个基本的数据结构概念:memtable, sstfile 和 logfile memtable 是个内存数据结构,新写入会插入memtable 切回选择性地写入 ...
- 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 ...
- HBase源码分析之WAL
WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能.在hbase中写入数据时,会将数据写入内 ...
- JAVA—API和SPI概念
JAVA—API和SPI概念 目录 概念 JDBC实例 自己实现一个SPI 总结 概念英文: What is the difference between Service Provider Inter ...
- 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 ...
- HBase操作(Shell与Java API)
版权声明:本文为博主原创文章,未经博主允许不得转载. 转: http://blog.csdn.net/u013980127/article/details/52443155 下面代码在Hado ...
随机推荐
- VS快速生成JSON数据格式对应的实体
有固定好的Json数据格式,你还在手动敲对应的实体吗?有点low了!步入正题,这是一个json字符串,先去验证JSON数据格式(http://www.bejson.com/)如下: { & ...
- XPath、XQuery 以及 XSLT 函数
存取函数 名称 说明 fn:node-name(node) 返回参数节点的节点名称. fn:nilled(node) 返回是否拒绝参数节点的布尔值. fn:data(item.item,...) 接受 ...
- NDK开发-Android Studio+gradle-experimental开发ndk
在最新的Android Studio2.2的preview版中,增加全新的ndk支持,使用了新的gradle,以及DSL语言. 新的NDK需要使用新的Gradle插件和新的Android插件来支持! ...
- 从oracle数据库中导出excel问题导致乱码的问题
使用plsqldev工具将oracle的查询结果导出为excel,结果可以成功导出,但是使用libreoffice进行查看时,有好多记录都是空的. 使用python进行导出(openpyxl模块进行e ...
- springMVC使用@ResponseBody返回json
json格式:{"totle":22,"rows":"sss"} map格式:{totle=22, rows=sss} 一.springMV ...
- <connectionStrings> <appSettings> 读取方法
C#中ConnectionStrings和AppSettings的区别 时间 2013-03-07 15:57:00 博客园精华区 原文 http://www.cnblogs.com/bindot ...
- AngularJs的UI组件ui-Bootstrap---tabs控件
tabs控件使用uib-tabset指令和uib-tab指令,效果是这样的: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo ...
- oracle的IMU和ora-01555
IMU: 01555: 按照上图找啊找,已经提交事物的undo块找不到了,就产生01555错误,解决这样问题:1. 确保undo表空间数据的保留时间至少大于最长sql语句的时间 2. 增大undo表空 ...
- Motor XT615 开机无限卡屏重启的取证与分析
hello,大家好! 今天我给大家你们带来摩托罗拉 XT615 开机无限卡屏重启的取证与分析, 手机开机后卡屏,一直停留下面这画面,无限重启! 接下来,经过我们工程师的分析,图上报错必定由于机身程序太 ...
- logstash输出到influxdb
用了这个logstash扩展 https://github.com/PeterPaulH/logstash-influxdb/blob/master/src/influxdb.rb 把这个文件放到 l ...