HBase基础【HBase简介、HBase安装、HBase shell操作】

一 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
#HBASE_HOME
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
#修改以下内容
# Tell HBase whether it should manage it's own instance of ZooKeeper or not.
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 高可用配置

#实现Hbase的高可用
#在HBase中HMaster负责监控HRegionServer的生命周期,均衡RegionServer的负载,如果HMaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对HMaster的高可用配置。
cd /opt/module/hbase-2.0.5/conf/
vim backup-masters
#添加以下内容
hadoop102
hadoop103
#分发到其他机器
xsync backup-masters

#File naming hosts on which backup HMaster will run.  $HBASE_HOME/conf/backup-masters by default.export HBASE_BACKUP_MASTERS=${HBASE_HOME}/conf/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操作

#查看当前Hbase中有哪些namespace
list_namespace
default(创建表时未指定命名空间的话默认在default下)                                           hbase(系统使用的,用来存放系统相关的元数据信息等,勿随便操作)
#创建namespace
#查看帮助信息 help 'create_namespace'
create_namespace 'mydb'
create_namespace 'mydb1',{'createtime'=>'2022-06-14'}
#查看namespace的信息
describe_namespace 'mydb1'
#help 'alter_namespace'  可增加,可修改,可删除属性
alter_namespace 'mydb',{METHOD=>'set','createtime'=>'2022-06-14'}
alter_namespace 'mydb1','createtime'=>'2022-06-15','author'=>'hike'}
alter_namespace 'mydb1',{METHOD=>'unset',NAME=>'createtime'}
#删除namespace(namespace下有表存在删除不了)
drop_namespace 'mydb1'

(3)表的ddl操作

#创建表
create 'mydb:test1',{NAME=>'f1'}
##在默认namespace下创建表
create 'test2',{NAME=>'f1'}
##若只有一个属性,可以简化
create 'test3','f1'
create 'mydb:test3','f1'
create 'mydb:test4','f1','f2'

#查看表
list #查看所有namspace下自己创建的表
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操作

#创建student表,列族为info
create 'stu','info'
#添加数据,row key为1001,列名为name,姓名为zhangsan
put 'stu','1001','info:name','zhangsan'
put 'stu','info:sex','man'
put 'stu','info:address','beijin'

put 'stu','1002','lisi'
put 'stu','woman'
put 'stu','tianjin'

put 'stu','10021','lisilisi'
put 'stu','10020','lisilisilisi'
put 'stu','1002$','1003','wangwu'
put 'stu','shanghai'
put 'stu','info:age','26'

#hbase只能通过row key查看数据
get 'stu','1001'
get 'stu','info:name'
get 'stu','info:age'

#扫描数据
##全表扫描
scan 'stu'
scan 'stu',{STARTROW=>'1002'}
##左开右闭
scan 'stu',{STARTROW=>'1001',STOPROW=>'1003'}
##扫描1002(包含)之前的数据
scan 'stu',STOPROW=>'1002!'}
##扫描1002(不包含)之后的数据
scan 'stu',{STARTROW=>'1002!'}

#修改数据(并不是真的修改了,在后面添加了一条数据,在合适的时机删除掉老版本的数据)
put 'stu','zhangsanxiugai'
##查看不同版本的数据
scan 'stu',{RAW=>true,VERSIONS=>5}

#删除数据
##删除最新版本的数据
delete 'stu','info:name'  #Delete 
##删除某一版本数据
delete 'stu',1655293434191  #Delete 

#删除某一条数据的所有版本
put 'stu','lisixiugai'
deleteall 'stu','info:name'  #DeleteColumn 
deleteall 'stu','1002$'  #DeleteFamily  

#统计有几条数据
count 'stu'
#清空表数据
truncate 'stu'

相关文章

文章浏览阅读301次。你可以使用Thrift客户端来测试HBase Thr...
文章浏览阅读565次。hive和hbase数据迁移_hive转hbase
文章浏览阅读707次。基于单机版安装HBase,前置条件为Hadoop...
文章浏览阅读301次。linux集群搭建-HBase_linux中在/home目录...
文章浏览阅读933次。中没有库的概念,说一个数据说的是哪一个...
文章浏览阅读1k次,点赞16次,收藏21次。整理和梳理日常hbas...