1.概述 
客户端往RegionServer端提交数据的时候,会写WAL日志,只有当WAL日志写成功以后,客户端才会被告诉提交数据成功,如果写WAL失败会告知客户端提交失败,换句话说这其实是一个数据落地的过程。在一个RegionServer上的所有的Region都共享一个HLog,一次数据的提交是先写WAL,再写memstore,示意图如下 
 

2.HLog Class 
WAL的实现类是HLog,当一个Region被初始化的时候,一个HLog的实例会作为构造函数的参数传进去。当Region在处理Put、Delete等更新操作时,可以直接使用该共享的HLog的append方法来落地数据。Put、Delete在客户端上可以通过setWriteToWAL(false)方法来关闭该操作的日志,这么做虽然可以提升入库速度,但最好别这么做,因为有数据丢失的风险存在。 
HLog的另一个重要功能是跟踪变化,这个通过sequence number来实现。sequence number作为HFile里的一个元数据字段,它用来跟踪哪些日志是已经持久化了的,哪些还在内存中。(注:通过对源码的分析,这种变化因为每个Region是不一样的,所以在HLog的日志里是记录了多条,是针对于每个Region来记录的,把该Region的最后一次持久化的seqId作为一条日志写入HLog,这样,比该seqId小的数据就是已经持久化过的了。)(照这种分析,在HLog replay的过程中,岂不是从后往前replay日志更方便么?有待学习replay的实现方式来验证) 

 
这个图表明同一个RegionServer上的三个Region共享一个HLog,因此当它们写数据时,是把<HLogKey,WALEdit>这个的数据对按顺序混合的写到HLog上的,以获得最好的写入速度。 

3.HLogKey Class 

WAL现在是通过Hadoop的SequenceFile来存储key/value集合。value简单的存储了来自客户端的数据如row key, column family, column qualifier, timestamp, type, and value;而HLogKey则存储了the region and table name、还有更新时间、sequence number和cluster ID,cluster ID用于将日志复制到集群里的其他机器上。 

4.WALEdit Class 
来自客户端的更新数据的请求被封装到WALEdit类上。这个类把对row数据的修改原子化。(怎么原子化的还得看源码) 
5.LogSyncer Class 
Table在创建的时候,有一个参数可以设置,是否每次写Log日志都需要往集群里的其他机器同步一次,默认是每次都同步,同步的开销是比较大的,但不及时同步又可能因为机器宕而丢日志。 
Pipeline vs. n-Way Writes 
同步的操作现在是通过Pipeline的方式来实现的,Pipeline是指datanode接收数据后,再传给另外一台datanode,是一种串行的方式;n-Way Writes是指多datanode同时接收数据,最慢的一台结束就是整个结束。差别在于一个延迟大,一个并发高,hdfs现在正在开发中,以便可以选择是按Pipeline还是n-Way Writes来实现写操作。 
Table如果设置每次不同步,则写操作会被RegionServer缓存,并启动一个LogSyncer线程来定时同步日志,定时时间默认是一秒也可由hbase.regionserver.optionallogflushinterval设置 

5、HLog的几个特点
 WAL(Write-Ahead-Log)是HBase的RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志。在每次Put、Delete等一条记录时,首先将其数据封装成〉,append到RegionServer对应的 HLog文件的过程。它有几个重要的特点:
    1、RegionServer上所有的Region共享HLog文件;也就是RegionServer的个数与HLog是一一对应的,为什么不选择每个Table对应一个HLog的原因是,通过RegionServer的个数可以衡量分布式系统的规模,这是系统运维可以控制的因素,而Table的个数和大小完全是由应用层来决定。极端情况下,我们的HBase集群可能只有一张大表 (每天10亿规模的读写),而可能需要上百个节点搭建HBase集群,在这种情况下,按照RegionServer记录一个HLog的意义就凸现出来了。 同样的道理可以解释,为什么要把所有的Region的log都插入同一个文件。


图 1 RegionServer内WAL文件与Region的关系图

