当前位置:   article > 正文

《HBase系列》HBase详细入门教程

hbase

一、HBase详细入门教程

1.HBase介绍

分布式的数据库,它的本质是将数据存放在HDFS。它和Hive的最大区别就是,Hive的本质相当于封装了Mapreduce,HBase的本质相当于封装了HDFS。帮助我们存储一些非结构化的数据。他是一个Nosql的数据库。

使用场景:

1.海量非结构化或者结构化的数据的存储

2.需要实现近实时的读写管理的数据

2.HBase结构

在这里插入图片描述

1.client:hbase的客户端,使用shell命令或者APIHBase发出请求,并且客户端其实会缓存region的位置。
2.zookeeper:监控hmaster的状态,如果active的挂了,通知backup的master上位,存储所有region的寻址入口,监控regionserver的状态,并且通知hmaster,存储部分hbase的元数据
3.hmaster:为所有的hregionserver分配region,为regionserver做负载均衡,负责region的裂变,负责hdfs中的垃圾回收
4.regionserver:维护hmaster分配给他们的region,处理client发过来的读写请求,具体来执行负责切过大的region。
5.hlog:对hbase的读写操作,WAL的写数据保证数据安全
6.region:hbase中分布式存储的最小单位和负载均衡的最小单位,它表示表或者表的一部分
7.store:列簇
8.memstore:缓冲区,数据的写入先写入到缓冲区,然后再溢出到hdfs,默认128M
9.storefile:和hfile是同一种含义,不过storefile是逻辑上的名称,hfile是物理上的名称
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.HBase命令

3.1 基础命令

  • help
  • help ‘create_namespace’
  • status
  • version
  • whoami

3.2 namespace(库操作)

  • create_namespace(创建一个命名空间)

    类型1:create_namespace 'zxy'
    类型2:create_namespace 'zxy',{'hbasename'=>'hadoop'}
    
    • 1
    • 2
  • list_namespace(列举当前有多少namespace)

    类型1:list_namespace              (显示全部namespace)
    类型2:list_namespace 'zx*'        (显示以zx开头的namespace)
    
    • 1
    • 2
  • describe_namespace(查看指定namespace的详情)

    describe_namespace 'zxy'
    
    • 1
  • list_namespace_tables(查看指定namespace中的所有table)

    list_namespace_tables 'zxy'
    
    • 1
  • drop_namespace(删除指定的namespace)

    drop_namespace 'zxy'
    
    • 1
  • alter_namespace(修改namespace的属性)

类型1:alter_namespace 'zxy',{METHOD=>'set','PROPERTY_NAME'=>'PROPERTY_VALUE'}
(添加,修改)
类型2:alter_namespace 'zxy',{METHOD=>'unset',NAME='PROPERTY_NAME'}
(删除)
  • 1
  • 2
  • 3
  • 4

