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. Hystrix隔离策略

    Hystrix的资源隔离策略分为两种:线程池和信号量.说到资源隔离,我们就要明白为什么需要资源隔离. 在一个分布式系统中,服务之间都是相互调用的,如下图所示:例如,我们容器(Tomcat)配置的线程个 ...

  2. Android FileObserver 实现原理(inotify)

    目录 0x0前言 0x01 FileObserver 使用实例 0x02 FileObserver 实现原理 0x04 完整Demo下载地址 0x0前言 之前在分析某个Android平台加固壳子的时候 ...

  3. iOS ipa包瘦身,iOS8及以下text段超60MB

    前沿 很早之前写过一篇相关文章,不过博客主机上跑路了之后数据没了,凭着记忆补了下相关资料 ipa安装包瘦身 清理无用图片,图片压缩(PNG换WebP和JPG),处于某种不可抗拒的原因,导致有部分3X图 ...

  4. 西门子PLC SCL语言开发学习笔记(二)

    今天来讲下scl两个关键的点 一.按键事件 比如地址I0.0是某个按钮的状态,他只有True和False两个状态,所以我们要获得按下事件需要我们自己模拟. #KeyPress := "Btn ...

  5. .14-浅析webpack源码之Watchpack模块

    解决掉了最头疼的DirectoryWatcher内部实现,这一节可以结束NodeWatchFileSystem模块. 关于watch的应用场景,仔细思考了下,这不就是热重载的核心嘛. 首先是监视文件, ...

  6. [翻译]EntityFramework Core 2.2 发布

    原文来源 TechViews 今天我们将推出EF Core 2.2的最终版本,以及ASP.NET Core 2.2和.NET Core 2.2 .这是我们的开源和跨平台对象数据库映射技术的最新版本. ...

  7. ASP.NET WebAPI 集成 Swagger 启用 OAuth 2.0 配置问题

    在 ASP.NET WebAPI 集成 Swagger 后,由于接口使用了 IdentityServer 做的认证,调试起来很不方便:看了下 Swashbuckle 的文档 ,是支持 OAuth2.0 ...

  8. MVC架构介绍—查询功能的开发

    select和from语句 注意:select和from可以不设置,默认情况下: select获取映射表的所有字段: from获取实体映射表的表名:如果设置select则必须设置frorm,但是允许仅 ...

  9. Java学习笔记之——变量与数据类型、运算符

    一.变量 1.变量:变化的值 变量在代码运行期间,开辟了一块空间 .这块空间是有地址的,给这块取了个名字, 这个名字就叫做变量名,这块空间放的东西叫做变量值 2.变量的初始化: (1)先声明再赋值: ...

  10. java_完数

    题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序,读入两个正整数n和 ...