一、简介和启动

1、 简介

        HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式NoSQL数据库

        利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务

        主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)

逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map

2、启动

        首先启动hadoop,start-all.sh  ,然后分别启动zookeeper, zkServer.sh start

        最后启动hbase   start-hbase.sh

        关闭 stop-hbase.sh

二、数据结构和数据模型

1、逻辑结构

hbase 单独启动master hbase的启动_hbase

 2、存储结构

hbase 单独启动master hbase的启动_hbase 单独启动master_02

 3、数据模型概念

hbase 单独启动master hbase的启动_hbase_03

三、Hbase shell命令学习

1、进入HBASE

        命令: hbase shell   

2、help  查看Hbase shell 支持命令,分组如下:

(1)general
         processlist, status, table_help, version, whoami

(2)namespace
        alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

(3)dml
        append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

(4)ddl
        alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, list_regions, locate_region, show_filters

3、general

        查看版本:
              version

        查看HBASE当前状态:
              status

4、namespace 命名空间

(1)create_namespace 创建命名空间

             create_namespace 'mydb1'

             create_namespace 'mydb2',{'create_time' => '2022-04-25'}  添加详细信息

(2)list_namespace 查看当前所有的命名空间
             结果中:
                  default  -- 用户默认使用的命名空间
                  hbase  -- hbase中存放的是HBase内置的表   

(3)describe_namespace 查看命名空间的详细信息

            describe_namespace '命名空间'

(4)alter_namespace 修改命名空间
        METHOD必须大写,不区分大小写

        增加author配置并且修改create_time配置,操作为set,后面为添加和覆盖配置信息
  alter_namespace 'mydb2',{'METHOD' => 'set', 'author'=> 'act', 'create_time' => '2022-4-27'}

        删除create_time配置,操作unset,后面name为删除的信息关键字
alter_namespace 'mydb2',{'METHOD' => 'unset', NAME=>'create_time'}

(5)drop_namespace 删除空的命名空间
            drop_namespace 'mydb2'

(6)list_namespace_tables 查看指定命名空间下的表
            list_namespace_tables '命名空间'

5、DDL-表操作

(1)create 创建表

ns1:表示命名空间        t1:表示表名称        f1:表示列族
格式:
hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
hbase> create 't1', 'f1', 'f2', 'f3'

hbase> t1 = create 't1', 'f1'

实例:

        默认命名空间default下创建mytb1表,列族为info
                create 'mytb1', 'info'

        指定命令空间,在db1命名空间下创建表
                create_namespace 'db1'
                创建一个列族:create 'db1:mytb1', 'info1'

        创建表时指定多个列族
                create 'db1:mytb2', 'info1', 'info2', 'info3'

        创建表并指定列族版本
                create 'db1:mytb4',{NAME => 'info1',VERSIONS => 3}

(2)describe 查看表的具体信息
            样例:
                describe 'db1:mytb2'
表中的列族信息中可以看出,每个列族都维护自己的一个版本信息,一个列族对应一个store
                
              desc 'db1:mytb2'  功能一样

(3)alter 修改表

        help 'alter'
            样例:
                1.修改列族版本号
                     格式:alter 't1', NAME => 'f1', VERSIONS => 5
                     alter 'db1:mytb4', NAME => 'info1', VERSIONS => 4

                2.删除列族
                    格式:alter 'ns1:t1', 'delete' => 'f1'
                    alter 'db1:mytb2','delete' => 'info3' 

                    格式:alter 'ns1:t1', NAME => 'f1', METHOD => 'delete'
                    alter 'db1:mytb2', NAME => 'info2', METHOD => 'delete'

(4)删除表
            help 'drop'
            注意: 使用drop操作时先需要执行disable
            样例:
                1.disable 'db1:mytb2'  关闭表
                2.drop 'db1:mytb2'

(5)关闭及启用表
            1.关闭表操作:
                disable 'db1:mytb1'
                desc 'db1:mytb1'

            2.启用表操作:
                enable 'db1:mytb1'
                desc 'db1:mytb1'

    7、DML-表数据操作

        r1 表示 rowKey 
        c1 表示 列名称

   (1)put 上传及修改数据操作
      格式:
              hbase> put 'ns1:t1', 'r1', 'c1', 'value'
              hbase> put 't1', 'r1', 'c1', 'value'
              hbase> put 't1', 'r1', 'c1', 'value', ts1
              hbase> put 't1', 'r1', 'c1', 'value', {ATTRIBUTES=>{'mykey'=>'myvalue'}}
              hbase> put 't1', 'r1', 'c1', 'value', ts1, {ATTRIBUTES=>{'mykey'=>'myvalue'}}
              hbase> put 't1', 'r1', 'c1', 'value', ts1, {VISIBILITY=>'PRIVATE|SECRET'}
      样例:
               create 'db1:stu', 'info'  创建一个表
               put 'db1:stu', '1001', 'info:name', 'zhangsan'  给表上传数据

               注:修改数据可以直接用put上传最新数据进行替换、

               put 'db1:stu', '1001', 'info:age', '12'
               put 'db1:stu', '1001', 'info:age', '13'    get时12已经被13覆盖

(2)get 获取一行数据操作
  格式:   

          hbase> t.get 'r1'
          hbase> t.get 'r1', {TIMERANGE => [ts1, ts2]}
          hbase> t.get 'r1', {COLUMN => 'c1'}
          hbase> t.get 'r1', {COLUMN => ['c1', 'c2', 'c3']}
          hbase> t.get 'r1', {COLUMN => 'c1', TIMESTAMP => ts1}
          hbase> t.get 'r1', {COLUMN => 'c1', TIMERANGE => [ts1, ts2], VERSIONS => 4}
          hbase> t.get 'r1', {COLUMN => 'c1', TIMESTAMP => ts1, VERSIONS => 4}
          hbase> t.get 'r1', {FILTER => "ValueFilter(=, 'binary:abc')"}
          hbase> t.get 'r1', 'c1'
          hbase> t.get 'r1', 'c1', 'c2'
          hbase> t.get 'r1', ['c1', 'c2']
          hbase> t.get 'r1', {CONSISTENCY => 'TIMELINE'}
          hbase> t.get 'r1', {CONSISTENCY => 'TIMELINE', REGION_REPLICA_ID => 1}

样例:          

        get 'db1:stu', '1001'   查询了上面上传的数据。 
          
          put 'db1:stu', '1001', 'info:age', '12'
          get 'db1:stu', '1001'

          put 'db1:stu', '1001', 'info:age', '13'

          获取指定ROWKEY中某一列数据
          get 'db1:stu', '1001', 'info:age'
          
          获取指定RowKey下的多列数据
          get 'db1:stu', '1001', 'info:age','info:name'

(3)scan 获取表中所有数据

       1.scan 'db1:stu'

       2.ROWKEY是根据字典排序,并且排序的依据是按位比较ASCII码表,1001、10010、1002

        按ROWKEY范围进行取值 左闭右开 取值包含STARTROW 不包含 STOPROW
        scan 'db1:stu', {STARTROW => '1001',STOPROW => '1004'}

       根据ASCII码表取
        scan 'db1:stu', {STARTROW => '1001!',STOPROW => '1001~'}

        3.查看表中所有数据并展示所有版本信息
        scan 'db1:stu' ,{RAW=>true,VERSIONS=>10}

        4.list_namespace_tables '命令空间'   查看所有表

        5.count 统计表中数据量
            count 'db1:stu'

        6.删除列

            delete 'db1:stu','1001','info:age','1650941469177'  
        7.删除一个rowkey
            deleteall 'db1:stu','1001'

        8.清空表数据
            truncate 'db1:stu'