图片 9

HBase简介

Posted by

参考 

Chapter 5. 数据模型

Architecture

Table of Contents

65. Overview

5.一. 定义视图
伍.二. 大意视图
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来完成。假设2个集群从10扩充到二十一个RegionServer,那么,不止是积存体积增添一倍,连管理能力也会扩充1倍。对于关系型数据库而言,也得以用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中。从卡宴DBMS到HBase是一点1滴相反的两套设计。

其三、确定保证您有丰富的硬件。因为当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)

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

70. RegionServer

HRegionServer是RegionServer的落实,它肩负服务并管理regions。在遍及式集群中,3个RegionServer平时运营在3个DataNode上。

以下是基于BigTable 随想稍加改变的样例。

70.1. Interface

HRegionRegionInterface既包括数据的操作也暗含region维护的操作

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

有2个名字为webtable的表,包蕴多少个列族:contents和anchor.在那一个样例里面,anchor有四个列
(anchor:cssnsi.com,
anchor:my.look.ca),contents仅有1列(contents:html)
列名

70.5. RegionServer Splitting Implementation

region
server管理写请求,它们被积攒在内部存储器中几个叫memstore的地方。1旦memstore文件满了,内容将被写到磁盘上作为store
file。这一个事件称为memstore flush。随着store
file的随地积攒,RegionServer将合并它们成大文件,以减小store
file的数码。在每一趟刷新只怕统一之后,region中数据的数额会发生更改。RegionServer依据切分计策来查阅是或不是region太大了照旧应当被切分。

逻辑上,region切分的操作异常的粗略。找贰个适龄的岗位,将region中的数据切分成三个新的region。但是,这一个管理的经过并不容易。当切分产生的时候,数据并不是当下被重写到那个心成立的幼女region上。

 

 

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

71. Regions

图片 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

图片 2

五.2. 物理视图

Data Model

在HBase中,数据被积攒在表中,有行和列。那一个术语和关系型数据有一部分重合,当然那不是多少个很好的类比,不过它对我们寻思HBase的表示一个多维的map很有扶助。

Table

  由多行组成

Row

  HBase中的行由二个row
key和三个或多少个列组成。Rows在蕴藏的时候根据row
key的字典序存款和储蓄。正因为如此,row
key的安插就显示极度首要。基于这或多或少,相关连的行相互之间存在周边。日常,row
key是1个网址的域名。假如您的row
key是域名,你应有以倒置的办法存款和储蓄它们(举个例子:org.apache.www,org.apache.mail,org.apache.jira等等)。那样的话,全数的apache域名在表中是类似的岗位,而不是被子域名的第二有的分离。

Column

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

Column Family

  列簇由一三种的列和它们的值组成,那是基于品质思量的。每1个列簇都有一多元的蕴藏属性,譬喻:是不是它们的值应该被缓存到内部存款和储蓄器中,它们的数量怎么样被核减,它们的row
key怎么样被编码,等等。表中的每壹行都有平等的列簇,固然贰个加以的行在给定的列簇上没有存款和储蓄任何数据。

Column Qualifier

  二个列修饰符被加多到列簇中为了给内定的数额片段提供索引。要是,给定的列簇是content,那么,3个列修饰符大概是content:html,其余的还有非常大只怕是content:pdf。即便,列簇在表创设的时候就稳固了,可是列修饰符是不分明的,而且不相同的行大概有梗塞的列修饰符。

Cell

图片 3

Timestamp

  贰个timestamp被写在每一个value的壹侧,它是四个value的版本修饰符。暗中同意的,timestamp代表数量被RegionServer写入的年月,你也能够在写多少的时候内定一个不1的timestamp值

即使在概念视图里。表能够被当作是贰个疏散的行的汇集。但在物理上,它的是分别列族
存款和储蓄的。新的columns能够不经过注明直接助长一个列族.

20. Conceptual View

图片 4

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

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

下图是3个模仿,意在表明表明方面大家所说的,便于大家知道:

图片 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

虽说,在概念上,表看起来像是一行1行的,但大意上,它们是比照列簇被累积的。八个新的列修饰符能够在自由时刻被增加到列簇中。

