1. 简介
1.1 定义
- HBase是一个分布式的、面向列的开源数据库
- 同样数据保存到列式数据库中
RowKey | FILE INFO | SAVE INFO |
---|---|---|
1 | name:file1.txt type:txt size:1024 | path:/home/pics creator:Jerry |
2 | name:file2.jpg type:jpg size:5032 | path:/home creator:Tom |
非结构化数据存储
- 结构化数据
- 适合用二维表来展示的数据
- 非结构化数据
- 非结构化数据是数据结构不规则或不完整
- 没有预定义的数据模型
- 不方便用数据库二维逻辑表来表现
- 办公文档、文本、图片、XML, HTML、各类报表、图像和音频/视频信息等
2 HBase在Hadoop生态中的地位及使用场景
HBase与HDFS关系
- HBase建立在Hadoop文件系统上, 利用了HDFS的容错能力
- HBase提供对数据的随机实时读/写访问功能
- HBase内部使用哈希表, 并存储索引, 可以快速查找HDFS中数据
HBase使用场景
- 瞬间写入量很大
- 大量数据需要长期保存, 且数量会持续增长
- HBase不适合有join, 多级索引, 表关系复杂的数据模型
- 跨行事务场景不适合
3 HBase的数据模型
- NameSpace: 关系型数据库的"数据库"(database)
- 表(table):用于存储管理数据,具有稀疏的、面向列的特点。HBase中的每一张表,就是所谓的大表(Bigtable),可以有上亿行,上百万列。对于为值为空的列,并不占用存储空间,因此表可以设计的非常稀疏。
- 行(Row):在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识的, 行键并没有什么特定的数据类型, 以二进制的字节来存储
- 列(Column): HBase的列由 Column family 和 Column qualifier 组成, 由冒号: 进行行间隔, 如 family: qualifier
- 行键(RowKey):类似于MySQL中的主键,HBase根据行键来快速检索数据,一个行键对应一条记录。与MySQL主键不同的是,HBase的行键是天然固有的,每一行数据都存在行键。
- 列族(ColumnFamily):是列的集合。列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都是以二进制形式存在,没有数据类型。在物理存储结构上,每个表中的每个列族单独以一个文件存储。一个表可以有多个列簇。
- 列修饰符(Column Qualifier) : 列族中的数据通过列标识来进行映射, 可以理解为一个键值对(key-value), 列修饰符(Column Qualifier) 就是key 对应关系型数据库的列
- 时间戳(TimeStamp):是列的一个属性,是一个64位整数。由行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。可根据版本(VERSIONS)或时间戳来指定查询历史版本数据,如果都不指定,则默认返回最新版本的数据。
- 区域(Region):HBase自动把表水平划分成的多个区域,划分的区域随着数据的增大而增多。
8 HBase 的安装与Shell操作
1 安装
解压缩配置环境变量
如果电脑休眠,则需要重新启动
/root/bigdata/hbase/bin/start-hbase.sh
hbase shell
2 HBase shell命令
- 连接集群
hbase shell
- 创建表
create 'user','base_info'
- 删除表
disable 'user'
drop 'user'
- 创建名称空间
create_namespace 'test'
- 展示现有名称空间
list_namespace
- 创建表的时候添加namespace
create 'test:user','base_info'
- 显示某个名称空间下有哪些表
list_namespace_tables 'test'
-
插入数据
put 'user','rowkey_10','base_info:username','Tom'
-
查询表中的所有数据
-
scan 'user'
scan 'user' ,{COLUMNS =>['base_info'],LIMIT=>2}
scan 'user' ,{COLUMNS =>['base_info'],LIMIT=>2,STARTROW=>'rowkey_16'}
scan 'user', {ROWPREFIXFILTER=>'rowkey_22'}
-
操作列簇
-
alter 'user', NAME => 'f2' 添加列族 alter 'user', 'delete' => 'f2' 删除列族
查看多个版本
-
修改可以显示的版本数量
-
alter 'user',NAME=>'base_info',VERSIONS=>10
-
指定显示多个版本
-
get 'user','rowkey_10',{COLUMN=>'base_info:username',VERSIONS=>2}
-
数据存了多个版本
通过时间戳查询
-
通过TIMERANGE 指定时间范围
-
scan 'user',{COLUMNS => 'base_info', TIMERANGE => [1558323139732, 1558323139866]} get 'user','rowkey_10',{COLUMN=>'base_info:username',VERSIONS=>2,TIMERANGE => [1558323904130, 1558323918954]}
-
通过时间戳过滤器 指定具体时间戳的值
scan 'user',{FILTER => 'TimestampsFilter (1558323139732, 1558323139866)'}
get 'user','rowkey_10',{COLUMN=>'base_info:username',VERSIONS=>2,FILTER => 'TimestampsFilter (1558323904130, 1558323918954)'}
9 HappyBase操作HBase
启动HBase thrift server : hbase-daemon.sh start thrift
安装happy base
- pip install happybase
- 建立连接
connection.tables()
获取表实例
table = connection.table('mytable')
# api
table.scan() #全表查询
table.row('row_key') # 查询一行
table.rows([row_keys]) # 查询多行
table.put(row_key, {'cf:cq':'value'})
table.delete(row_key, cf_list)
connection.delete_table(table_name, True)