1. hbase数据模型

1.1. HBase数据模型术语

Table

HBase表由多行组成。

Row

HBase中的一行由一个行键和一个或多个列组成,列的值与这些列相关联。存储行时,按行键按字母顺序排列。因此,行键的设计非常重要。目标是以这样一种方式存储数据,即相关的行彼此接近。常见的行键模式是网站域。如果您的行键是域,您可能应该反向存储它们(org.apache.www, org.apache.mail, org.apache.jira)。这样,所有Apache域都在表中彼此接近,而不是基于子域的第一个字母展开。

Column

HBase中的列由列族和列限定符组成,列限定符由:(冒号)字符分隔。

Column Family

列族物理地混合了一组列及其值,通常是出于性能原因。每个列族都有一组存储属性,比如它的值是否应该缓存在内存中,它的数据是如何压缩的,或者它的行键是如何编码的,等等。表中的每一行都有相同的列族,尽管给定的行可能不会在给定的列族中存储任何内容。

Column Qualifier

列限定符被添加到列族中,以提供给定数据块的索引。给定一个列族内容,一个列限定符可能是content:html,另一个可能是content:pdf。虽然列族在创建表时是固定的,但是列限定符是可变的,并且在行之间可能会有很大的不同。

Cell

单元格是行、列族和列限定符的组合,并且包含一个值和时间戳,其中时间戳表示值(value)的版本。

Timestamp

时间戳与每个值一起写入,是值的给定版本标识符。默认情况下,时间戳表示写入数据时RegionServer上的时间,但在将数据放入单元格时可以指定不同的时间戳值。

1.2. 概念视图

下面的例子是BigTable论文第2页的一个稍微修改过的形式。有一个名为webtable的表,它包含两行(com.cn .www和com.example.www)和三个名为contents、anchor和people的列族。在本例中,对于第一行(com.cn.www), anchor包含两列(anchor:cssnsi.com, anchor:my.look.ca), contents包含一列(contents:html)。这个示例包含带有row key com.cn.www的行的5个版本,以及带有row key com.example.www的行的一个版本。contents:html列限定符包含给定网站的全部html。anchor列族的限定词每个都包含外部站点,该站点链接到由行表示的站点,以及在其链接的锚中使用的文本。people列族代表与站点相关的人员。

 Column Names:
按照惯例,列名由列族前缀和限定符组成。例如,contents:html由列族contents和html限定符组成。冒号(:)将列族从列族限定词中分隔开。

Table webtable

Row Key

Time Stamp

ColumnFamily contents

ColumnFamily anchor

ColumnFamily people

"com.cnn.www"

t9

 

anchor:cnnsi.com = "CNN"

 

"com.cnn.www"

t8

 

anchor:my.look.ca = "CNN.com"

 

"com.cnn.www"

t6

contents:html = "<html>…​"

   

"com.cnn.www"

t5

contents:html = "<html>…​"

   

"com.cnn.www"

t3

contents:html = "<html>…​"

   

"com.example.www"

t5

contents:html = "<html>…​"

 

people:author = "John Doe"

表中看起来为空的单元格在HBase中不占用空间,实际上也不存在。这就是HBase“稀疏”的原因。表格视图并不是查看HBase数据的唯一方法,甚至也不是最精确的方法。以下表示的信息与多维地图相同。这只是为了说明目的而做的一个模型,可能并不完全准确。

 {
"com.cnn.www": {
contents: {
t6: contents:html: "<html>..."
t5: contents:html: "<html>..."
t3: contents:html: "<html>..."
}
anchor: {
t9: anchor:cnnsi.com = "CNN"
t8: anchor:my.look.ca = "CNN.com"
}
people: {}
}
"com.example.www": {
contents: {
t5: contents:html: "<html>..."
}
anchor: {}
people: {
t5: people:author: "John Doe"
}
}
}

1.3. 物理视图

虽然在概念级别的表可以看作是稀疏的行集,但是它们是由列族物理存储的。一个新的列限定符(column_family:column_qualifier)可以在任何时候添加到现有的列。

ColumnFamily anchor

Row Key

Time Stamp

Column Family anchor

"com.cnn.www"

t9

anchor:cnnsi.com = "CNN"

"com.cnn.www"

