HBase学习总结(3):HBase的数据模型及工作机制

原创 2015年07月06日 19:00:28

一、HBase数据模型
HBase模式里的逻辑实体包括:
(1)表(table):HBase用表来组织数据。表名是字符串(String),由可以在文件系统路径里使用的字符组成。
(2)行(row):在表里,数据按行存储。行由行键(rowkey)唯一标识。行键没有数据类型,总是视为字节数组byte []。
(3)列族(column family):行里的数据按照列族分组,列族也影响到HBase数据的物理存放,因此,它们必须事前定义并且不轻易修改。表中每行拥有相同列族,尽管行不需要在每个列族里存储数据。列族名字是字符串(String),由可以在文件系统路径里使用的字符组成。
(4)列限定符(column qualifier):列族里的数据通过列限定符或列来定位。列限定符不必事前定义,列限定符不必在不同行之间保持一致。就像行键一样,列限定符没有数据类型,总是视为字节数组byte []。
(5)单元(cell):行键、列族和列限定符一起确定一个单元。存储在单元里的数据称为单元值(value)。值也没有数据类型,总是视为字节数组byte []。
(6)时间版本(version):单元值有时间版本。时间版本用时间戳标识,是一个long。没有指定时间版本时,当前时间戳作为操作的基础。HBase保留单元值时间版本的数量基于列族进行配置,默认数量是3个。
HBase的每个数据值使用坐标来访问。一个值的完整坐标包括行键、列族、列限定符和时间版本。由于把所有坐标视为一个整体,因此HBase可以看作是一个键值(key-value)数据库。

