参考 

Chapter 5. 数据模型

Architecture

Table of Contents

65. Overview

5.1. 定义视图
5.2. 大要视图
5.3. 表
5.4. 行
5.5. 列族
5.6. Cells
5.7. 版本号

65.1. NoSQL?

HBase是一种”NoSQL”数据库。“NoSQL”一般指的黑白关系型数据库,大家驾驭,关系型数据库支持SQL,约等于说HBase不支持SQL。非关系型数据库有好多种,BerkeleyDB是一种本地非关系型数据库,但是,HBase是布满式数据库。从技能上来讲,HBase更疑似“Data
Store”,而不是“Data
Base”,因为它缺乏好些个关系型数据库的性状,举例:列类型、协助索引、触发器、查询语言等等。(PS:意思是,从本领的角度讲,HBase更像一个数额存款和储蓄,而不像数据库)

HBase集群扩张通过扩张RegionServer来完成。假若二个集群从10恢宏到十几个RegionServer,那么,不止是积存体积增添一倍,连管理本事也会扩大一倍。对于关系型数据库来讲,也能够用scale做到那样,不过须求提议的是,那亟需特意的硬件和存款和储蓄设备。HBase个性如下:

  • 强一致性读写:HBase不是一个“最终一致性”的数额存储。这使得它更契合高速度的集聚职务。
  • 机关分区:HBase的表通过region被布满在集群中,而region是自行拆分同样珍视新布满数据行的。
  • 自动RegionServer容灾
  • Hadoop/HDFS集成:HBase帮忙HDFS作为它的布满式文件系统
  • MapReduce:HBase辅助通过MapReduce基于HBase作为数据源的大方的并行管理
  • Java Client API:HBase帮忙通过Java
    API编制程序的秘籍来走访
  • Thrift/REST
    API:HBase也支撑Thrift和REST这样的非Java的客户端
  • Block Cache and Bloom Filters
  • Operational
    Management:HBase提供web界面
5.7.1. HBase的操作(包括版本号操作)
5.7.2. 现有的限制

65.2. When Should I Use HBase?

并不是具有的难题都合乎用HBase

首先、确定保证您有丰盛的数目。假设你有巨大的数码行,那么HBase是三个不利的挑选。假若您唯有数千依然百万的多寡,那么使用守旧的关系型数据库可能更加好,因为其实你的那么些多少也许只须要贰个要么四个节点就能够管理得完,那样的话集群中的其余的节点就高居空闲状态。

第二、确认保证您无需用到关系型数据库的风味(比如:固定类型的列、协理索引、事务、查询语言等等)。基于关系型数据库构建的行使不可能透过轻松的退换JDBC驱动来传输到HBase中。从HighlanderDBMS到HBase是一心相反的两套设计。

其三、确认保障您有丰硕的硬件。因为当DataNode数量稍低于5的时候HDFS将无法寻常办事了。

简轻松单来说,应用程序是以表的不二等秘书诀在HBase存储数据的。表是由行和列构成的,全体的列是从属于某多个列族的。

65.3. What Is The Difference Between HBase and Hadoop/HDFS?

HDFS是叁个布满式的文件系统,适合积存大文件,但它无法提供便捷的特性化的在文书中查究。HBase是构建于HDFS基础之上的,并且它支持对大表的中的记录举办快速搜索和立异。HBase内部将数据存放在HDFS中被索引的“StoreFiles”上以供高速搜索。

行和列的交叉点称之为cell,cell是本子号化的。

69. Master

HMaster是Master Server的一个实现。Master
Server担当监视集群中颇具的RegionServer实例,并且它也是具备元数据变动的四个对外接口。在布满式集群中,规范的Master运维在NameNode那台机器上。

cell的源委是不足切割的字节数组。

69.3. Interface

HMasterInterface接口是操作元数据的主要接口,提供以下操作:

  • Table (createTable, modifyTable,
    removeTable, enable, disable)
  • ColumnFamily (addColumn, modifyColumn,
    removeColumn)
  • Region (move, assign, unassign)

表的行键也是一段字节数组,所以不论什么东西都能够保留进去,不论是字符串可能数字。HBase的表是按key排序的,排序格局之针对字节的。全体的表都必必要有主键-key.
5.1. 概念视图