2、HLog也是记录在HDFS上;这一个众所周知的问题,这里提出来的原因在于,在大多数情况下它成为了影响了HBase写操作吞吐的重要因素。如图2、3显示,在对表格进行批量删除数据时,每次操作时不写HLog比写HLog,性能要好大概10~20倍。而且正是由于写HDFS的原因,可以看到大概有些点的性能偏离平均值2倍以上的性能。对于图2写WAL而言,这些点大部分属于写HDFS响应的时间的异常点。在HBase-0.92版本中,使用的append操作在hdfs底层其实是一种write操作,而这种操作在遇到超过block预设大小时,会有一次和NameNode的操作,另外在高负载的HDFS集群上,写速度波浪式的,不会持续保持稳定,而这种不稳定对于像append这样的操作,最终在反复测试时,就会表现出现偏离平均值2倍以上的1%现象。相比较而言,图3由于没有写WAL,可以看到它不仅在平均性能上表现更好,也在稳定性上更胜一筹,它的抖动出现在MemStore向HDFS刷数据的时间点上。显然,在MemStore足够大的情况下,这种波动是可以预期的,甚至也是很多应用可以容忍的。

图 2写WAL批量删除数据的性能图

图 3不写WAL批量删除数据的性能图

写WAL还是不写WAL,在一定程度上确实会给系统性能产生了很大影响,根据HBase内部设计,WAL是一种规避数据丢失风险的一种补偿机制,如果应 用可以容忍一定的数据丢失的风险,可以尝试在更新数据时,关闭写WAL。下一篇文章,会介绍使用不写WAL删除数据失效的场景。

3、HLog是系统稳定的重要依据。在一个HRegionServer的存活周期内,可能因为长时间的Stop-The-World GC,或者因为它所依赖的HDFS或者ZooKeeper,出现下线的情况,对于一个高负载的HBase生产集群而言,这是一个非常常见的现象。对于RegionServer的下线,往往通过jps监控进程存活和nc –z来监控关键服务端口的存活状态来验证服务的状态,保证让下线的RegionServer尽快恢复,保证原HBase集群的整体负载的吞吐。在RegionServer下线这个过程中,是HBase内部最核心部件工作的关键时期,简单总结一下RegionServer下线后内核处理流程如下:

  • (1) HMaster从ZooKeeper捕获到对应RegionServer的znode被删除,将其放入ServerManager的DeadSevers列表中。
  • (2)启动ServerShutdownHandler,进入该handler的处理流程中。
  • (3)SplitLogManager对原RegionServer的HLog文件夹内的Hlog文件提交到zookeeper的splitlog路径下。(注意,HLog存在Roll操作,造成了Hlog文件夹内可能存在多个hlog文件)。
  • (4)SplitLogManager等待RegionServer上的SplitLogWorker认领任务,并在任务完成之后,进入Region Assign流程。每个SplitLogWorker都会经历将HLog上出现的所有Region分别以文件的形式存储,在hbase所在hdfs根目录下splitlog文件夹内,会以RegionServer认领一个某个下线的RegionServer的HLog为文件夹名,包含按照Region分散开来的Hlog文件集。
  • (5)HMaster的AssignmentManager从.META.以及当前处于InTransaction状态的集合中,计算出需要Assign的Region,然后通过getRegionPlan获得将该Region迁移的目的地址,并修改Region状态从Offline变成OPENING。然后AssignmentManager就进入了状态机的处理流程中。
  • (6)被选中目的地的Region,Master通过RPC让其执行openRegion操作,RegionSever使用HRegion.openRegion,会首先经历一次replayRecoveredEditsIfAny,将那些散落在splitlog下各个worker处理过的Region的Hlog信息加载过来,并执行replay。
  • (7)所有相关的Region处理完毕,这样一个RegionServer下线的影响就结束了。在这段时间内,相应Region的读写操作全部暂停。你如果客户端写得比较友好,Region上线有足够快的话,对于客户端而言,相当于一次服务抖动,只是这个抖动有点大。

从这个流程中可以看出,虽然HLog采用了Distributed Split来加快切分,但是这里Hlog的稳定仍然是服务稳定性重要因素。因此,有一项比较有趣的事情时,我们完全可以做一个备用的RegionServer来轮询是否有RegionServer处于下线状态,一旦处于下线状态,就按照只读的方式来加载相应的Region,这样至少可以保证在RegionServer下线,可以保证数据服务的一定的可用性。

