一、HBase定义
HBase 是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。 HBase 利用Hadoop HDFS 作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
和传统数据库不同的是,HBase的表不用定义有哪些列(字段,Column),因为列是可以动态增加和删除的。但HBase表需要定义列族(Column Family)。每张表有一个或者多列族,每个列必须且仅属于一个列族。列族主要用来在存储上对相关的列分组,从而使得减少对无关列的访问来提高性能。一般来说,一个列族就足够使用了。
特点:
- 大:一个表可以有上亿行,上百万列。
- 面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
- 稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
HBase 支持很多种访问,访问HBase的常见接口如下:
- Native Java API,最常规和高效的访问方式,适合Hadoop MapReduce Job并行批处理HBase表数据。
- HBase Shell,HBase的命令行工具,最简单的接口,适合HBase管理使用。
- Thrift Gateway,利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据。
- REST Gateway,支持REST 风格的Http API访问HBase, 解除了语言限制。
- Pig,可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据,适合做数据统计。
- Hive,当前Hive的Release版本尚没有加入对HBase的支持,但在下一个版本Hive 0.7.0中将会支持HBase,可以使用类似SQL语言来访问HBase。
二、HBase 逻辑模型
HBase 中的每一张表就是所谓的 BigTable。BigTable 会存储一系列的行记录,行记录有三个基本类型的定义:Row Key、Time Stamp、Column。
Row Key
是行在 BigTable 中的唯一标识。在存储时,数据按照 Row Key 的字典序(byte order)排序存储。设计 Key 时,要充分排序存储这个特性,将经常一起读取的行存储到一起(位置相关性)。
Time Stamp
是每次数据操作对应关联的时间戳,可以看做 SVN 的版本。为了避免数据存在过多版本造成的管理(包括存储和索引)负担,HBase 提供了两种数据版本回收方式。 一是保存数据的最后 n 个版本,二是保存最近一段时间内的版本(比如最近七天)。
Column
定义为< family>:< label>,通过这两部分可以指定唯一的数据的存储列,family 的定义和修改需要 对 HBase 进行类似于 DB 的 DDL 操作,而 label ,不需要定义直接可以使用,这也为动态定制列提供了一种手段 。family 另一个作用体现在物理存储优化读写操作上,同 family 的数据物理上保存的会比较临近,因此在业务设计的过程中可以利用这个特性。
三、HBase Shell命令
写错 HBase Shell 命令时用键盘上的“Ctrl+Backspace”或“Delete”进行删除,“Backspace”不起作用。如果使用了Kerberos认证,需要先激活拥有相关权限的用户,执行kinit -k -t keytab路径 用户名
。
# 列出所有表
> list
# 获得表描述
> describe 'INVESTOR_HX:acct_info'
# 查看20190718数据是否存在
> get 'INVESTOR_HX:acct_info', 'TRADE_DATE|20190718'
# 抽查20190718数据是否存在
> scan 'INVESTOR_HX:acct_info', {
FILTER=>"(RowFilter(=,'regexstring:.*\\|20190718'))",LIMIT=>10}
> get 'INVESTOR_HX:acct_info', '000008383A|20190718'
# 统计行数
> count 'INVESTOR_HX:acct_info'
# 删除表
> disable 'INVESTOR_HX:acct_info'
> drop 'INVESTOR_HX:acct_info'
# 清空表,实际上是通过先对表执行 disable,然后再执行 drop 操作后重建表来实现
> truncate 'INVESTOR_HX:acct_info'
统计行数方法:
- count命令
最直接的方式是在hbase shell中执行count的命令可以统计行数。INTERVAL为统计的行数间隔,默认为1000,CACHE为统计的数据缓存。这种方式效率很低,如果表行数很大的话不建议采用这种方式。
> count 'INVESTOR_HX:acct_info', INTERVAL => 10, CACHE