70. RegionServer

HRegionServer是RegionServer的达成,它肩负服务并管理regions。在布满式集群中,三个RegionServer常常运转在一个DataNode上。

以下是基于BigTable 故事集稍加改动的样例。

70.1. Interface

HRegionRegionInterface既涵盖数据的操作也含有region维护的操作

  • Data (get, put, delete, next,
    etc.)
  • Region (splitRegion, compactRegion,
    etc.)

有一个名称为webtable的表,包蕴三个列族:contents和anchor.在这些样例里面,anchor有五个列
(anchor:cssnsi.com,
anchor:my.look.ca),contents仅有一列(contents:html)
列名

70.5. RegionServer Splitting Implementation

region
server管理写诉求,它们被积累在内部存款和储蓄器中三个叫memstore的地点。一旦memstore文件满了,内容将被写到磁盘上作为store
file。这些事件称为memstore flush。随着store
file的缕缕堆成堆,RegionServer将合併它们成大文件,以缩减store
file的多少。在历次刷新只怕合并之后,region中多少的数量会时有发生变动。RegionServer依照切分计策来查看是不是region太大了依旧应当被切分。

逻辑上,region切分的操作相当粗略。找三个正好的职位,将region中的数据切分成五个新的region。不过,那几个管理的进度并不不难。当切分产生的时候,数据并不是及时被重写到这一个心创立的幼女region上。

 

 

三个列名是由它的列族前缀和修饰符(qualifier)连接而成。比如列contents:html是列族
contents加冒号(:)加 修饰符 html组成的。

71. Regions

亚洲城ca88 1

Table 5.1. 表 webtable
Row Key Time Stamp ColumnFamily contents ColumnFamily anchor
“com.cnn.www” t9 anchor:cnnsi.com = “CNN”
“com.cnn.www” t8 anchor:my.look.ca = “CNN.com”
“com.cnn.www” t6 contents:html = “…”
“com.cnn.www” t5 contents:html = “…”
“com.cnn.www” t3 contents:html = “…”

73. HDFS

亚洲城ca88 2

5.2. 物理视图

Data Model

在HBase中,数据被储存在表中,有行和列。这个术语和关系型数据有部分交汇,当然那不是一个很好的类比,不过它对大家思量HBase的象征二个多维的map很有帮衬。

Table

  由多行组成

Row

  HBase中的行由一个row
key和叁个或多个列组成。Rows在积攒的时候遵照row
key的字典序存款和储蓄。正因为如此,row
key的规划就彰显特别关键。基于这点,相关连的行相互之间存在周边。常常,row
key是一个网址的域名。若是你的row
key是域名,你应有以倒置的秘技存款和储蓄它们(举例:org.apache.www,org.apache.mail,org.apache.jira等等)。那样的话,全数的apache域名在表中是接近的职位,而不是被子域名的首先局地分离。

Column

  HBase中的列由贰个列簇和多个列修饰符组成,它们之间用冒号分隔(:)

Column Family

HBase简单介绍亚洲城ca88。  列簇由一雨后鞭笋的列和它们的值组成,那是依靠品质考虑的。每种列簇都有一文山会海的存款和储蓄属性,举例:是或不是它们的值应该被缓存到内部存款和储蓄器中,它们的数额怎么样被缩小,它们的row
key怎么样被编码,等等。表中的每一行都有雷同的列簇,尽管三个加以的行在给定的列簇上从未有过存款和储蓄任何数据。

Column Qualifier

  五个列修饰符被增多到列簇中为了给钦定的数额片段提供索引。假如,给定的列簇是content,那么,一个列修饰符恐怕是content:html,其余的还应该有不小可能是content:pdf。尽管,列簇在表成立的时候就一定了,然则列修饰符是不明确的,而且不相同的行大概有不通的列修饰符。

Cell

亚洲城ca88 3

Timestamp

  二个timestamp被写在每个value的旁边,它是一个value的版本修饰符。暗许的,timestamp代表数量被RegionServer写入的命宫,你也得以在写多少的时候钦定一个两样的timestamp值

虽说在概念视图里。表能够被视作是两个疏散的行的成团。但在情理上,它的是分别列族
存款和储蓄的。新的columns能够不通过证明直接抬高三个列族.

