HBase
概念
Hadoop Base
Hadoop没法实时增删改查
建立在 HDFS 之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的 NoSQL 数据库系统
特点
- 它仅能通过主键(row key)和主键的 range 来检索数据;
- Hbase查询数据功能简单,不支持 join 等复杂操作;
- 不支持复杂的事务(行级的事务);
- Hbase 中支持的数据类型:byte[] ;
- 主要用来存储结构化和半结构化的数据
- 大:一个表可以有上十亿行,上百万列
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏, 不需要指定列名可一行有这个列 一行没有这个列
NoSql
非关系性数据库
范例
HBase、Redis、MongoDB
数据存储
基于HDFS, 就算单表有100G的数据,按照HDFS的规则也会将单文件拆分成一个个block块,key信息存放在block的描述信息文件中
RowKey
Rowkey 是用来检索记录的主键。类似MySql中的主键
Rowkey 行键 (Rowkey)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-
100bytes)。在 HBase 内部,rowkey 保存为字节数组。HBase 会对表中的数据 按照 Rowkey 排序(字
典顺序) 。
存储时,数据按照 Rowkey 的字典序(byte order)排序存储。设计 key 时,要充分排序存储这个特
性,将经常一起读取的行存储放到一起。
列簇
HBase表中的每个列,都归属与某个列簇。列簇是表的 schema 的一部分(而列不是),必须在使用
表之前定义。
列名都以列簇作为前缀。例如 courses:history , courses:math 都属于 courses 这个列簇。
列族越多,在取一行数据时所要参与 IO、搜寻的文件就越多,所以,如果没有必要,不要设置太
多的列族。
个人理解对字段进行分类分组
时间戳
数据的版本号
每个数据的存储单元中都保存着同一份数据的多个版本,版本通过时间戳来索引。时间戳的类型是 64 位整型。
时间戳可以由 HBase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。
时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的
时间戳。
不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
Cell
由{rowkey, column, version} 唯一确定的单元。
Cell 中的数据是没有类型的,全部是字节码形式存储。
获取数据的方式: get(table -> rowkey -> column family -> column name -> ts)
基本操作
1.进入HBase客户端命令行
1 | hbase shell |
2.查看帮助命令
1 | hbase(main):001:0> help |
3.查看当前数据库中有哪些表
1 | hbase(main):002:0> list |
3.2 表的操作
1.创建表
1 | hbase(main):005:0> create 'student','info' |
加namespace
ps: 类似Mysql中库的概念 默认有个default的namespace 不指定namespace的都会进入到该命名空间
1 | hbase(main):004:0> create_namespace 'test' |
2.插入数据到表
1 | # put 'ns1:t1', 'r1', 'c1', 'value' |
3.扫描查看表数据
1 | hbase(main):008:0> scan 'test:student' |
4.查看表结构
1 | hbase(main):020:0> describe 'test:student' |
5.更新指定字段的数据
1 | hbase(main):012:0> put 'test:student','1001','info:name','lisi' |
6.查看“指定行”或“指定列族:列”的数据
1 | hbase(main):014:0> get 'test:student','1001' |
7.统计表数据行数
1 | hbase(main):021:0> count 'test:student' |
8.删除数据
删除某rowkey的全部数据:
1 | hbase(main):016:0> deleteall 'test:student','1001' |
删除某rowkey的某一列数据:
1 | hbase(main):017:0> delete 'test:student','1002','info:sex' |
9.清空表数据
1 | hbase(main):018:0> truncate 'test:student' |
提示:清空表的操作顺序为先disable,然后再truncate。
10.删除表
首先需要先让该表为disable状态:
1 | hbase(main):019:0> disable 'test:student' |
然后才能drop这个表:
1 | hbase(main):020:0> drop 'test:student' |
提示:如果直接drop表,会报错:ERROR: Table test:student is enabled. Disable it first.
11.变更表信息
将info列族中的数据存放3个版本:
1 | hbase(main):022:0> alter 'test:student',{NAME=>'info',VERSIONS=>3} |