t8

anchor:my.look.ca = "CNN.com"

ColumnFamily contents

Row Key

Time Stamp

ColumnFamily contents:

"com.cnn.www"

t6

contents:html = "<html>…​"

"com.cnn.www"

t5

contents:html = "<html>…​"

"com.cnn.www"

t3

contents:html = "<html>…​"

概念视图中显示的空单元格根本不存储。因此,对content:html列的请求在戳记t8时不会返回任何值。类似地,请求一个anchor:my.look.ca在时间戳t9上的值不会返回任何值。但是,如果没有提供时间戳,则返回特定列的最新值。由于时间戳是按降序存储的,所以对于多个版本,最近的版本也是第一个找到的版本。因此,请求一个行为com.cnn.www的所有列的值,如果没有指定时间戳那么为:contents:html的值来自时间戳t6,anchor:cnnsi.com的值来自时间戳t9,anchor:my.look.ca的值来自时间戳t8。

1.4. Table

表在模式定义时预先声明。

1.5. Row

行键是未解释的字节。行按字典顺序排序,表中第一个出现的顺序是最低的。空字节数组用于表示表名称空间的开始和结束。

1.6. Column Family

Apache HBase中的列被分组为列族。列族的所有列成员具有相同的前缀。例如,列courses:history和courses:math都是列族courses系列的成员。冒号(:)将列族从列族限定词中分隔开。列族前缀必须由可打印字符组成。限定尾(列族限定符)可以由任意字节组成。列族必须在模式定义时预先声明,而列不需要在模式定义时定义,但可以在表启动并运行时动态添加。

物理上,所有列族成员都存储在文件系统中。由于调优和存储规范是在列族级别执行的,因此建议所有列族成员具有相同的一般访问模式和大小特征。

1.7. Cells

一个{row, column, version}元组在HBase中确切地指定一个单元格。单元格内容是未解释的字节

1.8. Time Stamp

HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

1.9. Versions

一个{row, column, version}元组在HBase中确切地指定一个单元格。它可以有无限数量的单元格,其中行和列是相同的,但单元格地址仅在版本维度上不同。

虽然行和列键表示为字节,但是使用长整数指定版本。通常如此长的时间包含时间实例,例如java.util.Date.getTime()或System.currentTimeMillis()返回的时间,即当前时间与1970年1月1日午夜之间的差值(以毫秒为单位)。

HBase版本维度以递减顺序存储,因此在从存储文件中读取数据时,首先找到最近的值。

在HBase中,对于单元版本的语义有很多混淆。特别是:

  • 如果对一个单元格的多次写入具有相同的版本,那么只有最后一次写入是可读取的。
  • 以非递增的版本顺序编写单元格是可以的。

下面我们将描述当前HBase中的版本维度是如何工作的。有关HBase版本的讨论,请参阅HBase -2406。在HBase中弯曲时间可以很好地读取HBase的版本或时间维度。它比这里提供的更详细地介绍了版本控制。

1.9.1. Specifying the Number of Versions to Store

为给定列存储的最大版本数是列模式的一部分,在创建表时指定,或者通过alter命令指定,通过HColumnDescriptor.DEFAULT_VERSIONS。在HBase 0.96之前,默认保留的版本数量为3个,但是在0.96和更新版本中更改为1个。

Modify the Maximum Number of Versions for a Column Family

 这个例子使用HBase Shell来保持列族f1中所有列的最多5个版本。还可以使用HColumnDescriptor。
hbase> alter 't1', NAME => 'f1', VERSIONS =>

示例:

修改表user的info1列族VERSIONS信息

