简介:HBase逻辑结构和物理结构,对比关系型数据库Mysql,并整理HBase常用命令
HBase
-
HBase是一种分布式、可扩展、支持海量数据存储、列存储模式与键值对存储模式结合的 NoSQL 数据库。
-
HBase是BigTable的开源实现,建立在HDFS上,提供高可靠、高性能、列存储、可伸缩、实施读写NoSql的数据库系统。
-
HBase采用三维结构来实现数据的有序存储,其三维分别指:row key(行键)、column(column Family+column qualifier)、timestamp(时间戳)。
数据模型
逻辑结构
Column family(列族):将表按纵向切分,如:personal_info、office_info
Region:将表按横向切分。Region按大小分割,每个表一开始只有两个Region,随着数据不断插入到表中,Region 不断增大,当增大到一个阈值的时候,Region就会等分为两个新的Region。当表中的行不断增多时,就会有越来越多的Region
横向纵向切分的思想类似于mysql中的水平切分和垂直切分
Row Key:行键,类似于MySql中的主键。Row Key按字典序排序,每个表都有唯一的行键
column qualifier:列限定符,即列名,如:name、city、phone
store:被列族和region划分的每个小块,即实际存储的内容
cell(单元格):通过 rowkey 和 columns 确定的一个存储单元。每个 cell 都保存着同一份数据的多个版本,具体版本通过时间戳来索引。
物理结构–store
row key、TimeStamp、column(column Family+column qualifier)唯一标识一个cell
TimeStamp:用于标识数据的不同版本(version)
对比HBase和MySql
关系数据库 Mysql | HBase |
---|---|
数据库 DataBase | 命名空间 NameSpace,HBase自带的命名空间有hbase(HBase内置的表)、default(用户默认使用的命名空间) |
表 table,定义表时需要声明具体列 | region,HBase定义表时只需要声明列族(column Family)即可,不需要声明具体的列。往 HBase写入数据时,字段可以动态、按需指定 |
元组 | 行 Row。每行数据由一个Rowkey和一个Column组成,数据是按照 RowKey 的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索 |
属性 | 列 Column。HBase 中的每个列都由 Column Family(列族)和 Column Qualifier(列限定符,列名)进行限定 |
时间戳 Time Stamp。用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。注意,如需跨平台运行hbase,则需要调整系统的时间使之一致 | |
填入数据时需要制定数据类型 | 单元格 Cell。由{rowkey, column Family: column Qualifier, time Stamp} 唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮 |
HBase基本架构
待整理自:深入理解 Hbase 架构(翻译) - SegmentFault 思否
HBase命令
基础命令
# 进入hbase安装目录
$cd /usr/local/java/hbase/hbase-1.1.5/bin
# 启动hbase服务
$./start-hbase.sh
# 查看hbase的启动情况
$JPS
# 进入hbase命令行界面
$./hbase shell
# 退出hbase命令行
$exit
# 退出hbase服务
$stop-hbase.sh
表操作命令
ddl | dml | namespage | |
---|---|---|---|
增 | create | put | create_namespace |
删 | drop | delete、deleteall | drop_namespace |
改 | alter | put | alter_namespace |
查 | list、describe | scan、get | describe_namespace、list_namespace |
# 创建表student,并设置属性name、age,HBse可自动指定主键,不用人工设定
create 'student','name','age'
# 添加数据,为student表添加学号为18001(主键)、学生名为Mike的一行数据
put 'student','18001','name:','Mike','age:','18'
# 删除数据
delete 'student','18001','name' # 删除18001这行的name数据
deleteall 'student','18001' # 删除18001这行数据
# 查看数据
get 'student','18001' # 查看某个表的全部数据
scan 'student' # 查看所有表数据
注意:如果在输入命令的末尾增加了分号;
,则两次输入单引号'
即可