例如,在《HBase学习总结(2):HBase介绍及其基本操作》(http://blog.csdn.net/zhouzhaoxiong1227/article/details/46682291)中:
(1)表名是“mytable”。
(2)行是“first”、“second”和“third”。
(3)列族是“cf”。
(4)列限定符是“info”、“name”和“nation”。
(5)单元值是“hello hbase”、“zhou”和“China”。
(6)时间戳是“1435548279711”、“1435548751549”和“1435548760826”。

二、HBase工作机制
1.HBase写路径
在HBase中无论是增加新行还是修改已有的行,其内部流程都是相同的。默认情况下,执行写入时会写到两个地方:预写式日志(write-ahead log,WAL,也称HLog)和MemStore。HBase的默认方式是将写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化信息都写入并确认之后,才认为写动作完成。写入过程如图1所示。
这里写图片描述
图1 HBase同时向WAL和MemStore执行写入
MemStore是内存里的写入缓冲区,HBase中数据在永久写入磁盘之前在这里积累。当MemStore填满之后,其中的数据会刷写到硬盘,生成一个HFile。HFile是HBase使用的底层存储格式。HFile对应于列族,一个列族可以有多个HFile,但一个HFile不能存储多个列族的数据。在集群的每个节点上,每个列族有一个MemStore。MemStore生成HFile的过程如图2所示。
这里写图片描述
图2 MemStore生成HFile
如果MemStore还没有刷写,服务器就崩溃了,内存中没有写入硬盘的数据就会丢失。HBase的应对办法是在写动作完成之前先写入WAL。HBase集群中每台服务器维护一个WAL来记录发生的变化。WAL是底层文件系统上的一个文件。直到WAL新记录成功写入后,写动作才会被认为成功完成。这可以保证HBase和支撑它的文件系统满足持久性。大多数情况下,HBase使用Hadoop分布式文件系统(HDFS)来作为底层文件系统。
如果HBase服务器宕机,没有从MemStore里刷写到HFile的数据将可以通过回放WAL来恢复。你不需要手工执行。HBase的内部机制中有恢复流程部分来处理。每台HBase服务器有一个WAL,这台服务器上的所有表(和它们的列族)共享这个WAL。
值得注意的是,不写入WAL会在RegionServer故障时增加丢失数据的风险。关闭WAL,出现故障时HBase可能无法恢复数据,没有刷写到硬盘的所有写入数据都会丢失。

2.HBase读路径
如果想快速访问数据,通用的原则是数据保持有序并尽可能保存在内存里。HBase实现了这两个目标,大多数情况下读操作可以做到毫秒级。HBase读动作必须重新衔接持久化到硬盘上的HFile和内存中MemStore里的数据。HBase在读操作上使用了LRU(最近最少使用算法)缓存技术。这种缓存也叫做BlockCache,和MemStore在一个JVM堆里。BlockCache设计用来保存从HFile里读入内存的频繁访问的数据,避免硬盘读。每个列族都有自己的BlockCache。
掌握BlockCache是优化HBase性能的一个重要组成部分。BlockCache中的Block是HBase从硬盘完成一次读取的数据单位。HFile物理存放形式是一个Block的序列外加这些Block的索引。这意味着,从HBase里读取一个Block需要先在索引上查找一次该Block,然后从硬盘读出。Block是建立索引的最小数据单位,也是从硬盘读取的最小数据单位。Block大小按照列族设定,默认值是64KB。根据使用场景你可能会调大或者调小该值。Block变小会导致索引变大,进而消耗更多内存;Block变大意味着索引项变少,索引变小,因此节省内存。
从HBase中读出一行,首先会检查MemStore等待修改的队列,然后检查BlockCache看包含该行的Block是否最近被访问过,最后访问硬盘上的对应HFile。整个读入过程如图3所示。
这里写图片描述
图3 HBase读入过程
注意,HBase存放某个时刻MemStore刷写时的快照,一个完整行的数据可能存放在多个HFile中。为了读出完整行,HBase可能需要读取包含该行信息的所有HFile。

3.HBase的合并
删除命令并不是立即删除内容,它只是给记录打上了删除的标记。就是说,针对那个内容的一条“墓碑”(tombstone)记录写入进来,作为删除的标记。墓碑记录用来标志删除的内容不能在get和scan命令中返回结果。因为HFile文件是不能改变的,直到执行一次大合并,这些墓碑记录才会被处理,被删除记录占用的空间才会被释放。
合并分为两种:大合并(major compaction)和小合并(minor compaction)。两种将会重整存储在HFile里的数据。小合并把多个小HFile合并生成一个大HFile。因为读出一条完整的行可能引用很多文件,限制HFile的数量对于读性能很重要。执行合并时,HBase读出已有的多个HFile的内容,把记录写入一个新文件。然后,把新文件设置为激活状态,删除构成这个新文件的所有老文件。HBase根据文件的号码和大小决定合并哪些文件。小合并设计出发点是轻微影响HBase的性能,所以涉及的HFile的数量有上限。这些都可以设置。小合并的示意如图4所示。
这里写图片描述
图4 小合并的示意图
大合并将处理给定region的一个列族的所有HFile。大合并完成后,这个列族的所有HFile合并成一个文件。可以从Shell中手工触发整个表(或者特定region)的大合并。这个动作相当耗费资源,不要经常使用。另一方面,小合并是轻量级的,可以频繁发生。大合并是HBase清理被删除记录的唯一机会。因为我们不能保证被删除的记录和墓碑标记记录在一个HFile里面,而大合并可以确保同时访问到两种记录。


本人微信公众号:zhouzxi,请扫描以下二维码:
这里写图片描述

版权声明:本文为博主原创文章,对文章内容有任何意见或建议,欢迎与作者单独交流,作者QQ(微信):245924426。 举报

相关文章推荐

HBase 数据模型

HBase,也是Apache HBase,是一个分布式、列存储的数据库,HBase是根据谷歌的BigTable理论开发,就像是谷歌的BigTable在Google文件系统之上发挥的作用一样,HBas...

Hbase总结(十)Hhase性能调优

因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果。所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正。 配置优化...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Hbase总结(八)Hbase中的Coprocessor

1.起因(Why HBase  Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(统计数据表的总...

HBase数据模型解析和基本的表设计分析

最近在学习HBase的使用,并仔细阅读了一篇官方推荐的博客,在这里就以一边翻译一边总结的方式和大家一起梳理一下HBase的数据模型和基本的表设计思路。 官方推荐的博客原文地址:http://0b4af...

HBase总结(十一)hbase Java API 介绍及使用示例

问题导读 1.java api与数据模型是如何对应的? 2.那两个类与HBase数据库有关系? 3.HTable可以用来做什么? 4.如何添加列族、列、列值? 5.hbase查询有几种方式? ...

HBase之数据模型(DataModel)

HBase基于Google的BigTable构建,是一种column-orientednosql数据库 1.模型视图 1.1概念视图 从概念模型上看,HBase的存储逻辑同关系数据库类似,是基于...

Hbase总结(六)hbase37个笔试题

以下试题是摘自互联网的基础上自己加了选项说明解释便于自己以后看时方便节省时间 1. HBase来源于哪篇博文? C A The Google File System B MapReduce...

HBase总结(九)Bloom Filter概念和原理

Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某...

Hbase总结(五)-hbase常识及habse适合什么场景

当我们对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用使用什么数据库?答案是什么,如果我们使用的传统数据库,肯定留有多余的字段,10个不行,20个,但是这个严重影响了质量。并且如...

HBase (1)---数据模型

HBase 是一个针对结构化数据的可伸缩、分布式和面向列的动态模式数据库。它能有效和可靠地管理分布在数千个商品服务器上的大规模数据(千兆兆字节或更多)。 HBase 根据 Google 的 Big...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)