20. Conceptual View

亚洲城ca88 4

在那一个事例中,有三个表叫“webtable”,它富含两行数据(com.cnn.www和com.example.www)和五个列簇(contents,anchor,people)。对于第一行(com.cnn.www),anchor包蕴两列(anchor:cssnsi.com,anchor:my.look.ca),contents包涵一列(contents:html)。row
key为“com.cnn.www”的行有5个本子,而row
key为“com.example.www”的行有1个本子。contents:html列包蕴全部网址的HTML。

在那一个表格中的空的单元格并不占用空间

下图是一个效仿,意在表达表明方面我们所说的,便于咱们通晓:

亚洲城ca88 5

Table 5.2. 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”

21. Physical View

固然,在概念上,表看起来像是一行一行的,但大要上,它们是安分守己列簇被储存的。一个新的列修饰符能够在自便时刻被增多到列簇中。

亚洲城ca88 6

在后面包车型大巴定义视图中的空的单元格是不被贮存的。由此,须要contents:html列并且timestamp为t8将再次回到未有值。但是,假诺不钦点timestamp,那么某些列的超过一半分值都会被重回。就算钦赐三个版本,唯有找到的第二个会被再次来到,因为数量是依据timestamp降序存款和储蓄的。

Table 5.3. ColumnFamily contents
Row Key Time Stamp ColumnFamily “contents:”
“com.cnn.www” t6 contents:html = “…”
“com.cnn.www” t5 contents:html = “…”
“com.cnn.www” t3 contents:html = “…”

22. Namespace

一个命名空间是表的二个逻辑分组

值得注意的是在地点的定义视图中空白cell在情理上是不存款和储蓄的,由于根本不需求存款和储蓄。

23. Table

就此若二个伸手为要博取t8时间的contents:html。他的结果就是空。类似的。若央求为获得t9时间的anchor:my.look.ca。结果也是空。不过。借使不指明时间,将会重临最新时刻的行,每一个时尚的都会回去。比方,借使央浼为获得行键为”com.cnn.www”。未有指明时间戳的话,活动的结果是t6下的contents:html,t9下的anchor:cnnsi.com和t8下anchor:my.look.ca。

24. Row

行按照row key字典升序存款和储蓄

For more information about the internals of how HBase stores data, see
Section 9.7, “Regions”.
5.3. 表

25. Column Family

Columns in Apache HBase
are grouped into column
families.

列簇中兼有的列成员都有一样的前缀。举例,列courses:history和courses:math都以courses这几个列簇的成员。用冒号分隔列簇和列修饰符。列簇前缀必须由得以打字与印刷输出的字符组成。列修饰符能够由放肆字节组成。列簇必须在表被定义的时候就扬言好,因而列就不须要在表创立的时候定义了,并且能够每一天新增。

概况上,全部的列簇成员被贮存在同步。

表是在schema注解的时候定义的。
5.4. 行

26. Cells

A {row, column, version} tuple exactly specifies a cell in
HBase.

行键是不可切割的字节数组。

27. Data Model Operations

数据模型有4个主要操作,分别是Get、Put、Scan和Delete。这个操作是采纳在表上的。

行是按字典排序由低到高存款和储蓄在表中的。贰个空的数组是用来标记表空间的开首或然结尾。
5.5. 列族

27.1. Get

回来钦命行的天性

在HBase是列族一些列的集合。

27.2. Put

加多新的行到表中,或然更新已经存在的行

二个列族全体列成员是有所同样的前缀。例如,列courses:history 和
courses:math都以 列族
courses的成员.冒号(:)是列族的分隔符。用来区分前缀和列名。

27.3. Scans

环顾特定属性的多行

column
前缀必须是可打字与印刷的字符,剩下的有的(称为qualify),能够又专断字节数组组成。列族必须在表创设的时候申明。column就无需了。随时能够新建。

27.4. Delete

从表中删除一行

在物理上,贰个的列族成员在文件系统上都是储存在同步。

28. Versions

在HBase中,{row,column,version}能够规定三个单元格。当行和列被压缩成字节的时候,版本用long类型钦命。在HBase中,版本以降序存款和储蓄,所以,方今的值总是第一被发觉。

