我们在上一章已经学习了hbase的相关介绍。
本章记录hbase常用的命令。
参考文献
http://hbase.apache.org/book.html\#shell
hbase shell
hbase提供了一个shell的终端给用户交互。使用命令hbase shell进入命令界面。
通过执行help可以看到所有命令的列表。
COMMAND GROUPS:
Group name: general
Commands: status, table_help, version, whoami
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, 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
Group name: tools
Commands: assign, balance_switch, balancer, balancer_enabled, catalogjanitor_enabled, catalogjanitor_run, catalogjanitor_switch, close_region, compact, compact_mob, compact_rs, flush, major_compact, major_compact_mob, merge_region, move, normalize, normalizer_enabled, normalizer_switch, split, trace, unassign, wal_roll, zk_dump
Group name: replication
Commands: add_peer, append_peer_tableCFs, disable_peer, disable_table_replication, enable_peer, enable_table_replication, get_peer_config, list_peer_configs, list_peers, list_replicated_tables, remove_peer, remove_peer_tableCFs, set_peer_tableCFs, show_peer_tableCFs, update_peer_config
Group name: snapshots
Commands: clone_snapshot, delete_all_snapshot, delete_snapshot, list_snapshots, restore_snapshot, snapshot
Group name: configuration
Commands: update_all_config, update_config
Group name: quotas
Commands: list_quotas, set_quota
Group name: security
Commands: grant, list_security_capabilities, revoke, user_permission
Group name: procedures
Commands: abort_procedure, list_procedures
Group name: visibility labels
Commands: add_labels, clear_auths, get_auths, list_labels, set_auths, set_visibility
Group name: rsgroup
Commands: add_rsgroup, balance_rsgroup, get_rsgroup, get_server_rsgroup, get_table_rsgroup, list_rsgroups, move_servers_rsgroup, move_tables_rsgroup, remove_rsgroup
HBase shell中的帮助命令非常强大,使用help ‘command_name’获得某一个命令的详细信息。 例如:
1
2 1help 'list'
2
我们按照所有命令的顺序来分别学习相关命令:
一般(general)命令
查看当前用户
1
2 1whoami
2
查询服务器状态
1
2 1status
2
查询Hbase版本
1
2 1version
2
查看所有表
1
2 1list
2
数据定义(ddl-Data Definition Language)命令
创建一个表,建立一个表student,有三个列族id,address和info
1
2 1create 'student','id','address','info'
2
获得表的描述
1
2 1describe 'student'
2
删除列族
我们之前建了3个列族,但是发现id这个列族是多余的,因为已经有主键,所以我们要将其删除。
1
2 1alter 'student',{NAME=>'id',METHOD=>'delete'}
2
如果遇到错误ERROR: Table student is enabled. Disable it first before altering。
则需要先把表禁用
表禁用
1
2 1disable 'student'
2
表启用
1
2 1enable 'student'
2
删除表
1
2 1drop 'student'
2
查询表是否存在
1
2 1exists 'student'
2
判断表是否enable
1
2 1is_enabled 'student'
2
判断表是否disable
1
2 1is_disabled 'student'
2
命名空间(namespace)命令
HBase系统默认定义了两个缺省的namespace
hbase:系统内建表,包括namespace和meta表
default:用户建表时未指定namespace的表都创建在此
创建namespace
1
2 1create_namespace 'zzq_ns'
2
查看namespace
1
2 1describe_namespace 'zzq_ns'
2
删除namespace
1
2 1drop_namespace 'zzq_ns'
2
列出所有namespace
1
2 1list_namespace
2
列出所有namespace
1
2 1list_namespace
2
在namespace下创建表
1
2 1create 'zzq_ns:student','id','address','info'
2
查看namespace下的表
1
2 1list_namespace_tables 'zzq_ns'
2
数据操作(dml-Data Manipulation Language)命令
插入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 1put 'student','zzq','info:age','24'
2
3put 'student','zzq','info:birthday','1990-05-03'
4
5put 'student','zzq','info:company','23mofang'
6
7put 'student','zzq','address:contry','china'
8
9put 'student','zzq','address:province','guangxi'
10
11put 'student','zzq','address:city','nanning'
12
13put 'student','yue','info:age','18'
14
15put 'student','yue','info:birthday','1998-12-03'
16
17put 'student','yue','info:company','23mofang'
18
19put 'student','yue','address:contry','china'
20
21put 'student','yue','address:province','sichuan'
22
23put 'student','yue','address:city','chengdu'
24
我们分别插入了两个人的信息,可以看到hbase的结构组织是可以离散的自由的插入数据的。
获取一条数据,获取一个id的所有数据
1
2 1get 'student','zzq'
2
获取一个id,一个列族的所有数据
1
2 1get 'student','zzq','info'
2
获取一个id,一个列族中一个列的所有数据
1
2 1get 'student','zzq','info:age'
2
更新一条记录
将zzq的年龄改成28
1
2 1put 'student','zzq','info:age','28'
2
通过timestamp来获取两个版本的数据
1
2
3 1get 'student','zzq',{COLUMN=>'info:age',TIMESTAMP=>1520910557537}
2get 'student','zzq',{COLUMN=>'info:age',TIMESTAMP=>1520910822239}
3
我们可以看到hbase默认是保留多个版本的数据的,通过timestamp来区分,默认返回最新版本的数据,如果有需要可以通过timestamp来获取旧版本的数据。
全表扫描
1
2 1scan 'student'
2
删除id为zzq的值的‘info:age’字段
1
2 1delete 'student','zzq','info:age'
2
删除整行(整个id)
1
2 1deleteall 'student','zzq'
2
查询表中有多少行:
1
2 1count 'student'
2
查询所有rowkey
1
2 1count 'student', { INTERVAL => 1 }
2
给‘zzq’这个id增加’info:age’字段,并使用counter实现递增
1
2 1incr 'student','zzq','info:age'
2
如果遇到ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it’s 2 bytes wide错误需要先使用
1
2 1delete 'student','zzq','info:age'
2
删除原定义的值。
获取当前count的值
1
2 1get_counter 'student','zzq','info:age'
2
将整张表清空
1
2 1truncate 'student'
2
工具(tools)命令
查看Hbase表分区情况
1
2 1scan 'hbase:meta'
2
1
2
3
4
5 1student,,1520909631300.bd26e274811777d0f1a70b57ad5416b4. column=info:regioninfo, timestamp=1520909632197, value={ENCODED => bd26e274811777d0f1a70b57ad5416b4, NAME => 'student,,1520909631300.bd26e274811777d0f1a70b57ad5416b4.', STARTKEY => '', ENDKEY => ''}
2 student,,1520909631300.bd26e274811777d0f1a70b57ad5416b4. column=info:seqnumDuringOpen, timestamp=1520909932997, value=\x00\x00\x00\x00\x00\x00\x00\x05
3 student,,1520909631300.bd26e274811777d0f1a70b57ad5416b4. column=info:server, timestamp=1520909932997, value=host3:60020
4 student,,1520909631300.bd26e274811777d0f1a70b57ad5416b4. column=info:serverstartcode, timestamp=1520909932997, value=1520437250705
5
完整的region name
student,,1520909631300.bd26e274811777d0f1a70b57ad5416b4.
表空间:表名, 开始rowId, 时间戳, hashcode(MD5)
移动region
将region移动到一个指定的region server, 或者移动到一个随机的region server(不指定region server)。此命令可以用于解决某些region server 过于拥堵的问题。
1
2
3 1move 'ENCODE_REGIONNAME'
2move 'ENCODE_REGIONNAME', 'SERVER_NAME,PORT,START_CODE'
3
其中
其中’ENCODED_REGIONNAME’表示region Id中的hashcode,比如上面的bd26e274811777d0f1a70b57ad5416b4
其中target server的start code, 可通过 scan ‘hbase:meta’查找,如上
column=info:server, timestamp=1520909932997, value=host3:60020
column=info:serverstartcode, timestamp=1520909932997, value=1520437250705
则
‘SERVER_NAME,PORT,START_CODE’参数为’host3,60020,1520437250705’
region切片
1
2
3
4
5
6
7
8
9
10 1split 'tableName'
2
3split 'namespace:tableName'
4
5split 'regionName' # format: 'tableName,startKey,id'
6
7split 'tableName', 'splitKey'
8
9split 'regionName', 'splitKey'
10
其中’splitKey’表示从哪一行开始切分
reqion切片合并
1
2
3
4 1merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME'
2
3merge_region 'ENCODED_REGIONNAME', 'ENCODED_REGIONNAME', true //强制合并
4
其中’ENCODED_REGIONNAME’表示region Id中的hashcode,比如上面的bd26e274811777d0f1a70b57ad5416b4
flush
将memstore中的数据强制写入磁盘
1
2
3
4 1flush 'TABLENAME'
2flush 'REGIONNAME'
3flush 'ENCODE_REGIONNAME'
4
close_region
关闭region空间
1
2
3
4
5 1close_region 'REGIONNAME'
2close_region 'REGIONNAME', 'SERVER_NAME'
3close_region 'ENCODED_REGIONNAME'
4close_region 'ENCODED_REGIONNAME', 'SERVER_NAME'
5
assign
分配一个region
1
2
3 1assign 'REGIONNAME'
2assign 'ENCODE_REGIONNAME'
3
unassign
关闭一个region,Unassign会在当前位置关闭region然后重启一次
1
2
3 1assign 'REGIONNAME'
2assign 'ENCODE_REGIONNAME'
3
balancer_switch
blance的开关
balancer_switch控制是否启用region的负载均衡算法。如果负载均衡算法已开启,balance能主动运行负载均衡算法将region服务器上的region进行均匀再分配。
1
2
3 1balance_switch true
2balance_switch false
3
手动balancer
1
2 1balancer
2
手动触发major compaction
1
2
3
4
5
6
7
8
9 1#Compact all regions in a table:
2major_compact 't1'
3#Compact an entire region:
4major_compact 'r1'
5#Compact a single column family within a region:
6major_compact 'r1', 'c1'
7#Compact a single column family within a table:
8major_compact 't1', 'c1'
9
安全(security)命令
分配权限
1
2 1grant 'zzq','RW','student'
2
给用户‘zzq’分配对表student有读写的权限
权限用五个字母表示: “RWXCA”
分别代表
READ(‘R’), WRITE(‘W’), EXEC(‘X’), CREATE(‘C’), ADMIN(‘A’)
查看权限
1
2 1user_permission 'student'
2
查看表student的权限列表
收回权限
1
2 1revoke 'zzq','student'
2
收回zzq用户在表student上的权限
待补充
复制集(replication)命令
快照(snapshots)命令
配置(configuration)命令
配额(quotas)命令
程序(procedures)命令
可见标签(visibility labels)命令
rs分组(rsgroup)命令
总结
我们发现hbase的使用上与一般的数据库还是有点类似的,难点在于集群间的资源调整。