码迷,mamicode.com
首页 > 其他好文 > 详细

【hbase】hbase理论学习

时间:2019-10-10 00:04:15      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:read   开启   ber   time   nat   文件存储   过滤   mat   tom   

HBase用途:

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

HBase简介:

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对比:
技术图片

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


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

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物理存储

1、Table中的所有行都按照row key的字典序排列。
2、Table 在行的方向上分割为多个HRegion。

 技术图片

 

 

3、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。

 

【hbase】hbase理论学习

标签:read   开启   ber   time   nat   文件存储   过滤   mat   tom   

原文地址:https://www.cnblogs.com/CQ-LQJ/p/11645055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!