是因为存款和储蓄优化都以针对列族级其余,那就象征。贰个colimn
family的全数分子的是用同样的方法訪问的。

29. Sort Order

对于具备的数据模型操作,HBase以多少被储存时的逐条重临。首先按行排序,其次按列簇,再其次按列修饰符,最终是timestamp。(PS:前是多少个是字典升序,最终一个timestamp是降序)

5.6. Cells

30. Column Metadata

不存款和储蓄列的元数据,由此,HBase能够支撑每一行有不胜枚举列,行与行之间能够有两种差别的列。

A {row, column, version} 元组便是一个HBase中的一个cell。Cell的内容是不可切割的字节数组。
5.7. 数据模型操作

31. Joins

HBase不直接join操作,至少不扶助关系型数据库这种join。在HBase中,读取数据通过Get和Scan。

四个大旨的数据模型操作是 Get, Put, Scan, 和 Delete. 通过 HTable
实例实行操作.
5.7.1. Get

33. Schema Creation

亚洲城ca88 7

Get 重临特定行的品质。

34. Table Schema Rules Of Thumb

  • regions的高低在10~50GB之间
  • cells的大大小小不超越10MB
  • 独立的,每一种表的列簇在1~3个之间。HBase的表不该被规划成模仿关系型数据库的表
  • 一个有1~2个列簇的表所具备的regions大概在50~100个左右
  • 维持您的列簇名字尽可能的短

Gets 通过 HTable.get 运行。
5.7.2. Put

50. HBase as a MapReduce Job Data Source and Data Sink

HBase能够当做MapReduce作业的数据源。对于读写HBase的MapReduce作业,建议选用TableMapper和TableReducer。

设若你运营HBase作为数据源的MapReduce作业,你供给在布署文件中内定表和列名。

当您从HBase读取数据的时候,TableInputFormat央浼regions的列表并且作为一个map。

 

Put 要么向表增添新行 (即便key是新的) 或更新行 (假若key已经存在)。 Puts
通过 HTable.put (writeBuffer) 或 HTable.batch (non-writeBuffer)运营。
5.7.3. Scans

54. HBase MapReduce Examples

 

Scan 同意多行一定属性迭代。

以下是三个在 HTable 表实例上的言传身教样例。 假诺表有几行键值为 “row1”,
“row2”, “row3”, 另一部分行有键值 “abc1”, “abc2”, 和 “abc3”.
以下的演示样例显示startRow 和 stopRow 能够使用到三个Scan
实例。以回到”row”打头的行。

HTable htable = … // instantiate HTable

Scan scan = new Scan();
scan.addColumn(Bytes.toBytes(“cf”),Bytes.toBytes(“attr”));
scan.setStartRow( Bytes.toBytes(“row”)); // start key is inclusive
scan.setStopRow( Bytes.toBytes(“row” + (char)0)); // stop key is
exclusive
ResultScanner rs = htable.getScanner(scan);
try {
for (Result r = rs.next(); r != null; r = rs.next()) {
// process result…
} finally {
rs.close(); // always close the ResultScanner!
}

5.7.4. Delete

Delete 从表中删除一行. 删除通过HTable.delete 运营。

HBase
没有更换数据的稳当方式。所以经过创建名称叫墓碑(tombstones)的新标记进行管理。那些墓碑和逝世的值。在主紧缩时清除。

參考 Section 5.8.1.5, “Delete”
获取删除列版本号的过多任何音信。參考Section 9.7.5.5, “Compaction”
获取大多其余有关紧缩的音信。
5.8. 版本号

三个 {row, column, version}
元组是HBase中的三个单元(cell).可是有望会有好些个的单元的行和列是同样的,能够利用版本号来分歧差异的单元.

rows和column
key是用字节数组表示的,version则是用三个长整型表示。那些long的值使用
java.util.Date.getTime() 或然 System.currentTimeMillis()产生的。

那就表示他的含义是“当明日子和1968-01-01 UTC的时刻差,单位微秒。

在HBase中,版本号是按倒序排列的,由此当读取这几个文件的时候,起先找到的是近几来的版本号。

些微人不是十二分清楚HBase单元(cell)的意趣。

多个大面积的标题是:

假设有多个包括版本号写操作同一时候发起,HBase会保存全部还是会保持最新的一个?[16]

能够发起包括版本号的写操作。可是他们的版本号顺序和操作顺序相反吗?[17]

以下大家介绍下在HBase中版本号是怎么专门的职业的。[18].
5.8.1. HBase的操作(包罗版本号操作)

在这一章我们来精心看看在HBase的顺序首要操作中版本号起到了如何成效。
5.8.1.1. Get/Scan

Gets实在Scan的根底上达成的。

可见切实參见以下的商量 Get 一样能够用 Scan来形容叙述.

暗许情状下。倘令你从未点名版本号。当您利用Get操作的时候,会回来目前版本号的Cell(该Cell可能是新型写入的,但无法确认保证)。私下认可的操作能够如此退换:

假设想要返回返回两个以上的把版本号,參见Get.setMaxVersions()

假设想要返回的版本号不仅仅是近期的,參见 Get.setTimeRange()

要向查询的最新版本号要小于或等于给定的这个值,这就意味着给定的'近期'的值能够是某一个时间点。能够使用0到你想要的时间来设置。还要把max versions设置为1.

5.8.1.2. 默认 Get 样例

以下的Get操作会仅仅获得新型的一个版本号。

    Get get = new Get(Bytes.toBytes("row1"));
    Result r = htable.get(get);
    byte[] b = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("attr"));  // returns current version of value          

