高可靠性、高性能、可伸缩、分布式、基于列存储的非关系型(NoSQL)数据库——Hbase

一、什么是Hbase

二、Hbase分布式集群搭建

Mysql和Hbase的区别:

高可靠性、高性能、可伸缩、分布式、基于列存储的非关系型(NoSQL)数据库——Hbase

三、HBase 表存储结构

HBase 表逻辑视图

高可靠性、高性能、可伸缩、分布式、基于列存储的非关系型(NoSQL)数据库——Hbase
表的形式存储数据,表由行和列组成。列划分为若干个列簇 (Column Family)。

2、HBase 表结构组成

行键(RowKey)
作用:用来检索记录的主键
访问 HBase 表中的行,有三种方式:
- 通过单个 RowKey 访问
- 通过 RowKey 的 range(正则)
- 全表扫描

可以是任意字符串。在 HBase 内部, RowKey 保存为字节数组(byte[])。

存储时,表中数据按照 RowKey 排序(字典顺序)
设计key时,利用排序存储这个特性,将经常一起读取的行放到一起。
列簇(Column Family)
列簇包含列,列簇是表的 schema 的一部分(而列不是),必须在使用表之前定义
列名都以列簇作为前缀。例如:courses:history,courses:math 都属于 courses 这个列簇
尽量不要设置过多列簇
因为列簇越多,在取一行数据时所要参与 IO、搜寻的文件就越多
时间戳(TimeStamp)
可以通过 row 和 columns 确定一个存储单元(Cell)
每个 Cell 都保存着同一份数据的多个版本。
版本通过时间戳来索引
类型:64 位整型
HBase(在数据写入时自动)赋值
此时间戳是精确到毫秒的当前系统时间
客户显式赋值
顺序:每个 Cell中,不同版本的数据按照时间戳降序排序,即最新的数据排在最前面。
数据版本回收方式
- 保存数据的最后 n 个版本
- 保存最近一段时间内的版本(设置数据的生命周期 TTL)
可以针对每个列簇进行设置
单元(Cell)
{RowKey, column( =<family> + <label>),version} 确定唯一单元
Cell 中的数据是没有类型的,全部是字节码形式存储。
版本(Version)
有很多单元(Cell)的行和列是相同的,使用版本来区分不同的单元
类型:用一个长整型表示
顺序:按照时间戳降序排列
因此当读取这个文件的时候,最先找到的是最近的版本

HBase 表的特点

	(1)大
	(2)面向列: 面向列(簇)的存储和权限控制,列(簇)独立检索。
	(3)稀疏:对于为空(null)的列,并不占用存储空间。
	(4)无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
	(5)数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
	(6)数据类型单一:HBase 中的数据都是字符串,没有类型。

四、Hbase命令行操作

1、进入 HBase 命令行界面
基本操作
[[email protected] conf]$ hbase shell
- 任意一台安装HBase的服务器节点
查看帮助信息
获取所有命令的帮助信息
	hbase(main):001:0> help
获取一组命令的帮助信息
	hbase(main):001:0> help "ddl"
获取单独命令的帮助信息
	hbase(main):001:0> help "list"
查询服务器状态
hbase(main):001:0> status
查询 HBase 版本
方法一:hbase(main):001:0> version
方法二:[[email protected] ~]$ hbase version
退出 HBase 命令行界面
方法一:hbase(main):008:0> exit
方法二:hbase(main):001:0> quit

DDL(数据定义语言)操作

