【HBase】03-Shell技巧

本文深入解析HBase 0.95版本引入的重要更新,涵盖表变量功能,允许用户通过JRuby风格的面向对象引用操作表;预分表策略,提升表的初始分布效率;日志数据到时间戳的转换方法;查询Shell配置调整;以及调试功能的增强。文章还提供了实用的Ruby脚本示例和详细的Shell命令说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、表变量

HBase 0.95添加了为表提供JRuby风格的面向对象引用的shell命令。以前所有作用于表的shell命令都具有始终以表的名称作为参数的调用形式。HBase 0.95介绍了将表分配给JRuby变量的能力。表引用可用于执行数据读写操作,如放置、扫描和获取,以及管理功能,如禁用、删除和描述表。

例如,以前您总是指定一个表名:

hbase(main):000:0> create 't', 'f'
0 row(s) in 1.0970 seconds
hbase(main):001:0> put 't', 'rold', 'f', 'v'
0 row(s) in 0.0080 seconds

hbase(main):002:0> scan 't'
ROW                                COLUMN+CELL
 rold                              column=f:, timestamp=1378473207660, value=v
1 row(s) in 0.0130 seconds

hbase(main):003:0> describe 't'
DESCRIPTION                                                                           ENABLED
 't', {NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_ true
 SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2
 147483647', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false
 ', BLOCKCACHE => 'true'}
1 row(s) in 1.4430 seconds

hbase(main):004:0> disable 't'
0 row(s) in 14.8700 seconds

hbase(main):005:0> drop 't'
0 row(s) in 23.1670 seconds

hbase(main):006:0>

现在您可以将表分配给变量,并将结果使用JRuby Shell代码。

hbase(main):007 > t = create 't', 'f'
0 row(s) in 1.0970 seconds

=> Hbase::Table - t
hbase(main):008 > t.put 'r', 'f', 'v'
0 row(s) in 0.0640 seconds
hbase(main):009 > t.scan
ROW                           COLUMN+CELL
 r                            column=f:, timestamp=1331865816290, value=v
1 row(s) in 0.0110 seconds
hbase(main):010:0> t.describe
DESCRIPTION                                                                           ENABLED
 't', {NAME => 'f', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_ true
 SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2
 147483647', KEEP_DELETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false
 ', BLOCKCACHE => 'true'}
1 row(s) in 0.0210 seconds
hbase(main):038:0> t.disable
0 row(s) in 6.2350 seconds
hbase(main):039:0> t.drop
0 row(s) in 0.2340 seconds

如果表已经创建,则可以使用get_table方法将Table分配给变量:

hbase(main):011 > create 't','f'
0 row(s) in 1.2500 seconds

=> Hbase::Table - t
hbase(main):012:0> tab = get_table 't'
0 row(s) in 0.0010 seconds

=> Hbase::Table - t
hbase(main):013:0> tab.put 'r1' ,'f', 'v'
0 row(s) in 0.0100 seconds
hbase(main):014:0> tab.scan
ROW                                COLUMN+CELL
 r1                                column=f:, timestamp=1378473876949, value=v
1 row(s) in 0.0240 seconds
hbase(main):015:0>

列表功能也被扩展,从而返回表名列表作为字符串。然后,可以使用JRuby基于这些名称编写表操作。list_snapshots 命令也起到类似的作用。

hbase(main):016 > tables = list('t.*')
TABLE
t
1 row(s) in 0.1040 seconds

=> #<#<Class:0x7677ce29>:0x21d377a4>
hbase(main):017:0> tables.map { |t| disable t ; drop  t}
0 row(s) in 2.2510 seconds

=> [nil]
hbase(main):018:0>

2、irbrc

在自己的HOME目录中为自己创建一个.irbrc文件。添加自定义命令。一个有用的是命令历史,因此命令在shell调用中被保存:

$ more .irbrc
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"

如果希望避免将计算每个表达式的结果打印到stderr,例如,从“list”命令返回的表数组:

$ echo "IRB.conf[:ECHO] = false" >>~/.irbrc

请参阅irbrc的Ruby文档以了解其他可能的配置。

3、日志数据到时间戳

若要将日期'08/08/16 20:56:29'从HBASE日志转换为时间戳,请执行:

hbase(main):021:0> import java.text.SimpleDateFormat
hbase(main):022:0> import java.text.ParsePosition
hbase(main):023:0> SimpleDateFormat.new("yy/MM/dd HH:mm:ss").parse("08/08/16 20:56:29", ParsePosition.new(0)).getTime() => 1218920189000

或者别的方式:

hbase(main):021:0> import java.util.Date
hbase(main):022:0> Date.new(1218920189000).toString() => "Sat Aug 16 20:56:29 UTC 2008"

要输出与HBase日志格式完全相同的格式,需要对SimpleDateFormat进行一些处理。

4、查询Shell配置

hbase(main):001:0> @shell.hbase.configuration.get("hbase.rpc.timeout")
=> "60000"

在shell中设置配置:

hbase(main):005:0> @shell.hbase.configuration.setInt("hbase.rpc.timeout", 61010)
hbase(main):006:0> @shell.hbase.configuration.get("hbase.rpc.timeout")
=> "61010"

5、预分表

当通过HBase Shell create命令创建表时,可以使用各种选项来预分割表。
最简单的方法是在创建表时指定一个分割点数组。注意,当将字符串文本指定为分割点时,它们将基于字符串的底层字节表示创建分割点。因此,当指定“10”的分割点时,实际上是在指定字节分割点'\x31\x30'。
分裂点将定义n+ 1个区域,其中n是分裂点的数目。最低区域将包含从最低可能键到但不包括第一分割点键的所有键。下一个区域将包含从第一个分割点到下一个分割点的密钥,但不包括下一个分割点密钥。这将一直持续到最后一个阶段。最后一个区域将从最后一个分割点定义为最大可能的key。

hbase>create 't1','f',SPLITS => ['10','20','30']

在上面的示例中,创建带有列族“f”的表“t1”,并预分割成四个区域。注意,第一个区域将包含从“x00”到“x30”的所有键(因为“x31”是“1”的ASCII代码)。
可以使用以下变体在文件中传递分割点。在本例中,从与本地文件系统上的本地路径对应的文件中读取分割。文件中的每一行指定一个分割点密钥。

hbase>create 't14','f',SPLITS_FILE=>'splits.txt'

其他选项是基于所需数量的区域和分割算法自动计算分割。HBase提供了基于均匀分割或基于十六进制密钥来分割密钥范围的算法,但是您可以提供自己的分割算法来细分密钥范围。

# create table with four regions based on random bytes keys
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }

# create table with five regions based on hex keys
hbase>create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }

由于HBase Shell实际上是一个Ruby环境,所以您可以使用简单的Ruby脚本以算法方式计算拆分。

# generate splits for long (Ruby fixnum) key range from start to end key
hbase(main):070:0> def gen_splits(start_key,end_key,num_regions)
hbase(main):071:1>   results=[]
hbase(main):072:1>   range=end_key-start_key
hbase(main):073:1>   incr=(range/num_regions).floor
hbase(main):074:1>   for i in 1 .. num_regions-1
hbase(main):075:2>     results.push([i*incr+start_key].pack("N"))
hbase(main):076:2>   end
hbase(main):077:1>   return results
hbase(main):078:1> end
hbase(main):079:0>
hbase(main):080:0> splits=gen_splits(1,2000000,10)
=> ["\000\003\r@", "\000\006\032\177", "\000\t'\276", "\000\f4\375", "\000\017B<", "\000\022O{", "\000\025\\\272", "\000\030i\371", "\000\ew8"]
hbase(main):081:0> create 'test_splits','f',SPLITS=>splits
0 row(s) in 0.2670 seconds

=> Hbase::Table - test_splits

注意,HBase Shell命令截断有效地删除并重新创建带有默认选项的表,这些选项将丢弃任何预分割。如果需要截断预拆分表,则必须删除并重新显式创建表以重新指定自定义拆分选项。

6、Debug

6.1、Shell debug开关

您可以在shell中设置调试开关,以便在运行命令时看到更多输出-例如,在异常-上看到更多堆栈跟踪:

hbase> debug <RETURN>

6.2、Debug日志级别

若要在shell中启用调试级别日志,请用-d选项启动。

$ ./bin/hbase shell -d

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值