hbase(main):010:0> describe 'user'
Table user is ENABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'info1', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'info2', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'info3', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
3 row(s)
Took 0.1262 seconds
hbase(main):014:0* alter 'user' ,NAME => 'info1', VERSIONS => 5 # 注意:大小写敏感
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 2.3592 seconds
hbase(main):015:0> describe 'user'
Table user is ENABLED
user
COLUMN FAMILIES DESCRIPTION
{NAME => 'info1', VERSIONS => '5', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'info2', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
{NAME => 'info3', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DELETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMORY => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE', BLOCKCACHE => 'true', BLOCKSIZE => '65536'}
3 row(s)
Took 0.0814 seconds

  

添加数据并查看结果

 hbase(main)::> put 'user','','info1:name','zhang'
hbase(main)::> put 'user','','info1:name','zhang1'
hbase(main)::> put 'user','','info1:name','zhangsan'
hbase(main)::> put 'user','','info1:name','zhangsan2'
hbase(main)::> put 'user','','info1:name','lisi'
hbase(main)::> put 'user','','info1:name','zhaoliu'
### 产看结果
hbase(main)::> get 'user','',{COLUMN=>'info1',VERSIONS=>} # 注意:即使VERSIONS=>,也只显示5个,因为VERSIONS => ''
### 也可以指定列 get 'user','',{COLUMN=>'info1:name',VERSIONS=>}
COLUMN CELL
info1:name timestamp=, value=zhaoliu
info1:name timestamp=, value=lisi
info1:name timestamp=, value=zhangsan2
info1:name timestamp=, value=zhangsan
info1:name timestamp=, value=zhang1
row(s)
Took 0.0215 seconds

Modify the Minimum Number of Versions for a Column Family

 你还可以指定每个列族存储的版本的最小数量。默认情况下,该值被设置为0,这意味着该特性被禁用。下面的示例通过HBase Shell将列族f1中所有列的最低版本数设置为2。你也可以使用HColumnDescriptor。
hbase> alter 't1', NAME => 'f1', MIN_VERSIONS =>

从HBase 0.98.2开始,可以通过设置hbase.column.max.version为所有新创建的列保持最大版本数,指定全局默认值在hbase-site.xml中配置。参见hbase.column.max.version。

1.9.2. Delete

有三种不同类型的内部删除标记。

  • Delete:一个列的指定版本
  • Delete column:一个列的所有版本
  • Delete family: 用于特定ColumnFamily的所有列

当删除整个行时,HBase将在内部为每个ColumnFamily创建一个墓碑(而不是每一列)。

通过创建墓碑标记删除工作。例如,假设我们要删除一行。为此,您可以指定一个版本,或者默认使用currentTimeMillis。这意味着删除所有版本小于或等于这个版本的单元格。HBase从不在修改数据,因此例如delete不会立即删除(或标记为已删除)与delete条件对应的存储文件中的条目。相反,会写一个所谓的墓碑,将会掩盖删除的值。当HBase进行一次大的压实时,将对墓碑进行处理,实际地除去那些死值,以及墓碑本身。如果删除一行时指定的版本大于行中任何值的版本,则你可以认为删除完整的行。

1.9.3. Major compactions change query results

在t1、t2和t3上创建三个单元格版本,最大版本设置为2。因此,在获得所有版本时,只返回t2和t3处的值。但是如果删除t2或t3的版本,t1的版本将再次出现。很明显,一旦一个重要的压缩运行,这样的行为将不再是这样了…(参见HBase中弯曲时间的垃圾收集)。

1.10. Sort Order

所有数据模型操作HBase都以排序的顺序返回数据。首先是row,然后是ColumnFamily,然后是column qualifier,最后是timestamp(反向排序,所以首先返回最新的记录)。

1.11. Column Metadata

ColumnFamily实例没有存储的列元数据之外的内部KeyValue信息。因此,虽然HBase可以支持每行有大数量的列,但是多行之间的列差异,是你的责任去保持跟踪列名。

获得一个ColumnFamily的完整列集的唯一方法是处理所有的行。有关HBase如何在内部存储数据的更多信息,请参阅keyvalue。

1.12. Joins

HBase是否支持连接是列表中常见的问题,答案很简单:它不支持连接,至少不支持RDBMS连接的方式(例如,SQL中的等连接或外连接)。如本章所示,HBase中的读取数据模型操作是Get和Scan。

然而,这并不意味着应用程序中不支持等效连接功能,但是您必须自己完成。

Hbase-2.0.0_03_Hbase数据模型的更多相关文章

  1. 伪分布式hbase从0.94.11版本升级stable的1.4.9版本

    Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2    hbase 0.94.11                             ↓ had ...

  2. hbase 2.0.2 分布式安装配置/jar包替换

    环境 zk: 3.4.10 hadoop 2.7.7 jdk8 hbase 2.0.2 三台已安装配置好的hadoop002,hadoop003,hadoop004 1.上传并解压hbase-2.1. ...

  3. 八年技术加持,性能提升10倍,阿里云HBase 2.0首发商用

    摘要: 早在2010年开始,阿里巴巴集团开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储,HBase在几代阿里专家的不懈努力下,已经表现得运行更稳定.性能更高效 ...

  4. HBase(1.0.2) API数据模型

    几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...

  5. 【甘道夫】HBase(0.96以上版本号)过滤器Filter具体解释及实例代码

    说明: 本文參考官方Ref Guide,Developer API和众多博客.并结合实測代码编写.具体总结HBase的Filter功能,并附上每类Filter的对应代码实现. 本文尽量遵从Ref Gu ...

  6. HBase(0.96以上版本)过滤器Filter详解及实例代码

    说明: 本文参考官方Ref Guide,Developer API和众多博客,并结合实测代码编写,详细总结HBase的Filter功能,并附上每类Filter的相应代码实现. 本文尽量遵从Ref Gu ...

  7. 分布式实时日志系统(四) 环境搭建之centos 6.4下hbase 1.0.1 分布式集群搭建

    一.hbase简介 HBase是一个开源的非关系型分布式数据库(NoSQL),它参考了谷歌的BigTable建模,实现的编程语言为 Java.它是Apache软件基金会的Hadoop项目的一部分,运行 ...

  8. 基于:Hadoop 2.6.0-cdh5.4.0 hive1.1.0 HBase 1.0.0-cdh5.4.0 关键配置文件

    core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value ...

  9. HBase(0.94.5)的Compact和Split源码分析

    经过对比,0.94.5以后版本主要过程基本类似(有些新功能和细节增加) 一.       Compact 2.1.   Compact主要来源 来自四个方面:1.Memstoreflush时:2.HR ...

随机推荐

  1. 反调试手法之CreateProcess反调试

    反调试手法之CreateProcess反调试 在学习Win32 创建进程的时候.我们发现了有一个进程信息结构体. STARTUPINFO. 这个结构体可以实现反调试. 具体CreateProcess可 ...

  2. WIN7 环境下搭建 PHP7(64 位)操作步骤

    WIN7 环境下搭建 PHP7(64 位)操作步骤 一.安装与配置 Apache 1.下载 Apache下载地址:https://www.apachelounge.com/download/ 2.安装 ...

  3. break与continue,return结束循环区别

    break是跳出一层循环,continue是结束一趟循环 ,return才是结束所有层循环! 如果有多层for循环,break会跳出当前这一层,去执行最外层循环(而不是退出所有层循环);而contin ...

  4. Java学习笔记之——常用快捷键(eclipse)

    * Ctrl+C 复制 * Ctrl+V 粘贴 * Ctrl+A 全选 * Ctrl+S 保存 * Ctrl+Z 撤销 * Ctrl+Y 还原 * Ctrl+X 剪切 * Ctrl+F   查找 * ...

  5. 【Spring】13、使用Spring 3的@value简化配置文件的读取

    Spring 3支持@value注解的方式获取properties文件中的配置值,大简化了读取配置文件的代码. 1.在applicationContext.xml文件中配置properties文件 & ...

  6. 基于mave的dubbo分别架构

    开始前,先看一下demo项目工程结构: 1.抽离接口 dubbo-api工程,根据业务抽离接口,deploy到mave nexus. public interface TestService { /* ...

  7. HDU5887(SummerTrainingDay01-D)

    Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. blfs(systemv版本)学习笔记-编译安装配置dhcpcd

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! dhcpcd项目地址:http://www.linuxfromscratch.org/blfs/view/8.3/basicne ...

  9. 2018-02-06 编程猫IDE体验:对Scratch的改进

    前两天偶遇编程猫推介(为什么没有中文的编程?), 第一眼感觉像Scratch, 求证之下确实, 并且据说有改良. 今天非常粗浅地尝试一下, 限于水平没有做出很炫的效果, 不过颇有些发现. 首先上最终效 ...

  10. 【读书笔记】iOS-Settings Bundle

    一,打开工程--->右键--->Add File--->iOS-->Resource-->Settings Bundle. 二,会弹出如下对话框---->Creat ...