目录

1. HBase简介
<https://blog.csdn.net/gaofengyan/article/details/86499043#1.%20HBase%E7%AE%80%E4%BB%8B>

2. hbase安装
<https://blog.csdn.net/gaofengyan/article/details/86499043#2.%20hbase%E5%AE%89%E8%A3%85>

3. hbase的启动与关闭
<https://blog.csdn.net/gaofengyan/article/details/86499043#3.%20hbase%E7%9A%84%E5%90%AF%E5%8A%A8%E4%B8%8E%E5%85%B3%E9%97%AD>

4. 术语
<https://blog.csdn.net/gaofengyan/article/details/86499043#4.%20%E6%9C%AF%E8%AF%AD>

5. HBase Shell命令简单使用
<https://blog.csdn.net/gaofengyan/article/details/86499043#5.%20HBase%20SQL%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8>

1. HBase简介

        HBase是一个基于HDFS的面向列的分布式数据库
。HDFS基于流式数据访问,低时间延迟的数据访问并不适合在HDFS上运行。所以,如果需要实时地随机访问超大规模数据集,使用HBase是更好的选择。HBase时NoSQL(非关系型数据库)数据库,不支持关系型数据库地SQL,并且是
以键值对地方式按列存储,是非关系型数据库(Not Only
SQL)中的一个重要代表。NoSQL目前并没有明确地范围和定义,其主要特点是通常被用于大规模数据地存储、没有预定义地模式(如表结构)、表和表之间没有复杂的关系。总体上可将NoSQL数据库分为以下4类:

* 基于列存储地类型
* 基于文档存储的类型
* 基于键值对存储的类型
* 基于图形数据存储的类型
       HBase
是一个可以建立在HDFS上的分布式NoSQL数据库(非关系型数据库只有对数据表进行增、删、查操作;没有改地操作,要做改的操作,需要先删除,再插入来代替)。

2. hbase安装

    hbase有三种安装方式:单机、伪分布式、完全分布式。
    【单机hbase】:hbase数据库的数据文件存在单一的一台设备上,使用的是该设备的文件系统。
    【伪分布式hbase】:hbase数据库的数据文件存在一台设备构成的hdfs上,数据库也分主从结构。
    【完全分布式hbase】:hbase数据库的数据文件存在多台设备构成的hdfs上,数据库也分主从结构。

     我们这里为了后期学习,直接采用【完全分布式hbase】方式安装:

1)获取hbase安装包并解压到node1的/home/hdser/下 并重命名为hbase
[hduser@node1 ~]$ tar -zxvf /home/hduser/桌面/hbase-1.2.0-bin.tar.gz -C
/home/hduser/ [hduser@node1 ~]$ mv /home/hduser/hbase-1.2.0/ /home/hduser/hbase
 2)配置hbase核心配置文件(hbase-site.xml)
       /home/hduser/hbase/conf/下
        用安装的gedit记事本进入:
[hduser@node1 conf]$ gedit hbase-site.xml
        增加以下核心内容:
<!-- 设置hbase 在hdfs 数据的存储位置 即配置HRegionServer的数据库存储目录--> <property>
<name>hbase.rootdir</name> <value>hdfs://node1:9000/hbase</value> </property>
<!-- 设置hbase是完全分布式类型,默认为false,即单机运行,true表示在分布模式运行 --> <property>
<name>hbase.cluster.distributed</name> <value>true</value> </property> <!--
指定hbase的HMaster访问地址、端口 --> <property> <name>hbase.master</name>
<value>node1:60000</value> </property> <!-- hbase的家庭成员(主从机的网络用户名) -->
<property> <name>hbase.zookeeper.quorum</name> <value>node1,node2,node3</value>
</property>
   3)配置hbase环境配置文件(hbase-env.sh)
       /home/hduser/hbase/conf/下
        用安装的gedit记事本进入:
[hduser@node1 conf]$ gedit hbase-env.sh
     在文末增加以下环境变量配置:

       修改JAVA_HOME配置:
export JAVA_HOME=/usr/java/jdk1.8.0_171
       增加HADOOP_HOME配置:
export HADOOP_HOME=/home/hduser/hadoop
       增加HBASE_HOME配置:
export HBASE_HOME=/home/hduser/hbase
       增加启用hbase 内置zookeeper配置:
export HBASE_MANAGERS_ZK=true
   4)配置从机网络用户名(regionservers)
      /home/hduser/hbase/conf/下
        用安装的gedit记事本进入:
[hduser@node1 conf]$ gedit regionservers
将内容更改成从机用户名信息:
node2 node3
   5)拷贝node1的hbase的主目录到node2,node3下,使得各个节点上都能运行HBase来构建HBase集群,执行以下两个命令
