0%

HBase 常用操作

复制表

1
2
3
4
5
6
7
disable 't_table'
# 创建快照
snapshot 't_table', 't_table_snapshot'
# 从快照中恢复到新的表
clone_snapshot 't_table_snapshot', 't_table_new'
delete_snapshot 't_table_snapshot'
enable 't_table'

注意:这种方式存在 bug,见 HBASE-25206

使用快照实现复制表,是通过 HFileLink 实现的,如果原表有更新操作,会创建新的 HFile,可以认为是一种 copy on write,如果原表更新很频繁,会复制很多 HFile,相当于把复制表的开销平摊到写入时,如果要复制表实现备份并且原表后续有写入操作建议使用其他方法实现,快照方式更适用于表的重命名。

这里使用自带的复制工具。
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=Y X;
Y 为新表名,X 为要复制的表。该工具还有其他参数,比如可以指定 rowkey 范围复制,还可以指定复制多少个版本的数据,还有其他选项。

修改表 schema

1
2
3
alter 't_table', {NAME=>'cf', COMPRESSION=>'none'}
flush 't_table'
major_compact 't_table'

查询

1
2
3
4
5
6
# 查询单行数据的多个版本
get 't_table', '0001', {COLUMN=>'cf:name', VERSIONS=>10}
# RAW=>true 可以查看 tombstones
scan 't_table', {RAW=>true, VERSIONS=>5}
# STOPROW,
scan 't_table', {RAW=>true, VERSIONS=>100, STARTROW=>'2663_1392913', LIMIT=>1}

建表

1
create  't_table', {NAME=>"cf1", VERSIONS=>10}, {NAME=>"cf2", VERSIONS=>10, TTL=>86400}

TTL

列族上可以设置一个以秒为单位的过期时间,当达到过期时候后,HBase 自动删除相关行的相关列,针对所有的版本,过期时间相对于列的最新版本而言。

TTL on column family

按最后一次更新时间算,删除当前行的整个列族

TTL on cell (毫秒)

Cell TTLs are submitted as an attribute on mutation requests (Appends, Increments, Puts, etc.) using Mutation#setTTL.
可以删除 cell,这个时间不能超过列族上配置的时间,必须写入时设置(JAVA API…)

删除

Delete marker (tombstone)

三种删除标记

  1. Delete 删除特定列列指定的版本
  2. DeleteColumn 删除特定列的所有版本
  3. DeleteFamily 删除特定列族所有列

注意:DeleteColumn,DeleteFamily 都能删除特定时间版本之前的数据,而 Delete mark,只能删除当前版本即一个cell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
put 't_table', '0001', 'cf1:name', 'name1', 1
put 't_table', '0001', 'cf1:name', 'name2', 2
put 't_table', '0001', 'cf1:name', 'name3', 3
put 't_table', '0001', 'cf1:name', 'name4', 4
put 't_table', '0001', 'cf1:name', 'name5', 5
put 't_table', '0001', 'cf1:name', 'name7', 7
put 't_table', '0001', 'cf1:age', '1', 1
put 't_table', '0001', 'cf1:age', '2', 2
put 't_table', '0001', 'cf1:age', '3', 3
put 't_table', '0001', 'cf1:age', '4', 4
put 't_table', '0001', 'cf1:age', '5', 5
put 't_table', '0001', 'cf2:name', 'name1', 1
put 't_table', '0001', 'cf2:name', 'name2', 2
put 't_table', '0001', 'cf2:name', 'name3', 3
put 't_table', '0001', 'cf2:name', 'name4', 4
put 't_table', '0001', 'cf2:name', 'name5', 5
put 't_table', '0001', 'cf2:age', '1', 1
put 't_table', '0001', 'cf2:age', '2', 2
put 't_table', '0001', 'cf2:age', '3', 3
put 't_table', '0001', 'cf2:age', '4', 4
put 't_table', '0001', 'cf2:age', '5', 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import happybase

conn = happybase.Connection(host='172.19.14.142', port=9090)

# DeleteFamily mark,时间戳为当前时间,相当于删除当前行
conn.table('t_table').delete('0001')

# DeleteFamily mark,删除 cf1 列族的 [1, 3]
conn.table('t_table').delete('0001', columns=['cf1'], timestamp=3)

# DeleteColumn mark,删除 cf1:name [1, 5]
conn.table('t_table').delete('0001', columns=['cf1:name'], timestamp=5)
# DeleteColumn mark,删除当前行所有列族时间小于等于5的版本
conn.table('t_table').delete('0001', timestamp=5)

# DeleteColumn mark,删除 cf1:name [1, current_ts]
conn.table('t_table').delete('0001', columns=['cf1:name'])

# happybase 没法模拟 Delete 标记,并且 hbase shell 的行为不好理解