【hbase】hbase理论学习

HBase用途:node

基于Hadoop Distributed File System,是一个开源的,基于列存储模型的分布式数据库。

HBase简介:sql

HBase是一个分布式的、多版本的、面向列的开源数据库
           1)利用Hadoop HDFS做为其文件存储系统,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。
           2)利用Hadoop MapReduce来处理HBase中的海量数据
           3)利用Zookeeper做为协同服务。

HBase中表的特色:
           1)大:一个表能够有上亿行,上百万列(列多时,插入变慢)
           2)面向列:面向列(族)的存储和权限控制,列(族)独立检索。
           3)稀疏:对于为空(null)的列,并不占用存储空间,所以,表能够设计的很是稀疏。
           4)每一个cell中的数据能够有多个版本,默认状况下版本号自动分配,是单元格插入时的时间戳;
           5)HBase中的数据都是字符串,没有类型;

HBase 特色:
           1)强一致性:同一行数据的读写只在同一台Region Server上进行
           2)水平伸缩:Region的自动分裂以及Master的balance;
                    只用增长Datanode机器便可增长容量;
                    只用增长Region Server机器便可增长读写吞吐量
           3)支持有限查询方式和一级索引:
                        仅支持单行事务
                        仅支持三种查询方式single row key、range row key、scan  all rows of  table)【可经过hive等实现多表关联查询】
                        仅基于row key的索引
           4)高性能随机写:WAL (Write Ahead Log)
HBase与RDBMS对比:
shell

注:DBMS即关系数据库管理系统(Relational Database Management System),是将数据组织为相关的行和列的系统,而管理关系数据库的计算机软件就是关系数据库管理系统,经常使用的数据库软件有OracleSQL Server等。数据库


Hbase基本用法:
(1)创建一个表scores,有两个列族grad和courese
代码以下:apache

hbase(main):001:0> create ‘scores','grade', ‘course' 

可使用list命令来查看当前HBase里有哪些表。使用describe命令来查看表结构。
(记得全部的代表、列名都须要加上引号)
(2)按设计的表结构插入值: 数组

代码以下:
put ‘scores','Tom','grade:','5′
put ‘scores','Tom','course:math','97′
put ‘scores','Tom','course:art','87′
put ‘scores','Jim','grade:','4′
put ‘scores','Jim','course:english','89′
put ‘scores','Jim','course:art','80′ 

这样表结构就起来了,其实比较自由,列族里边能够自由添加子列很方便。若是列族下没有子列,加不加冒号都是能够的。
put命令比较简单,只有这一种用法: 缓存

hbase> put ‘tablename′, ‘rowname′, ‘colname′, ‘value', timestamp 
注:tablename指表名,rowname指行键名,colname指列名,value指单元格值。timestamp指时间戳,通常都省略掉了

(3)根据键值查询数据
get ‘scores’,‘Jim’
get ‘scores’,‘Jim’,‘grade’
可能会发现规律了,HBase的shell操做,一个大概顺序就是操做关键词后跟表名,行名,列名这样的一个顺序,若是有其余条件再用花括号加上。
get有用法以下:安全

hbase> get ‘t1′, ‘r1′
hbase> get ‘t1′, ‘r1′, {TIMERANGE => [ts1, ts2]}
hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′}
hbase> get ‘t1′, ‘r1′, {COLUMN => ['c1', 'c2', 'c3']}
hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1}
hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMERANGE => [ts1, ts2], VERSIONS => 4}
hbase> get ‘t1′, ‘r1′, {COLUMN => ‘c1′, TIMESTAMP => ts1, VERSIONS => 4}
hbase> get ‘t1′, ‘r1′, ‘c1′
hbase> get ‘t1′, ‘r1′, ‘c1′, ‘c2′
hbase> get ‘t1′, ‘r1′, ['c1', 'c2'] 

 (4)扫描全部数据  scan ‘scores'
也能够指定一些修饰词:TIMERANGE, FILTER, LIMIT, STARTROW, STOPROW, TIMESTAMP, MAXLENGTH,or COLUMNS。没任何修饰词,就是上边例句,就会显示全部数据行。
例句以下:  网络

