Skip to content

Latest commit

 

History

History
397 lines (252 loc) · 13.4 KB

3、HBase-Shell操作.md

File metadata and controls

397 lines (252 loc) · 13.4 KB

本节开始HBase Shell的简单操作,进入HBase Shell很简单,只需要写入以下命令就可以了(当然要保证HBase是启动的):

[wzq@hadoop102 ~]$ hbase shell

一、Help

Help!Help!:fearful: !不会使用HBase Shell命令的时候一定要学会使用help指令,在窗口中直接输入help指令:

hbase:002:0> help
HBase Shell, version 2.4.11, r7e672a0da0586e6b7449310815182695bc6ae193, Tue Mar 15 10:31:00 PDT 2022
Type 'help "COMMAND"', (e.g. 'help "get"' -- the quotes are necessary) for help on a specific command.
Commands are grouped. Type 'help "COMMAND_GROUP"', (e.g. 'help "general"') for help on a command group.

COMMAND GROUPS:
  Group name: general
  Commands: processlist, status, table_help, version, whoami

  Group name: ddl
  Commands: alter, alter_async, alter_status, clone_table_schema, 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

  Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

  Group name: dml
  Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

...
此处有省略
...

发送help命令之后,会显示出HBase的所有可用命令,每个命令都有对应的Group,一般我们操作HBase都是在Java里面写代码的,所以显得HBase Shell命令就不那么重要了,所以这次只学习一些简单的常用命令

遇到命令不会用,可以直接打help '<命令>',会列出这个命令的示例用法,比如:

hbase:006:0> help 'list'
List all user tables in hbase. Optional regular expression parameter could
be used to filter the output. Examples:

  hbase> list
  hbase> list 'abc.*'
  hbase> list 'ns:abc.*'
  hbase> list 'ns:.*'

显示list命令的用法,list命令可以列出所有用户在hbase中的表,也可以加一些正则表达式来过滤输出

有了这个例子就不怕有什么命令不会使用啦!:wink:

二、namespace

namespace就相当于MySQL里面的数据库了,在关于HBase你应该知道这些!里面对namespace有介绍

关于namespace这一块有以下几个命令:

hbase:002:0> help
...
  Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
...  

其中,创建namespace的命令是:create_namespace,不会用啊,用一下help

hbase:007:0> help 'create_namespace'
Create namespace; pass namespace name,
and optionally a dictionary of namespace configuration.
Examples:

  hbase> create_namespace 'ns1'
  hbase> create_namespace 'ns1', {'PROPERTY_NAME'=>'PROPERTY_VALUE'}

这个命令的意思就是创建一个命名空间,也可以以字典的形式为这个命名空间增加一些额外的配置,比如,创建一个bigdata命名空间:

hbase:008:0> create_namespace 'bigdata'

查看所有的命名空间使用:(list_namespace

hbase:009:0> list_namespace
NAMESPACE                                                                                  bigdata                                                                                    default                                                                                   hbase                                                                                     
3 row(s)
Took 0.0443 seconds

也可以查看某个命名空间的详细信息:(describe_namespace

hbase:002:0> describe_namespace 'bigdata'
DESCRIPTION                                                                               
{NAME => 'bigdata'}                                                                       
Quota is disabled
Took 1.2531 seconds

还有其他的一些命令,读者可以试着使用help命令查看如何使用,自己把玩一下

三、DDL

学到这里的读者想必对DDL和DML都不陌生了,其中DDL就是数据定义语言,DML就是数据查询语言

DDL主要做的就是对表的一些操作,而DML主要做的是对表里面数据的查询等操作

使用help命令可以列出关于DDL所有的命令:

hbase:002:0> help
...
  Group name: ddl
  Commands: alter, alter_async, alter_status, clone_table_schema, 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
...

1、创建表

创建表的命令是create,help一下看这个命令怎么使用:

hbase:007:0> help 'create'
# 创建一个表,传递一个表名和一组列族(至少一个),以及可选的一些表格的配置
Creates a table. Pass a table name, and a set of column family
specifications (at least one), and, optionally, table configuration.
Column specification can be a simple string (name), or a dictionary
(dictionaries are described below in main help output), necessarily
including NAME attribute.
Examples:

# 在命名空间ns1中创建一个表t1,
Create a table with namespace=ns1 and table qualifier=t1
  # 在不是default命名空间中创建表需要加上命名空间的名字,{NAME=>'列族名字',配置信息}
  hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
  # 这个VERSIONS配置代表的是版本,每条信息最多维护几个保存

# 在default命名空间中创建表t1,可以不带namespace名
Create a table with namespace=default and table qualifier=t1
  hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
  hbase> # The above in shorthand would be the following: 可以简写为以下形式
  hbase> create 't1', 'f1', 'f2', 'f3'
  hbase> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
  hbase> create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}
  hbase> create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly'}

# 表的配置信息可以放在最后面
Table configuration options can be put at the end.
Examples:

  hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']
  hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
  hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe'
  hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' }
  hbase> # Optionally pre-split the table into NUMREGIONS, using
  hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname)
  hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
  hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', REGION_REPLICATION => 2, CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}}
  hbase> create 't1', 'f1', {SPLIT_ENABLED => false, MERGE_ENABLED => false}
  hbase> create 't1', {NAME => 'f1', DFS_REPLICATION => 1}