[hduser@node1 ~]$ scp -r hbase hduser@node2:/home/hduser/ [hduser@node1 ~]$
scp -r hbase hduser@node3:/home/hduser/
   6)配置hbase的环境变量
      用记事本命令打开配置环境
[hduser@node1 ~]$ sudo gedit /etc/profile
      增加以下配置内容:
export HBASE_HOME=/home/hduser/hbase export PATH=$PATH:$HBASE_HOME/bin
      保存并退出,使文件生效:
[hduser@node1 ~]$ source /etc/profile
3. hbase的启动与关闭

    1)启动(启动前必须保证hdfs已经启动)
        语法:【$>hbase主目录下/bin/start-base.sh】
[hduser@node1 ~]$ ./hbase/bin/start-hbase.sh node1: starting zookeeper,
logging to /home/hduser/hbase/logs/hbase-hduser-zookeeper-node1.out node2:
starting zookeeper, logging to
/home/hduser/hbase/logs/hbase-hduser-zookeeper-node2.out node3: starting
zookeeper, logging to /home/hduser/hbase/logs/hbase-hduser-zookeeper-node3.out
starting master, logging to
/home/hduser/hbase/logs/hbase-hduser-master-node1.out node3: starting
regionserver, logging to
/home/hduser/hbase/logs/hbase-hduser-regionserver-node3.out node2: starting
regionserver, logging to
/home/hduser/hbase/logs/hbase-hduser-regionserver-node2.out node3: Java
HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support
was removed in 8.0 node3: Java HotSpot(TM) 64-Bit Server VM warning: ignoring
option MaxPermSize=128m; support was removed in 8.0 node2: Java HotSpot(TM)
64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in
8.0 node2: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option
MaxPermSize=128m; support was removed in 8.0
         
Hbase首先启动的是ZooKeeper,再启动的是HMaster和HRegionServer,启动成功后注意node1上增加了两个java进程—"HQuorumPeer"和"HMaster",分别是ZooKeepper进程和HBase进程:
[hduser@node1 bin]$ jps 12226 HMaster 11186 NameNode 13651 Jps 11526
ResourceManager 11384 SecondaryNameNode 5353 HQuorumPeer 12748 Main
      
 再看从机的Java进程,这里多了两个进程“HQuorumPeer”和“HRegionServer”,同样分别是ZooKeepper进程和HBase进程:
[hduser@node2 bin]$ jps 5444 DataNode 5557 NodeManager 4437 HQuorumPeer 4542
HRegionServer 6303 Jps
    2)关闭
       语法:【 $>hbase主目录下/bin/stop-base.sh】
[hduser@node1 hbase]$ /home/hduser/hbase/bin/stop-hbase.sh stopping
hbase................ node3: stopping zookeeper. node2: stopping zookeeper.
node1: stopping zookeeper.
    3)浏览器测试:
        访问:  http://node1.16010



    4)命令测试(登陆进入数据库)
        语法:【$>hbase主目录下/bin/hbase shell】
[hduser@node1 ~]$ ./hbase/bin/hbase shell
        进入HBase Shell后,使用HBase Shell命令“status”可在HBase
Shell中查看HBase的运行状态,如下,表示当前共有两个HRegionServer正在正常运行:
hbase(main):001:0> status 2 servers, 0 dead, 1.5000 average load
4. 术语

    1)hregion
        hregion指的是hbase的数据存储是以区块(region)存储的。
    2)hregionserver
        hregionserver指的是hbase数据库从机,存具体数据。
    3)hmaster
        hmaster指的是hbase主机,存储元数据(结构数据)。
    4)行(row)与行键(rowkey)
        hbase中一条完整的数据即一行,由一个唯一的行键+多个列键值构成。
        行键:每一行都有一条内置的主键,用于区别其他行数据。
    5)列簇(columnfamily)
        hbase中列簇指的是一个大列,这个大的列可以有0个(列簇即列)或多个列(column)构成。
        如成绩表score中course列簇由数学(math)、美术(art)等。
        新建表只需要指定列簇,而不需要指定列。
        create table score ,'course:'.
    6)列键(column key)
        hbase中每一行数据都是由很多列键构成的,其中一个列一般都有一个或多个列键。
        每一个列键值都由行键、单元格值、时间戳、版本构成。
        如:成绩表中数学成绩结构如下->
           行键         列                  单元格值      时间戳           版本
           1001      course:math     55                2019-1***      
 1(及时间戳,以1,2,3.....增加)    
    7)单元格(cell 或者列键值)
        在hbase中,值是作为一个单元保存在系统中的,要定位一个单元,需要使用”行键+列键+时间戳“等三要素
    8)时间戳(Timestamp)
        插入单元格时的时间,默认作为单元格的版本号。

    9)来两个自定义的概要图理解