5.8.1.3. 分包的版本号的Get样例

以下的Get操作会获得近来的3个版本号。

    Get get = new Get(Bytes.toBytes("row1"));
    get.setMaxVersions(3);  // will return last 3 versions of row
    Result r = htable.get(get);
    byte[] b = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("attr"));  // returns current version of value
    List<KeyValue> kv = r.getColumn(Bytes.toBytes("cf"), Bytes.toBytes("attr"));  // returns all versions of this column       

5.8.1.4. Put

多个Put操作会给二个cell,成立二个本子号,暗中认可使用当前时光戳。当然你也能够本身安装时间戳。那就象征你可见把时光设置在过去要么未来,只怕私自使用三个Long值。

要想覆盖二个现成的值,就意味着你的row,column和版本号必须完全相等。
5.8.1.4.1. 不指明版本号的样例

以下的Put操作不指明版本号,所以HBase会用当下时光作为版本号。

      Put put = new Put(Bytes.toBytes(row));
      put.add(Bytes.toBytes("cf"), Bytes.toBytes("attr1"), Bytes.toBytes( data));
      htable.put(put);

5.8.1.4.2. 指明版本号的样例

以下的Put操作,指明了版本号。

      Put put = new Put( Bytes.toBytes(row ));
      long explicitTimeInMs = 555;  // just an example
      put.add(Bytes.toBytes("cf"), Bytes.toBytes("attr1"), explicitTimeInMs, Bytes.toBytes(data));
      htable.put(put);

5.8.1.5. Delete

有两种不一致类别的内部删除标志 [19]:

Delete: 删除列的指定版本号.

Delete column: 删除列的全部版本号.

Delete family: 删除特定列族全部列

当删除一行,HBase将当中对每一个列族创立墓碑(非每贰个单独列)。

除去操作的兑现是成立三个墓碑标志。比方,大家想要删除二个本子号,或许私下认可是currentTimeMillis。就象征“删除比这几个版本号更早的满贯版本号”.HBase不会去改那一个数据,数据不会立刻从文件里删除。

她选取删除标志来屏蔽掉这么些值。[20]若您驾驭的版本号比数据中的版本号晚,就象征这一行中的全体多少都会被删去。

參考 Section 9.7.5.4, “KeyValue” 获取内部 KeyValue 格式繁多其余音讯。
5.8.2. 存活的限量

有关版本号另一些bug(只怕叫做未落到实处的效果),布署在下个版本号完毕。
5.8.2.1. 刨除标识误标新Put 的多少

除去标志操作也许会标识其后put的数码。

[21]牢记,当写下一个墓碑标志后,仅仅有下一个主紧缩操作发起之后,墓碑才会免去。