创建表
1、默认版本:语法(默认版本号为1)
create'table_name','column_family1','column_family2',......
示例:
创建表students,有两个列簇:base_info,course_info
hbase(main):002:0> create 'students','base_info', 'course_info'
2、自己设置版本号
语法
create 'table_name', {NAME => 'column_family', VERSIONS => 'versions'},......
示例:创建表student,有两个列簇:base_info,course_info,版本号前者为3,后者为1
hbase(main):001:0> create 'student',{NAME => 'base_info',VERSIONS => 3},{NAME => 'course_info',VERSIONS => 1}
查看表
命令:hbase(main):003:0> list
查看表结构
语法:describe 'table_name'
示例:查看student的表结构
hbase(main):005:0> describe 'student'
修改表结构
语法:alter 'table_name', {NAME => 'column_family1', VERSIONS => 'versions'}
示例:修改students列簇base_info的版本号
hbase(main):009:0> alter 'students',{NAME => 'base_info', VERSIONS => 3}
删除列簇
语法:alter 'table_name', {NAME => 'column_family1', METHOD => 'delete'}
示例:将表students中的列簇base_info删除
hbase(main):016:0> alter 'students',{NAME => 'base_info',METHOD => 'delete'}
查看是否删除成功:hbase(main):017:0> describe 'students'
删除表
步骤:
disable(禁用)表
drop(删除)表
示例:将表students删除
disable表:
	hbase(main):019:0> disable 'students'
drop表:
	hbase(main):020:0> drop 'students'
查询表是否存在
语法:exists 'table_name'
示例:查询student表是否存在
	hbase(main):005:0> exists 'student'
判断表是否禁用
语法:is_disabled 'table_name'
示例:判断student表是否禁用
hbase(main):026:0> is_disabled 'student'
判断表是否启用
示例:判断student表是否启用
hbase(main):005:0> is_enabled 'student'

DML(数据操作语言)操作

添加数据

语法:
put 'table_name','rowkey','column_family:column','value','timestamp'
示例:为表student添加数据
put 'student','1001','base_info:name','shiny'

查询数据

扫描整个表
  • 语法
    scan ‘table_name’,{COLUMNS => [ ‘column_family:column’,… ], LIMIT => num}
  • 示例
    • (1)扫描表student,base_info:name的前2条数据
      hbase(main):004:0> scan ‘student’,{COLUMNS => ‘base_info:name’,LIMIT => 2}
    • (2)扫描表student的前2条数据
      hbase(main):005:0> scan ‘student’,{LIMIT => 2}
查询某行记录
语法
(1)根据行键:get 'table_name','rowkey'
(2)根据行键和列簇:get 'table_name','rowkey','column_family'
(3)根据行键、列簇和列:get 'table_name','rowkey','column_family:column'
示例
1)查询表student,行键1001中所有的数据
hbase(main):073:0> get 'student','1001'
(2)查询表student,行键1001中的course_info下所有的列值
hbase(main):001:0> get 'student','1001','course_info'
(3)查询表student,行键1001中的base_info下的name值
hbase(main):072:0> get 'student','1001','course_info:Math'
查询表中数据行数
语法
count 'table_name'
示例:查询表student的行数(行键总数)
hbase(main):006:0> count 'student'
修改数据
语法
put 'table_name','rowkey','column_family:column','value' 
示例:将表student,1001中course_info:Math的值修改为100
hbase(main):009:0> put 'student','1001','course_info:Math','100'
查询多个版本数据
(1)显示最新版本的数据
hbase(main):072:0> get 'student','1001','base_info:name'
(2)通过timestamp来获取对应版本的数据
hbase(main):013:0> get 'student','1001',{COLUMN=>'course_info:Math',TIMESTAMP => 1500542224220}
(3)通过versions来获取多个版本的数据
hbase(main):019:0> get 'student','1001',{COLUMN=>'course_info:Math',VERSIONS => 2}
删除数据
删除行中某个列值
语法
delete 'table_name','rowkey','column_family:column','timestamp'
示例:删除表student,1001中的course_info:Math的数据(所有版本)
hbase(main):015:0> delete 'student','1001','course_info:Math'
删除行
语法
deleteall 'table_name','rowkey'
示例:删除表student,1001的所有数据
hbase(main):018:0> deleteall 'student','1001'
清空表
语法
truncate 'table_name'
示例:清空表student
hbase(main):020:0> truncate 'student'