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