HBase WAL原理学习的更多相关文章

  1. hadoop学习第七天-HBase的原理、安装、shell命令

    一. hbase的原理知识 1. hbase介绍 hbase是hadoop的一个重要成员,主要用于存储结构化数据,构建在hdfs之上的分布式存储系统,它主要通过横向扩展,通用不断增加廉价服务器增加计算 ...

  2. Hadoop 综合揭秘——HBase的原理与应用

    前言 现今互联网科技发展日新月异,大数据.云计算.人工智能等技术已经成为前瞻性产品,海量数据和超高并发让传统的 Web2.0 网站有点力不从心,暴露了很多难以克服的问题.为此,Google.Amazo ...

  3. Hbase技术详细学习笔记

    注:转自 Hbase技术详细学习笔记 最近在逐步跟进Hbase的相关工作,由于之前对Hbase并不怎么了解,因此系统地学习了下Hbase,为了加深对Hbase的理解,对相关知识点做了笔记,并在组内进行 ...

  4. Hbase概念原理扫盲

    一.Hbase简介 1.什么是Hbase Hbase的原型是google的BigTable论文,收到了该论文思想的启发,目前作为hadoop的子项目来开发维护,用于支持结构化的数据存储. Hbase是 ...

  5. HBase 底层原理详解(深度好文,建议收藏)

    HBase简介 HBase 是一个分布式的.面向列的开源数据库.建立在 HDFS 之上.Hbase的名字的来源是 Hadoop database,即 Hadoop 数据库.HBase 的计算和存储能力 ...

  6. (转)HBase 的原理和设计

    转自:HBase的原理和设计 HBase架构:

  7. IIS原理学习

    IIS 原理学习 首先声明以下内容是我在网上搜索后整理的,在此只是进行记录,以备往后查阅只用. IIS 5.x介绍 IIS 5.x一个显著的特征就是Web Server和真正的ASP.NET Appl ...

  8. zookkeper原理学习

    zookkeper原理学习  https://segmentfault.com/a/1190000014479433   https://www.cnblogs.com/felixzh/p/58692 ...

  9. GIS原理学习目录

    GIS原理学习目录 内容提要 本网络教程是教育部“新世纪网络课程建设工程”的实施课程.系统扼要地阐述地理信息系统的技术体系,重点突出地理信息系统的基本技术及方法. 本网络教程共分八章:第一章绪论,重点 ...

随机推荐

  1. ZooKeeper系列(二)—— Zookeeper 单机环境和集群环境搭建

    一.单机环境搭建 1.1 下载 下载对应版本 Zookeeper,这里我下载的版本 3.4.14.官方下载地址:https://archive.apache.org/dist/zookeeper/ # ...

  2. Netbeans courier new 乱码问题

    Netbeans 默认的字体 monospaced,显示英文的单引号及字体非常的不好看,在网上查了下资料可以变得很好看. 1.仍然保持默认字体 monospaced 2.在Netbeans 的安装目  ...

  3. 前端小知识-html5

    一.伪类与伪元素 为什么css要引入伪元素和伪类:是为了格式化文档树以外的信息,也就是说,伪类和伪元素是用来修饰不在文档树中的部分 伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根 ...

  4. 如何在不到12天的时间里将网站权重优化到1(纯白帽SEO方法)

    之前操作了一个IDC网站,不到1个月的时间把网站的权重从0做到了1,本来想写篇文章分享相关的操作经验.后来因为网站整体规划的原因,IDC网站需要关闭一段时间做备案的更新,排名肯定就会掉了,然后怕大家看 ...

  5. go 学习笔记之详细说一说封装是怎么回事

    关注公众号[雪之梦技术驿站]查看上篇文章 猜猜看go是不是面向对象语言?能不能面向对象编程? 虽然在上篇文章中,我们通过尝试性学习探索了 Go 语言中关于面向对象的相关概念,更确切的说是关于封装的基本 ...

  6. 100天搞定机器学习|day44 k均值聚类数学推导与python实现

    [如何正确使用「K均值聚类」? 1.k均值聚类模型 给定样本,每个样本都是m为特征向量,模型目标是将n个样本分到k个不停的类或簇中,每个样本到其所属类的中心的距离最小,每个样本只能属于一个类.用C表示 ...

  7. .NET导出Excel的四种方法及评测

    .NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...

  8. ElasticSearch:常用的基础查询与过滤器

    match_all(获取所有索引文档) quert_string(获取包含指定关键字文档) 默认查询_all字段,_all字段是由所有字段组合而成的,可以通过description:关键字,获取通过请 ...

  9. 编程题及解题思路(1,String)

    题目描述 请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,F ...

  10. unity_小功能实现(敌人追踪主角)

    1.敌人发现主角有两种形式: a.看见主角(主角出现在敌人的视野之内) b.听见主角(听见主角走路声或者是跑步声) a:看(see) 首先判断主角是否在敌人视野角度内,那么我们只需要判断B<0. ...