3.3 DDL(表操作)

  • 建表(create)

    类型1:create 'zxy:q1',{NAME=>'f1',VERSIONS=>5}
    (表名为q1,列簇为f1,可以保存5个版本数据)
    类型2:create 'q2', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
    (同时创建多个列簇)
    类型3:create 't1', 'f1', 'f2', 'f3'
    (同上)
    类型4: create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
    (表示在默认namespace下创建t1表且列簇为f1,只能保存1个版本数据,表存活时间(TTL:Time to Live)259200毫秒,并且开启块缓存)
    类型5:create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}} 
    (在建表的同时指定hbase的相关的配置信息)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 删表

    • distable

      disable 'zxy:q1'
      is_disabled 'zxy:q1'
      
      • 1
      • 2
    • enable

      enable 'zxy:q1'
      is_enabled 'zxy:q1'
      
      • 1
      • 2
    • drop

      只有当表的is_disabled 'zxy:q1'true时才可以删除
      hbase(main):079:0> drop 'q1'
      ERROR: Table t1 is enabled. Disable it first.
      
      hbase(main):081:0> disable 'q1'
      0 row(s) in 2.2460 seconds
      
      hbase(main):090:0> drop 'q1'
      0 row(s) in 1.2540 seconds
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
  • 查看表(list)

    list 'zxy:.*'
    
    • 1
  • 查看表详情(desc/describe)

    desc/describe命令:
    
    hbase(main):097:0> describe 'zxy:q1'
    Table ns1:t1 is ENABLED
    ns1:t1
    COLUMN FAMILIES DESCRIPTION
    {NAME => 'f1', BLOOMFILTER => 'ROW', VERSIONS => '5', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FAL
    SE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOC
    KCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
    1 row(s) in 0.0200 seconds
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 修改表(alter)

    类型1:alter 'zxy:q1',NAME=>'f1',VERSSIONS=>1
    (修改列簇的版本信息)
    类型2:alter 'zxy:q1',NAME=>'f1',{NAME=>'f2',IN_MEMORY=>true},{NAME=>'f3',VERSIONS=>5}
    (同时修改多个列簇,如果指定列簇不存在就添加,存在就修改)
    类型3:alter 'zxy:q1','f1','f2','f3'
    (使用默认属性,直接声明)
    类型4:alter 'zxy:q1',NAME='f1',METHOD=>'delete'
    类型4:alter 'zxy:q1','delete'=>'f1'
    (删除列簇)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 表是否存在(exists)

    exists 'zxy:q1'
    
    • 1

3.4 DML(表数据操作)

  • 插入(put)

    put 'zxy:q1','r1','f1:name','zxy'
    (在表q1中插入一条数据)
    
    • 1
    • 2
  • 获取(get)

    类型1:get 'zxy:q1','r1'
    (显示r1行的数据)
            hbase(main):015:0> get 'zxy:q1', 'r1'
            COLUMN                     CELL
             f1:name                   timestamp=1621240902844, value=zxy
            1 row(s) in 0.0200 seconds
    
            ## 默认查看最新的时间的值
            hbase(main):018:0> get 'zxy:q1', 'r1'
            COLUMN                     CELL
             f1:name                   timestamp=1621241107495, value=zxy2
            1 row(s) in 0.0080 seconds
    类型2:get 'zxy:q1', 'r1', {TIMERANGE => [1621240902844, 1621241107494]}
    (查看指定范围时间的数据值)
    类型3:get 'zxy:q1','r1',{COLUMN=>['f1','f2','f3']}
    (查看一个表中多个指定的列簇信息)
    类型4:get 'zxy:q1','r1',{COLUMN=>'f1',TIMESTAMP=>1621241107495}
    (查看1621241107495瞬间的值)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 查看(scan)

    类型1:scan 'zxy:q1'
    (查询指定表的数据)
    类型2:scan 'zxy:q1',{COLUMNS=>'f1:name'}
    (查询q1表中所有的有name属性的数据)
    类型3:scan 'zxy:q1',{COLUMNS=>['f1'],LIMIT=>2,STARTROW=>'r1'}
    (查询q1表中的列簇f1,一共查询两行,从r1行开始,同一行的意思是行键相同)
    类型4:scan 'zxy:q1',{COLUMNS=>'f1',TIMESTAMP=>[1621240902844, 1621241107494]}
    (查看指定时间范围内的表中所有的最新值)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 追加数据(append)

    append 'zxy:q1','r1','f1:name','zxy3'
    (zxy3即为追加值)
    
    • 1
    • 2
  • 删除(delete)

    类型1:delete 'zxy:q1','r1','f1:name'
    (删除一个kv数据)
    类型2:delete 'zxy:q1','r1'
    (删除一行)
    类型3:delete 'zxy:q1','r1','f1:name','zxy'
    (删除指定版本-时间戳)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 自增(incr)

    incr 'zxy:q1','001','f1:age'
    (在age设置自增键)
    
    • 1
    • 2
  • 行数(count)

    count 'zxy:q1'
    (q1表的行数)
    
    • 1
    • 2
  • 截断(truncate)

    truncate 'zxy:q1'
    
    • 1

二、Hive整合HBase

1 可能会出现的异常(全分布式)

1. java.lang.InCompatibleClassChanceErr:Found Jline.xxxxxx
- 解决:$HIVE_HOME/lib/jline-2.12.jar拷贝到$HADOOP_HOME/share/hadoop/yarn/lib
  • 1
  • 2

2 建立hive关联hbase的表

2.1 建表语句

hive (default)> create database hive2hbase;
hive (default)> use hive2hbase;

create table if not exists hive2hbase(
uid int,
uname string,
age int,
sex string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:uname,info:age,info:sex")
TBLPROPERTIES ("hbase.table.name" = "hive2hbase1");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.2 报错

在这里插入图片描述

hive和hbase整合的jar包不匹配。
在这个hive中的以下jar包中,缺少依赖。
-rw-rw-r--  1 root root   115935 Jun 19  2015 hive-hbase-handler-1.2.1.jar

解决方式:
要解压这个包,然后重新源码打包。
将我打包之后的jar包覆盖到hive服务器的lib目录下即可

然后重新在hive中执行2.1中的建表语句,之后就可以在hbase中查看到此表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.3 测试

##1. 在hive中导入数据,不能直接用load导入数据
create table if not exists t_user(
uid int,
uname string,
age int,
sex string
)
row format delimited
fields terminated by ',';

load data local inpath '/data/hive2hbase
/user.txt' into table hive2hbase.t_user;

insert into hive2hbase.hive2hbase
select * from hive2hbase.t_user;

##2. 在hbase导入数据
hbase(main):003:0> put 'hive2hbase1', '5', 'info:uname', 'luohao'
0 row(s) in 0.0420 seconds

hbase(main):004:0> put 'hive2hbase1', '5', 'info:age', '18'
0 row(s) in 0.0060 seconds

hbase(main):005:0> put 'hive2hbase1', '5', 'info:sex', 'bt'
0 row(s) in 0.0080 seconds

hive (hive2hbase)> select * from hive2hbase;
OK
1       lixi    34      man
2       wuliji  38      woman
3       xiangweihao     39      superman
4       wangyunfeng     40      superwoman
5       luohao  18      bt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

3 建立HBase关联Hive的表

##1. 在hbase中建表
hbase(main):008:0> create 't1', 'f1'
0 row(s) in 2.2450 seconds

=> Hbase::Table - t1
hbase(main):009:0> put 't1', '1', 'f1:name', 'ergouzi'
0 row(s) in 0.0090 seconds

hbase(main):010:0> put 't1', '1', 'f1:age', '11'
0 row(s) in 0.0040 seconds

hbase(main):011:0> put 't1', '2', 'f1:name', 'tiedan'
0 row(s) in 0.0020 seconds

hbase(main):012:0> put 't1', '2', 'f1:age', '22'
0 row(s) in 0.0020 seconds

##2. 在hive中建表
create external table if not exists t1(
uid int,
uname string,
age int
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f1:age")
TBLPROPERTIES ("hbase.table.name" = "t1");


hive (hive2hbase)> select * from t1;
OK
1       ergouzi 11
2       tiedan  22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

资源获取:

https://download.csdn.net/download/m0_51197424/18884938
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/502495
推荐阅读
相关标签
  

闽ICP备14008679号