1.概述
- HBase是Apache提供的一套基于HDFS的、分布式的、可扩展的、能够存储大量数据的、NOSQL(Not Only SQL)的非关系型数据库
- HBase是Doug Cutting根据Google的论文<The Big Table>实现的,HBase和BigTable的设计思想一模一样,只不过BigTable是用C语言实现的,HBase是用Java实现的
- HBase允许对大量的数据进行随机且实时读写
- HBase能够管理非常大的表:billions of rows X millions of columns
- HBase的版本同样比较混乱,在使用的时候需要考虑HBase和Hadoop版本的兼容性
- HBase作为非关系型数据库,不支持SQL
- HBase借鉴了列存储的思想,但是底层是依靠键值对来存储数据
- 在HBase中,不存在多表关联的概念
- HBase中适合于存储稀疏数据 - HBase非常适合于存储结构化(数据本身有固定结构且可以用一个或者几个关系型数据库中的表来进行解析存储)数据和半结构化(数据本身有固定结构但是不能用关系型数据库中的表来解析存储数据)数据
- HBase作为一个数据库,提供了完整的增删改查的能力,但是HBase是基于HDFS来进行存储,HDFS的特点是允许一次写入多次读取不允许修改但是允许追加。在HDFS不允许修改的情况下,HBase又是如何实现"改"这个能力的 - HBase在"改"的时候,并不是去修改已经写入的数据而是在HDFS文件的尾部追加数据。为了标记数据的"新旧",在每一条数据上都添加了时间戳。而在获取数据的时候实际上是获取了时间戳最新的数据,那么这个时候给用户的感觉好像是将数据进行了修改
- 每一条数据的时间戳称之为是数据的版本VERSION
- 默认情况下,表只允许对外获取最近一个版本的数据。如果需要获取多个版本的数据,那么在建表的时候就需要指定。表在建好之后就无法更改
2.基本概念
2.1rowkey - 行键
- HBase中没有主键的概念,取而代之的是行键
- 在HBase中,建表的时候不需要指定行键,而是在添加数据的时候手动指定
- 在HBase中,行键默认按照字典序排序
2.2column family - 列族/列簇
- HBase的单个列族就类似于MySQL中的单张表
- 一个表中至少包含1个列族,可以包含多个列族,理论上不限制列族的数量
- 在HBase中,强调列族但是不强调(关心)列 - 一个列族中可以包含0到多个列,且列是可以动态增删的,但是列族是固定的
2.3namespace - 名称空间
- 类似于关系型数据库中的database
- HBase在建立的时候,自动的生成2个空间:default和hbase。hbase空间下方的是hbase本身的一些配置信息,不要改动;如果建表的时候没有指定空间,那么表默认是放在default空间下的
3.命令
命令 | 解释 |
status | 查看运行状态 |
version | 查看版本 |
whoami | 查看当前的用户 |
create 'person', {NAME=>'basic'}, {NAME=>'info'}, {NAME=>'expand'} 或者 create 'person', 'basic', 'info', 'expand' | 建立一个person表,包含了3个列族:basic,info,expand |
put 'person', 'p1', 'basic:name', 'tom' | 向person表中basic列族name列添加一个数据,数据的行键为p1,值为tom |
get 'person', 'p1' | 获取person表中p1行键对应的值 |
get 'person', 'p1', {COLUMN => 'basic'} 或者 get 'person', 'p1', 'basic' | 获取指定行键对应的列族的值 |
get 'person', 'p1', {COLUMN => 'basic:name'} 或者 get 'person', 'p1', 'basic:name' | 获取指定行键对应的列的值 |
get 'person', 'p1', {COLUMN => ['basic:name','info:date']} 或者 get 'person', 'p1', 'basic:name', 'info:date' | 获取指定行键多列的值 |
scan 'person' | 扫描整表 |
scan 'person', {COLUMNS => 'basic'} | 获取指定列族的值 |
scan 'person', {COLUMNS => 'basic:name'} | 获取指定列的值 |
scan 'person', {COLUMNS => 'basic:name', LIMIT=>2, STARTROW => 'a2'} | 在指定列的前提下,可以限制获取的数据量 |
delete 'person', 'p1', 'basic:age' | 删除指定行键对应的列 |
deleteall 'person','p1', 'basic:name' | 删除指定行键对应的列 |
deleteall 'person','p1' | 删除一行 |
disable 'person' | 禁用表 |
drop 'person' | 删除表 |
enable 'person' | 启用表 |
create 'person', {NAME => 'basic', VERSIONS => 4}, {NAME => 'info', VERSIONS => 3} | 建立person表,包含2个列族,其中basic列族允许对外最多获取4个历史版本的数据,info列族允许对外最多获取3个历史版本的数据 |
get 'person','r1', {COLUMN =>'basic:age', VERSIONS => 4} | 获取过去5个历史版本的数据 |
describe 'person' 或者 desc 'person' | 描述表结构 |
exists 'user' | 判断表是否存在 |
truncate 'person' | 摧毁重建 |
get_splits 'person' | 获取HRegion的个数 |
list_namespace | 查看已有的空间 |
list_namespace_tables 'default' | 查看指定空间下的所有的表 |
create_namespace 'demo' | 创建demo空间 |
create 'demo:order', 'basic', 'expand' | 在指定空间下建表 |
list | 查看所有空间下的表 |
drop_namespace 'demo' | 删除空间 |