HBase基本操作

HBASE 二月 13, 2020

HBase基本操作

文章字数 8.5k 阅读约需 8 mins. 阅读次数 1000000

HBase shell的使用

HBase自带的shell是用JRuby(Java写的Ruby解释器)写的命令行的工具,是用ruby语言实现的,其shell脚本也是ruby实现的。
执行以下命令进入HBase的shell:

1
$HBASE_HOME/bin/hbase shell

用create命令建表c

1
create '表名', '列族名'

输出结果

1
0 row(s) in 操作时间
  • HBase的表都是由列族(Column Family)组成的
  • 没有列族的表是没有意义的
  • 列并不是依附于表上,而是依附于列族上

不定义列的原因:
HBase中的列全部都是灵活的,可以随便定义。在插入数据时其实是向HBase中插入一个单元格,这个单元格是由表:列族:行:列来定位的,所以应该说由于这个单元格有一个列属性A,才让这行数据有了一个A列。
表属性定义的位置:列族

用list命令来查看库中有哪些表

1
list

输出结果

1
2
3
4
5
TABLE                                                   
表名
1 row(s)
Took 0.0809 seconds
=> ["表名"]

用describe命令来查看表属性

1
describe 'test'

输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Table 表名 is ENABLED                                           
表名
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', VERSIONS => '1', EVICT_BLOCKS_ON_CLOSE => 'false', NEW_VERSION_BEHAVIOR => 'false', KEEP_DEL
ETED_CELLS => 'FALSE', CACHE_DATA_ON_WRITE => 'false', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', MIN
_VERSIONS => '0', REPLICATION_SCOPE => '0', BLOOMFILTER => 'ROW', CACHE_INDEX_ON_WRITE => 'false', IN_MEMOR
Y => 'false', CACHE_BLOOMS_ON_WRITE => 'false', PREFETCH_BLOCKS_ON_OPEN => 'false', COMPRESSION => 'NONE',
BLOCKCACHE => 'true', BLOCKSIZE => '65536'}

1 row(s)

QUOTAS
0 row(s)
Took 0.2439 seconds

NAME属性是列族的而不是表的,HBase表上只有少数的几个属性,大部分属性都在列族上。
新增列族(shell中并无直接的命令)

1
alter  '表名','列族名'

对列族的所有操作都会同步到所有拥有这个表的RegionServer上,可以看到总共有多少个RegionServer,当前执行了几个。当有很多客户端连着的时候直接新增列族对性能的影响较大。

用put命令来插入数据

1
put '表名','行键名','列族:列名','数据值'

scan命令获取表数据

1
scan '表名',{STARTROW=>'行键',ENDROW=>'行键'}

输出结果

1
2
3
4
ROW             COLUMN+CELL                                  
行键 column=列族名:列名, timestamp=1575285791187, value=值
n row(s)
Took 0.0059 seconds

关于时间戳:每个单元格都可以存储多个版本(version)的值,但是是用timestamp时间戳来当版本号使用。若put语句不指定时间戳则系统自动用当前时间来指定。时间戳可以指定为任意数字,scan时会显示最大(最新)的时间戳版本的值。
修改表的版本数

1
alter 'test',{NAME=>'列族名',VERSION=>版本数}

get命令查询某单元格数据(当表的数据很大时,get查询比scan快很多)

1
get '表名' ,'行键',{COLUMN=>'列族名:列名', VERSIONS=>想看到的版本数}

删除数据

1
delete '表名','行键','列族:列'

删除指定版本的数据

1
delete '表名','行键','列族:列',时间戳

HBase删除记录并不是真的删除了数据,而是放置了一个墓碑标记(tombstone marker),将数据标记为不可见,这是为了提升性能,这样HBase可以定期清理被删的数据,定期指的是自动合并(compaction)时。
使得被打上墓碑标记的数据也能被查询到

1
scan 'test',{RAW=>true,VERSIONS=>5}

deleteall删除整行记录

1
deleteall '表名','行键'

用disable来停用表

使用HBase时是不能随便删除表的,如果很多客户端正在连接,或者有HBase正在做合并或者分裂操作,如果删除了表会造成无法恢复的错误,因此HBase不允许直接删除表,先进行disable停表。

1
disable '表名'

drop删除表

1
drop '表名'
0%