图片 6

在前面包车型地铁概念视图中的空的单元格是不被贮存的。因而,请求contents:html列并且timestamp为t八将回到未有值。不过,借使不点名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。他的结果就是空。类似的。若请求为博得t九时间的anchor:my.look.ca。结果也是空。可是。纵然不指明时间,将会回来最新时刻的行,每一个流行的都会回去。比如,如果请求为获得行键为”com.cnn.www”。未有指明时间戳的话,活动的结果是t六下的contents:html,t九下的anchor:cnnsi.com和t八下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

数据模型有陆个基本点操作,分别是Get、Put、Scan和Delete。这个操作是应用在表上的。

行是按字典排序由低到高存款和储蓄在表中的。3个空的数组是用来标志表空间的起头恐怕结尾。
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}能够规定1个单元格。当行和列被压缩成字节的时候,版本用long类型钦定。在HBase中,版本以降序存储,所以,近期的值总是第一被察觉。

由于存款和储蓄优化都以针对列族级其余,那就代表。2个colimn
family的成套成员的是用同1的不二等秘书籍訪问的。

29. Sort Order

对此全数的数据模型操作,HBase以多少被积累时的依次重返。首先按行排序,其次按列簇,再其次按列修饰符,最终是timestamp。(PS:前是八个是字典升序,最终四个timestamp是降序)

5.6. Cells

30. Column Metadata

不存款和储蓄列的元数据,由此,HBase能够支撑每1行有无数列,行与行时期能够有四种分歧的列。

A {row, column, version} 元组正是3个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

图片 7

Get 重临特定行的特性。

34. Table Schema Rules Of Thumb

  • regions的轻重在十~50GB之间
  • cells的大小不抢先十MB
  • 标准的,种种表的列簇在一~一个里面。HBase的表不应该被设计成模仿关系型数据库的表
  • 一个有1~三个列簇的表所具有的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 同意多行一定属性迭代。

以下是1个在 HTable 表实例上的演示样例。 假使表有几行键值为 “row壹”,
“row二”, “row叁”, 另一些行有键值 “abc壹”, “abc2”, 和 “abc三”.
以下的言传身教样例展现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.五, “Delete”
获取删除列版本号的居多别样音讯。參考Section 玖.七.五.五, “Compaction”
获取好些个任何有关紧缩的音信。
5.8. 版本号

3个 {row, column, version}
元组是HBase中的1个单元(cell).不过有异常的大希望会有丰富多的单元的行和列是一样的,能够运用版本号来差距不一样的单元.

rows和column
key是用字节数组表示的,version则是用2个长整型表示。那么些long的值使用
java.util.Date.getTime() 只怕 System.current提姆eMillis()爆发的。

这就表示她的意思是“当前岁月和一九七零-0一-0壹 UTC的岁月差,单位微秒。

在HBase中,版本号是按倒序排列的,因而当读取这一个文件的时候,先河找到的是多年来的版本号。

稍许人不是丰裕明白HBase单元(cell)的趣味。

3个大规模的题目是:

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

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

以下大家介绍下在HBase中版本号是哪些职业的。[18].
伍.8.1. HBase的操作(包涵版本号操作)

在那1章我们来仔细看看在HBase的一1显要操作中版本号起到了什么服从。
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          

五.8.一.3. 暗含的版本号的Get样例

以下的Get操作会得到方今的一个版本号。

    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

2个Put操作会给3个cell,成立二个本子号,私下认可使用当前时间戳。当然你也能够团结设置时间戳。那就意味着你可见把时光设置在过去要么今后,可能专断使用1个Long值。

要想覆盖叁个共处的值,就象征你的row,column和版本号必须完全相等。
5.八.壹.肆.一. 不指明版本号的样例

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

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

五.八.1.4.二. 指明版本号的样例

以下的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将里面前境遇每多个列族创立墓碑(非每3个单独列)。

删去操作的落到实处是创设2个墓碑标识。举个例子,我们想要删除3个版本号,或许暗中认可是currentTimeMillis。就象征“删除比那个本子号更早的全套版本号”.HBase不会去改那么些数据,数据不会立时从文件里删除。