You can also keep around a reference to the created table:

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

Which gives you a reference to the table named 't1', on which you can then
call methods

哇!这么多内容,看来这个命令比较重要!我也在注释中描述了这个命令怎么使用,大家可以看看上面的注释

可以在bigdata命名空间中创建一个表格student,他有info和msg两个列族,其中info列族维护的版本数是5个,不写列族版本默认维护1个版本:

hbase:008:0> create 'bigdata:student',{NAME=>'info',VERSIONS=>5},{NAME=>'msg'}

2、查看表

查看表可以使用list或者descirbe命令

  • list:查看所有表名:

    hbase:010:0> list
    TABLE                                                                                 bigdata:student                                                                       
    1 row(s)
    Took 0.0125 seconds                                                                   
  • descirbe:查看表的详细信息(列出了列族的详细信息)

    hbase:011:0> describe 'bigdata:student'
    Table bigdata:student is ENABLED                                                             
    bigdata:student                                                                              
    COLUMN FAMILIES DESCRIPTION                                                                  
    {NAME => 'info', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '5', KEEP_DELETED_CE
    LLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_V
    ERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}        
    
    {NAME => 'msg', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CEL
    LS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSION => 'NONE', TTL => 'FOREVER', MIN_VE
    RSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}         
    
    2 row(s)
    Quota is disabled
    Took 0.1689 seconds

当然我们也可以在web页面看到这个表:

image-20220626201608375

3、修改表

表创建时写的所有和列族相关的信息,后续都可以通过alter来修改,包括增加和删除列族

  • 增加列族和修改信息都使用覆盖的方法:

    hbase:012:0> alter 'bigdata:student',{NAME=>'f1',VERSIONS=>3}
  • 删除信息使用的特殊的语法:

    hbase:015:0> alter 'bigdata:student','delete'=>'f1'

4、删除表

删除表使用drop命令:

hbase:016:0> drop 'bigdata:student'

ERROR: Table bigdata:student is enabled. Disable it first.

For usage try 'help "drop"'

Took 0.0210 seconds

但是当咱们删除表的时候却发现报错了,这是因为我们要删的这个student表目前是可用状态,所以删除一个表需要事先把该表禁用再删除

所以HBase删除表有两个步骤:

# 先禁用
hbase:017:0> disable 'bigdata:student'
# 再删除
hbase:018:0> drop 'bigdata:student'

四、DML

关于DML的命令行有这些:

hbase:002:0> help
...
  Group name: dml
  Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve
...

在开始之前,先把咱们刚刚删除的表创建出来:

hbase:020:0> create 'bigdata:student',{NAME=>'info',VERSIONS=>5},{NAME=>'msg'}

1、写入数据

在HBase中写入数据,只能添加结构中最底层的cell:

# put 表名,row key,列族:列,值
put 'bigdata:student','1001','info:name','zhangsan'
put 'bigdata:student','1001','info:name','lisi'
put 'bigdata:student','1001','info:age','18'
put 'bigdata:student','1002','info:name','wtt'
put 'bigdata:student','1003','info:name','wzq'

如果重复写入相同的rowKey,相同列的数据,会写入多个版本进行覆盖

2、读取数据

读取数据有两个方法:get和scan

  • get:最大范围是一行数据,也可以进行列的过滤,读取数据的结果为多行cell

    hbase:015:0> get 'bigdata:student','1001'
    COLUMN                   CELL                                                                
     info:age                timestamp=2022-06-26T20:31:34.131, value=18                         
     info:name               timestamp=2022-06-26T20:31:34.052, value=lisi                       
    1 row(s)
    Took 0.1419 seconds                                                                          
    hbase:016:0> get 'bigdata:student','1001',{COLUMN=>'info:name',VERSIONS=>2}
    COLUMN                   CELL                                                                
     info:name               timestamp=2022-06-26T20:31:34.052, value=lisi                       
     info:name               timestamp=2022-06-26T20:31:33.927, value=zhangsan                   
    1 row(s)
    Took 0.0160 seconds
  • scan是扫描数据,能够读取多行数据,推荐使用startRowstopRow来控制读取的数据,默认范围是左闭右开:

    hbase:017:0> scan 'bigdata:student',{STARTROW=>'1001',STOPROW=>'1003'}
    ROW                      COLUMN+CELL                                                         
     1001                    column=info:age, timestamp=2022-06-26T20:31:34.131, value=18        
     1001                    column=info:name, timestamp=2022-06-26T20:31:34.052, value=lisi     
     1002                    column=info:name, timestamp=2022-06-26T20:31:34.214, value=wtt      
    2 row(s)
    Took 0.0499 seconds

3、删除数据

删除数据的方法有两个:deletedeleteall

  • delete:删除一个版本的数据,即为1个cell,不填写版本默认删除最新的一个版本

    hbase:019:0> delete 'bigdata:student','1001','info:name'
  • deleteall:删除所有版本的数据,即为当前行当前列的多个cell

    hbase:020:0> deleteall 'bigdata:student','1001','info:name'

HBase Shell在实际开发中很难用到,所以只做了简单的介绍,有不会命令可以使用help命令查询怎么使用!关于HBase的操作,将在API操作中详解!

参考资料