要是你剔除全部<=
时间T的数据。但此后,你又运转了三个Put操作,时间戳<=
T。就算那个Put发生在剔除操作之后,他的数额也打上了墓碑标志。这一个Put并不会停业,但你做Get操作时,会专注到Put未有发出潜移默化。仅仅有二个主紧缩运营后。一切才会复苏平常。

如果你的Put操作一贯使用升序的版本号,这一个标题不会有影响。可是正是你不关怀时间,也可能出现该情状。仅仅需删除和插入急迅互相尾随,就有的时候机在同样皮秒中相遇。

5.8.2.2. 主紧缩退换查询的结果

“设想一下,你贰个cell有多个版本号t1,t2和t3。你的maximun-version设置是2.当你央浼获取全体本子号的时候。仅仅会重回几个,t2和t3。倘令你将t2和t3删除,就能够回去t1。不过一旦在剔除以前,产生了major
compaction操作。那么怎么样值都不好回去了。[22]”

5.9. 排序

成套数据模型操作 HBase 重临排序的数码。

先是行。再是列族。然后是列修饰(column qualifier),
最后是光阴戳(反向排序,所以新型的在前).
5.10. 列的元数据

对列族,未有内部的KeyValue之外的元数据保存。那样。HBase不仅仅在一行中帮忙好些个列。并且协理行以内不等的列。
由你协和担当盯梢列名。

唯一获得列族的总体列名的主意是管理任何行。HBase内部保存数据繁多别的音信,请參考
Section 9.7.5.4, “KeyValue”.
5.11. 齐声查询(Join)

HBase是或不是扶助联合是三个网络常问难点。简单的话 :
不帮忙。至少不想守旧CRUISERDBMS那样援助(如 SQL中带 equi-joins 或 outer-joins).
正如本章描写叙述的,读数据模型是 Get 和 Scan.

但并不表示等价联合不可能在应用程序中扶助。仅仅是必须本身做。
三种办法,要么指示要写到HBase的数据,要么查询表并在运用或MapReduce代码中做一道(如
TucsonDBMS所出示,有两种步骤来兑现。信赖于表的大大小小。如 nested loops vs.
hash-joins).
哪个越来越好?信赖于您希图做什么,所以未有多个单一的回复适合任何方面。


私家笔记
亚洲城ca88 8
Client
• 包涵訪问HBase的接口并爱惜cache来加速对HBase的訪问
Zookeeper
确定保证不论几时,集群中只有有一个master
存贮全体Region的寻址入口。
实时监察和控制Region server的上线和底线消息。并实时通报Master
存储HBase的schema和table元数据
Master
为Region server分配region
担负Region server的负荷均衡
意识失效的Region server并又贰回分配其上的region
管理用户对table的增加和删除改操作
RegionServer
• Region server维护region,处理对那些region的IO供给
• Region server担任切分在运作进度中变得过大的region
Region
HBase自身积极把表水平划分成八个区域(region),每多个region会保存贰个表
中间某段三番五次的数码;每叁个表一開始仅仅有三个region,随着数据持续插
入表,region不断增大,当增大到二个阀值的时候,region就能够等分会
八个新的region(裂变);
当table中的行不断增多,就能够有更进一步多的region。那样一张完整的表
被封存在三个Regionserver 上。
Memstore 与 storefile
一个region由三个store组成,叁个store相应四个CF(列族)
store包涵位于内部存款和储蓄器中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据到达某些阈值,hregionserver会运行flashcache进程写入storefile,每一次写入产生独立的二个storefile
当storefile文件的多少升高到一定阈值后,系统会进展联合(minor、major
compaction),在统一进程中会进行版本号统一和删除职业(majar),产生越来越大的storefile当三个region全体storefile的轻重缓急和超过一定阈值后,会把当下的region切割为五个,并由hmaster分配到对应的regionserver服务器,完结负载均衡

client检索数据,先在memstore找,找不到再找storefileHRegion是HBase中布满式存款和储蓄和负载均衡的矮小单元。最小单元就象征不一致的HRegion能够布满在分裂的
HRegion server上。
– HRegion由三个仍旧多少个Store组成,每贰个store保存二个columns family。


每多少个Strore又由二个memStore和0至八个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。
亚洲城ca88 9
亚洲城ca88 10

相关文章