她使用删除标志来屏蔽掉那几个值。[20]若您了然的版本号比数据中的版本号晚,就代表这一行中的全体数据都会被删去。

參考 Section 玖.7.5.4, “KeyValue” 获取内部 KeyValue 格式大多任何新闻。
伍.八.二. 存活的范围

有关版本号另一些bug(只怕叫做未落到实处的效率),布署在下个版本号达成。
5.8.二.一. 删减标识误标新Put 的数目

剔除标志操作只怕会标志其后put的数额。

[21]纪事,当写下一个墓碑标识后,仅仅有下三个主紧缩操作发起之后,墓碑才会去掉。

一经你剔除全数<=
时间T的数量。但随后,你又运营了二个Put操作,时间戳<=
T。固然那个Put产生在剔除操作之后,他的数码也打上了墓碑标志。那么些Put并不会退步,但您做Get操作时,会专注到Put未有发出影响。仅仅有三个主紧缩运营后。1切才会苏醒寻常。

若是你的Put操作平昔使用升序的本子号,这几个标题不会有震慑。不过正是你不爱抚时间,也说不定出现该情状。仅仅需删除和插入飞快相互尾随,就一时机在平等皮秒中相见。

5.八.贰.二. 主紧缩改变查询的结果

“设想一下,你三个cell有多个本子号t一,t贰和t三。你的maximun-version设置是2.当您请求获取全部本子号的时候。仅仅会再次回到多少个,t2和t3。倘使你将t二和t3删除,就能够回来t一。但是一旦在剔除从前,发生了major
compaction操作。那么哪些值都不佳回去了。[22]”

5.9. 排序

整套数据模型操作 HBase 重返排序的数据。

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

对列族,未有内部的KeyValue之外的元数据保存。那样。HBase不仅仅在1行中帮忙极度多列。并且匡助行以内不等的列。
由你协和担当追踪列名。

唯一获得列族的全体列名的法子是管理整个行。HBase内部保存数据繁多别样新闻,请參考
Section 九.柒.伍.四, “KeyValue”.
伍.1一. 联手查询(Join)

HBase是还是不是帮助联合是贰个网络常问难题。轻松的话 :
不补助。至少不想守旧GL450DBMS那样帮助(如 SQL中带 equi-joins 或 outer-joins).
正如本章描写叙述的,读数据模型是 Get 和 Scan.

但并不意味着等价联合不可能在应用程序中支持。仅仅是必须团结做。
三种办法,要么提醒要写到HBase的数额,要么查询表并在动用或MapReduce代码中做联合(如
HighlanderDBMS所展现,有三种步骤来落实。依赖于表的分寸。如 nested loops vs.
hash-joins).
哪个更加好?信赖于您准备做哪些,所以未有一个单纯的回答适合任何上边。


私家笔记
图片 8
Client
• 包罗訪问HBase的接口并保险cache来加快对HBase的訪问
Zookeeper
担保不论哪一天,集群中单独有3个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会保存一个表
当中某段延续的数量;每1个表壹開始仅仅有三个region,随着数据持续插
入表,region不断增大,当增大到贰个阀值的时候,region就能等分会
四个新的region(裂变);
当table中的行不断增加,就能够有更进一步多的region。那样一张完整的表
被封存在多少个Regionserver 上。
Memstore 与 storefile
3个region由两个store组成,三个store相应1个CF(列族)
store包蕴位于内部存款和储蓄器中的memstore和位于磁盘的storefile写操作先写入memstore,当memstore中的数据到达某些阈值,hregionserver会运维flashcache进度写入storefile,每一趟写入产生独立的二个storefile
当storefile文件的多寡增进到一定阈值后,系统会实行联合(minor、major
compaction),在联合进度中会举行版本号会集和删除专门的学问(majar),产生越来越大的storefile当1个region全体storefile的深浅和超越一定阈值后,会把当下的region切割为七个,并由hmaster分配到相应的regionserver服务器,达成负载均衡

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


每一个Strore又由一个memStore和0至四个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。
图片 9
图片 10

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注