hbase> scan ‘.META.'
hbase> scan ‘.META.', {COLUMNS => ‘info:regioninfo'}
hbase> scan ‘t1′, {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => ‘xyz'}
hbase> scan ‘t1′, {COLUMNS => ‘c1′, TIMERANGE => [1303668804, 1303668904]}
hbase> scan ‘t1′, {FILTER => “(PrefixFilter (‘row2′) AND (QualifierFilter (>=, ‘binary:xyz'))) AND (TimestampsFilter ( 123, 456))”}
hbase> scan ‘t1′, {FILTER => org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)}
过滤器filter有两种方法指出:
a. Using a filterString – more information on this is available in the Filter Language document attached to the HBASE-4176 JIRA
b. Using the entire package name of the filter.
还有一个CACHE_BLOCKS修饰词,开关scan的缓存的,默认是开启的(CACHE_BLOCKS=>true),能够选择关闭(CACHE_BLOCKS=>false)。

 (5)删除指定数据
代码以下:
delete ‘scores','Jim','grade'  delete ‘scores','Jim'
删除数据命令也没太多变化,只有一个:负载均衡

hbase> delete ‘t1′, ‘r1′, ‘c1′, ts1 

 另外有一个deleteall命令,能够进行整行的范围的删除操做,慎用!
若是须要进行全表删除操做,就使用truncate命令,其实没有直接的全表删除命令,这个命令也是disable,drop,create三个命令组合出来的。
(6)统计行数:
代码以下:

hbase> count ‘t1′
hbase> count ‘t1′, INTERVAL => 100000
hbase> count ‘t1′, CACHE => 1000
hbase> count ‘t1′, INTERVAL => 10, CACHE => 1000 

 count通常会比较耗时,使用mapreduce进行统计,统计结果会缓存,默认是10行。统计间隔默认的是1000行(INTERVAL)。
(7)修改表结构
代码以下:

disable ‘scores'
alter ‘scores',NAME=>'info'
enable ‘scores'
alter命令使用以下(若是没法成功的版本,须要先通用表disable):
a、改变或添加一个列族:
hbase> alter ‘t1′, NAME => ‘f1′, VERSIONS => 5
b、删除一个列族:
hbase> alter ‘t1′, NAME => ‘f1′, METHOD => ‘delete' hbase> alter ‘t1′, ‘delete' => ‘f1′
c、也能够修改表属性如MAX_FILESIZE MEMSTORE_FLUSHSIZE, READONLY,和 DEFERRED_LOG_FLUSH:
hbase> alter ‘t1′, METHOD => ‘table_att', MAX_FILESIZE => '134217728′
d、能够一次执行多个alter命令:
hbase> alter ‘t1′, {NAME => ‘f1′}, {NAME => ‘f2′, METHOD => ‘delete'} 

 

HBase的体系结构:

 

 

Client
 * 包含访问HBase的接口并维护cache来加快对HBase的访问
Zookeeper
 * 保证任什么时候候,集群中只有一个master
 * 存贮全部Region的寻址入口。
 * 实时监控Region server的上线和下线信息。并实时通知给Master
 * 存储HBase的schema和table元数据
Master
 * 为Region server分配region
 * 负责Region server的负载均衡
 * 发现失效的Region server并从新分配其上的region
 * 管理用户对table的增删改查操做
Region Server
 * Region server维护region,处理对这些region的IO请求
 * Region server负责切分在运行过程当中变得过大的region

 

 HBase数据表的一些关键概念:

Row key键:
a.表中行的键是字节数组(最大长度是 64KB )
b.任何字符串均可以做为键;
c.表中的行根据行的键值进行排序,数据按照Row key的字节序(byte order)排序存储;
d.字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的天然序,行键必须用0做左填充
e.全部对表的访问都要经过键
f.经过单个row key访问
g.经过row key的range
h.全表扫描

Column Family列族:
a.HBase表中的每一个列都归属于某个列族,列族必须做为表模式(schema)定义的一部分预先给出。如 create ‘test’, ‘course’;
b.列名以列族做为前缀,每一个“列族”均可以有多个列成员(column);如course:math, course:english,
c.新的列族成员能够随后按需、动态加入;
d.权限控制、存储以及调优都是在列族层面进行的;
e.同一列族成员最好有相同的访问模式和大小特征;
f.HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。

Cell qualifier列族修饰符(列):
a.经过列族:单元格修饰符,能够具体到某个列;
b.能够把单元格修饰符认为是实际的列名;
c.在列族存在,客户端随时能够把列添加到列族;

Timestamp时间戳:
a.在HBase每一个cell存储单元对同一份数据有多个版本,根据惟一的时间戳来区分每一个版本之间的差别,不一样版本的数据按照时间倒序排序,最新的数据版本排在最前面。
b.时间戳的类型是 64位整型。
c.时间戳能够由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。
d.时间戳也能够由客户显式赋值,若是应用程序要避免数据版本冲突,就必须本身生成具备惟一性的时间戳。

Region区域:
a.HBase自动把表水平划分红多个区域(region),每一个region会保存一个表里面某段连续的数据;
b.每一个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region;
c.当table中的行不断增多,就会有愈来愈多的region。这样一张完整的表被保存在多个Region 上。

HBase物理存储

一、Table中的全部行都按照row key的字典序排列。
二、Table 在行的方向上分割为多个HRegion。

 

 

 

三、Region按大小分割的,每一个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,HRegion就会等分会两个新的HRegion。当table中的行不断增多,就会有愈来愈多的HRegion。

 

 

 4 、HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不一样的HRegion能够分布在不一样的HRegion server上。但一个HRegion是不会拆分到多个server上的。

 

 

 5 、HRegion虽然是分布式存储的最小单元,但并非存储的最小单元。事实上,HRegion由一个或者多个Store组成,每一个store保存一个columns family。每一个Strore又由一个memStore和0至多个StoreFile组成。

如图:StoreFile以HFile格式保存在HDFS上。

 

 

 HFile分为六个部分:

Data Block 段:保存表中的数据,这部分能够被压缩 

Meta Block段 (可选的):保存用户自定义的kv对,能够被压缩。 

File Info 段:HFile的元信息,不被压缩,用户也能够在这一部分添加本身的元信息。 

Data Block Index 段:Data Block的索引。每条索引的key是被索引的 block的第一条记录的key。 

Meta Block Index段 (可选的):Meta Block的索引。

Trailer段:这一段是定长的。保存了每一段的偏移量,读取一个HFile时,会    首先读取Trailer,Trailer保存了每一个段的起始位置(段的Magic Number用来 作安全check),而后,DataBlock Index会被读取到内存中,这样,当检索  某个key时,不须要扫描整个HFile,而只需从内存中找到key所在的block,经过一次磁盘io将整个 block读取到内存中,再找到须要的key

 ➜ Data Block Index采用LRU机制淘汰。

 ➜ HFile的Data Block,Meta Block一般采用压缩方式存储,压缩以后能够大大减小网络IO和磁盘IO,随之而来的开销固然是须要花费cpu进行压缩和解压缩。

 ➜ 目标Hfile的压缩支持两种方式:Gzip,Lzo。