5. HBase Shell命令简单使用

     命令都在hbase主目录下/bin/下,可以配置bin到环境变量PATH下(即上面做的环境变量配置)

     注意:所有的表名和列名都要用单引号括起来并以逗号分隔开。
     1)查看所有表:list
        语法:【$hbase>list】

        示例:
hbase(main):006:0> list TABLE music scores 2 row(s) in 0.0310 seconds =>
["music", "scores"]
        2) 查看当前表所有列簇的详细描述信息:describe
        语法:【$hbase>describe '表名'】

        示例:
hbase(main):007:0> describe 'scores' Table scores is ENABLED scores COLUMN
FAMILIES DESCRIPTION {NAME => 'course', BLOOMFILTER => 'ROW', VERSIONS => '1',
IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING =>
'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0',
BLOCKCACHE => 'true', BLOCKSIZE => ' 65536', REPLICATION_SCOPE => '0'} {NAME =>
'grade', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', K
EEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER',
C OMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE =>
'6 5536', REPLICATION_SCOPE => '0'} 2 row(s) in 0.3110 seconds
     3)新建表、列、列簇:create
        简化方式语法:【$hbase>create '表名’,‘列簇1',......'列簇n'】

       示例:
hbase(main):005:0> create 'scores','grade','course' 0 row(s) in 1.6600 seconds
=> Hbase::Table - scores
        完整的语法写法:【$hbase>create
'表名',{NAME=>'列簇名',VERSIONS=>可保存在单元时间版本的最大数量},....】
        样例:

       $hbase>create
'scores',{NAME=>'grade',VERSIONS=>5},{NAME=>'course',VERSIONS=5}

       
对比上一个方式,此命令制定了列簇名及可保存的单元时间版本最大数量。可以看出,指定列簇参数的格式为:参数名=>参数值,注意赋值符号为“=>”且参数名必须大写。如果制定了多个参数,应以逗号分开,最后所有参数以“{}”括起来表示一个列簇。
     4)插入数据:put
        语法:【$hbase>put '表名','行键名','列键名称','单元格值'】
        样例:插入播放记录
        $hbase>put 'music','1001','song','music1'
        $hbase>put 'music','1001','singer','singer1'
        $hbase>put 'music','1001','playdata','2019-11-1'

       示例:
hbase(main):008:0> put 'scores','tom','grade:','1' 0 row(s) in 0.2000 seconds
hbase(main):009:0> put 'scores','tom','course:art','80' 0 row(s) in 0.0400
seconds hbase(main):010:0> put 'scores','tom','course:math','89' 0 row(s) in
0.0090 seconds hbase(main):011:0> put 'scores','jason','grade:','2' 0 row(s) in
0.0330 seconds hbase(main):012:0> put 'scores','jason','course:art','87' 0
row(s) in 0.0120 seconds hbase(main):013:0> put
'scores','jason','course:math','57' 0 row(s) in 0.0040 seconds
     5)扫描一张表:scan
       语法:【 $hbase>scan '表名',{COLUMNS=>['列簇名1’,‘列簇名2'......],参数名=>参数值....}】
大括号内的内容为扫描条件,如果不指定则查询所有数据。

      示例1:
hbase(main):014:0> scan 'scores' ROW COLUMN+CELL jason column=course:art,
timestamp=1547563878493, value=87 jason column=course:math,
timestamp=1547563894482, value=57 jason column=grade:, timestamp=1547563847271,
value=2 tom column=course:art, timestamp=1547563796441, value=80 tom
column=course:math, timestamp=1547563812083, value=89 tom column=grade:,
timestamp=1547563754447, value=1 2 row(s) in 0.0550 seconds
      示例2:以上输出结果显示2行数据,因为在scan的结果中,将相同的行键的所有单元视为一行。如果对有些列簇不关心,便可以指定只查询某一个列簇:
hbase(main):015:0> scan 'scores',{COLUMNS=>'course'} ROW COLUMN+CELL jason
column=course:art, timestamp=1547563878493, value=87 jason column=course:math,
timestamp=1547563894482, value=57 tom column=course:art,
timestamp=1547563796441, value=80 tom column=course:math,
timestamp=1547563812083, value=89 2 row(s) in 0.0260 seconds
        语法:【 $hbase>scan '表名'
,{COLUNMN=>['列键1’,‘列键2'......],参数名=>参数值....}】将COLUMNS替换成COLUMN,表示当前扫描的目标时列键,如下示例中扫描所有行的列键为“course:math”的单元,并使用LIMIT参数限制只输出一个单元:

        示例3:
hbase(main):016:0> scan 'scores',{COLUMN=>'course:math',LIMIT=>1} ROW
COLUMN+CELL jason column=course:math, timestamp=1547563894482, value=57 1
row(s) in 0.2050 seconds
     6)查询一行数据(不筛选):get
       语法:【 $hbase>get '表名' ,'行主键名'】
        样例:只查看 1001的数据
        $hbase>get 'music','1001'

       示例:查找行键为“jason”的所有单元
hbase(main):018:0> get 'scores','jason' COLUMN CELL course:art
timestamp=1547563878493, value=87 course:math timestamp=1547563894482, value=57
grade: timestamp=1547563847271, value=2 3 row(s) in 0.1180 seconds
     7)查询一行中某些单元格的数据(筛选):get

       语法:【 $hbase>get '表名'
,'行主键名',{COLUNMNS=>['列簇名1’,‘列簇名2'......],参数名=>参数值....}】

       语法:【 $hbase>get '表名'
,'行主键名',{COLUNMN=>['列键1’,‘列键2'......],参数名=>参数值....}】

       示例:精确查找行键为“jason”,列键为"course:math"的单元
hbase(main):020:0> get 'scores','jason',{COLUMN=>'course:math'} COLUMN CELL
course:math timestamp=1547563894482, value=57 1 row(s) in 0.0080 seconds
      与scan相比多一个行键参数。因为scan查找的目标是全表的某个列簇、列键,而get查找的目标是某行的某个列簇、列键。

    提示:

* get 'scores','jason',{COLUMNS=>'course'}  等价于 get 'scores','jason','course'
* get 'scores','jason',{COLUMN=>'course:math'}  等价于 get
'scores','jason','course:math'
* get 'scores','jason',{COLUMNS=>['course','grade']}  等价于 get
'scores','jason','course','grade'
* get 'scores','jason',{COLUMN=>['course:math','grade:']}  等价于 get
'scores','jason','course:math','grade:'
     7)删除数据(删除一行中的一个单元):delete
        语法:【$hbase>delete '表名','行主键名' {CLOUMNS=>'列键值'}】
注意:'列键值'--->'列簇名:查找的单元名称'

     示例:
hbase(main):021:0> delete 'scores','jason','course:art' 0 row(s) in 0.0690
seconds hbase(main):022:0> get 'scores','jason' COLUMN CELL course:math
timestamp=1547563894482, value=57 grade: timestamp=1547563847271, value=2 2
row(s) in 0.0150 seconds
     8)删除一行:deleteall
        语法:【$hbase>deleteall '表名','行主键名'】

     9)修改表:alter

     
 语法:【$hbase>alter'表名称',参数名=>参数值,........】为表增加或修改列簇;其中列簇名参数NAME必须提供,如果已存在则修改,否则会增加一个列簇。

       示例:将scores表的列簇“course”的“VERSIONS”参数修改为“5”
hbase(main):023:0> alter 'scores',NAME=>'course',VERSIONS=>'5' Updating all
regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 2.4070
seconds
       语法:【$hbase>alter'表名称',{参数名=>参数值,....},{参数名=>参数值,....}.......】
同时修改或增加多个列簇时应用逗号分开,并且每个列簇用“{}”括起来。

       示例:将同时修改scores表的两个列簇
hbase(main):024:0> alter
'scores',{NAME=>'grade',VERSIONS=>'5'},{NAME=>'course',VERSIONS=>'5'} Updating
all regions with the new schema... 1/1 regions updated. Done. Updating all
regions with the new schema... 1/1 regions updated. Done. 0 row(s) in 3.8990
seconds
     10)删除表:drop

     语法:【$hbase>drop '表名'】

      HBase表分为两种状态:ENABLED和DISABLED,分别表示是否可用。

      使用disable将表设置为不可用状态:

     语法:【$hbase>disable'表名'】

      使用enable将表设置为可用状态:

     语法:【$hbase>enable '表名'】

     当表为ENABLED状态时,会被禁止删除,所以必须先将表设置为DISABLED状态才可以被删除。

    示例:
hbase(main):032:0> disable 'scores' 0 row(s) in 2.2610 seconds
hbase(main):033:0> drop 'scores' 0 row(s) in 1.2970 seconds hbase(main):034:0>
list TABLE music 1 row(s) in 0.0040 seconds => ["music"] hbase(main):035:0>
提示:以上示例的顺序不完全是按正常顺序操作下来的,所以,应该按照正常的创建,增加,获取,修改,删除流程来操作。