一 HBase简介
1 HBase定义
HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。
Apache HBase 是 Hadoop 数据库,一种分布式、可扩展的大数据存储。
当需要对大数据进行随机、实时的读/写访问时,请使用 Apache HBase。 该项目的目标是在商用硬件集群上托管非常大的表——数十亿行 * 数百万列。 Apache HBase 是一个开源、分布式、版本化、非关系型数据库,模仿 Google 的 Bigtable:Chang 等人的结构化数据的分布式存储系统。 正如 Bigtable 利用 Google 文件系统提供的分布式数据存储一样,Apache HBase 在 Hadoop 和 HDFS 之上提供了类似 Bigtable 的功能。
NoSQL:Not Only SQL,是一种对关系型数据库的扩展。无事务,无ACID。基于内存存储,读取速度快。十分容易扩展。
百度百科解释:https://baike.baidu.com/item/NoSQL/8828247?fr=aladdin
2 HBase数据模型
逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。
(1) HBase逻辑结构
其中Row key根据字典序实现自动排序。
按照Region分别进行维护,按照列族进行切分store,底层以store为单位进行存储,一个region的数据存储在一个机器中,一个store存储为一个文件。
(2) HBase物理存储结构
Hbase支持随机实时的读取操作,但HDFS都不支持随机的读写操作,Hbase又是基于HDFS进行开发的,所以Hbase实现的是伪随机实时读取。如手机号177和131,其更新不会在原数据上进行修改,而是实施末尾追加操作,在显示的结果中,选择时间戳大的数据进行显示,同样在删除时也不会立即真的删除原数据,而是选择一个合适的时间进行统一删除【先假后真】。
(3)数据模型
a)Name Space
命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间。
通过hbase维护一些自己的元数据。
b)Table
类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。
c)Row
HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
实际上也可以通过其他字段进行检索,比如查找姓名为张三的数据信息,但这样检索hbase会进行全表查询,效率太低,所以一般认为只可以通过RowKey进行检索。
d)Column
HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,例如info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义。
e)Time Stamp
用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间。
f)Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据全部是字节码形式存贮。
3 HBase基本架构
结构角色:
-
Region Server(DML) Region Server为 Region的管理者,其实现类为HRegionServer,主要作用如下: 对于数据的操作:get, put, delete; 对于Region的操作:splitRegion、compactRegion。 -
Master(DDL) Master是所有Region Server的管理者,其实现类为HMaster,主要作用如下: 对于表的操作:create, delete, alter 对于RegionServer的操作:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移。 -
Zookeeper HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。 -
HDFS HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持。
二 HBase入门
1 hbase安装
tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module/
sudo vim /etc/profile.d/my_env.sh
export HBASE_HOME=/opt/module/hbase-2.0.5
export PATH=$PATH:$HBASE_HOME/bin
cd /opt/module/hbase-2.0.5/conf/
vim hbase-env.sh
export HBASE_MANAGES_ZK=false
vim hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop101:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop101,hadoop102,hadoop103</value>
</property>
vim regionservers
hadoop101
hadoop102
hadoop103
xsync hbase-2.0.5/
sudo ~/bin/xsync /etc/profile.d/my_env.sh
start-hbase.sh
出现以下信息,集群启动成功
也可以在客户端进行访问http://hadoop101:16010/master-status
2 解决日志冲突
stop-hbase.sh
xcall rm -rf /opt/module/hbase-2.0.5/lib/slf4j-log4j12-1.7.25.jar
xcall ls /opt/module/hbase-2.0.5/lib/ | grep slf4j
3 高可用配置
cd /opt/module/hbase-2.0.5/conf/
vim backup-masters
hadoop102
hadoop103
xsync backup-masters
配置完成后可以再客户端查看到
4 机器启动时间戳问题
如果集群之间的节点时间不同步,会导致regionserver无法启动,抛出ClockOutOfSyncException异常。
1)参考hadoop集群中的时间同步服务
2)将属性hbase.master.maxclockskew设置更大的值
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from master</description>
</property>
5 HBase Shell 操作
(1)基本操作
#进入HBase客户端命令行
hbase shell
#查看帮助命令
help
(2)namespace操作
list_namespace
default(创建表时未指定命名空间的话默认在default下) hbase(系统使用的,用来存放系统相关的元数据信息等,勿随便操作)
create_namespace 'mydb'
create_namespace 'mydb1',{'createtime'=>'2022-06-14'}
describe_namespace 'mydb1'
alter_namespace 'mydb',{METHOD=>'set','createtime'=>'2022-06-14'}
alter_namespace 'mydb1',{METHOD=>'set','createtime'=>'2022-06-15','author'=>'hike'}
alter_namespace 'mydb1',{METHOD=>'unset',NAME=>'createtime'}
drop_namespace 'mydb1'
(3)表的ddl操作
create 'mydb:test1',{NAME=>'f1'}
create 'test2',{NAME=>'f1'}
create 'test3','f1'
create 'mydb:test3','f1'
create 'mydb:test4','f1','f2'
list
list_namespace_tables 'mydb'
alter 'mydb:test1',NAME=>'f1',VERSIONS=>'2'
alter 'mydb:test4',{NAME=>'f1',VERSIONS=>'5'},{NAME=>'f2',VERSIONS=>'6'}
alter 'mydb:test4',NAME=>'f3',VERSIONS=>'2'
alter 'mydb:test4','delete'=>'f1'
escribe 'mydb:test1'
desc 'mydb:test1'
disable 'mydb:test1'
drop 'mydb:test1'
(4)表的dml操作
create 'stu','info'
put 'stu','1001','info:name','zhangsan'
put 'stu','1001','info:sex','man'
put 'stu','1001','info:address','beijin'
put 'stu','1002','info:name','lisi'
put 'stu','1002','info:sex','woman'
put 'stu','1002','info:address','tianjin'
put 'stu','10021','info:name','lisilisi'
put 'stu','10021','info:sex','woman'
put 'stu','10021','info:address','tianjin'
put 'stu','10020','info:name','lisilisilisi'
put 'stu','10020','info:sex','woman'
put 'stu','10020','info:address','tianjin'
put 'stu','1002$','info:name','lisilisilisi'
put 'stu','1002$','info:sex','woman'
put 'stu','1002$','info:address','tianjin'
put 'stu','1003','info:name','wangwu'
put 'stu','1003','info:sex','man'
put 'stu','1003','info:address','shanghai'
put 'stu','1003','info:age','26'
get 'stu','1001'
get 'stu','1003','info:name'
get 'stu','1003','info:name','info:age'
scan 'stu'
scan 'stu',{STARTROW=>'1002'}
scan 'stu',{STARTROW=>'1001',STOPROW=>'1003'}
scan 'stu',{STARTROW=>'1001',STOPROW=>'1002!'}
scan 'stu',{STARTROW=>'1002!'}
put 'stu','1001','info:name','zhangsanxiugai'
scan 'stu',{RAW=>true,VERSIONS=>5}
delete 'stu','1001','info:name'
delete 'stu','1001','info:name',1655293434191
put 'stu','1002','info:name','lisixiugai'
deleteall 'stu','1002','info:name'
deleteall 'stu','1002$'
count 'stu'
truncate 'stu'
|