Apache HBase Shell是(J)Ruby的IRB,添加了一些HBase特定命令。 你可以在IRB中做任何事情,你应该可以在HBase Shell中做。
要运行HBase shell,请执行以下操作:
$ ./bin/hbase shell
键入help,然后键入以查看shell命令和选项的列表。 至少浏览帮助输出末尾的段落,了解如何将变量和命令参数输入HBase shell; 特别注意必须引用表名,行和列等。
请参阅shell练习,例如基本shell操作。
这是Rajeshbabu Chintaguntla所有shell命令的格式很好的列表。
有关编写Apache HBase脚本的示例,请查看HBase bin目录。 查看以* .rb结尾的文件。 要运行其中一个文件,请执行以下操作:
$ ./bin/hbase org.jruby.Main PATH_TO_SCRIPT
HBase Shell(HBASE-11658)中添加了一个新的非交互模式。 非交互模式捕获HBase Shell命令的退出状态(成功或失败),并将该状态传递回命令解释程序。 如果使用普通的交互模式,HBase Shell将只返回自己的退出状态,为了成功,退出状态几乎总是为0。
要调用非交互模式,请将-n或–non-interactive选项传递给HBase Shell。
您可以在操作系统脚本解释器中使用HBase shell,例如Bash shell,它是大多数Linux和UNIX发行版的默认命令解释器。 以下指南使用Bash语法,但可以调整为使用C样式的shell(如csh或tcsh),并且可能也可以修改为与Microsoft Windows脚本解释器一起使用。 欢迎提交。
以这种方式生成HBase Shell命令很慢,因此在决定何时将HBase操作与操作系统命令行组合时,请记住这一点。
示例4.将命令传递给HBase Shell
您可以使用echo命令和|以非交互方式将命令传递给HBase Shell(请参阅hbase.shell.noninteractive)。 (管道)操作员。 确保转义HBase命令中的字符,否则shell将解释这些字符。 某些调试级输出已从以下示例中截断。
$ echo "describe 'test1'" | ./hbase shell -n
Version 0.98.3-hadoop2, rd5e65a9144e315bb0a964e7730871af32f5018d5, Sat May 31
19:56:09 PDT 2014
describe 'test1'
DESCRIPTION ENABLED
'test1', {NAME => 'cf', DATA_BLOCK_ENCODING => 'NON true
E', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0',
VERSIONS => '1', COMPRESSION => 'NONE', MIN_VERSIO
NS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS =>
'false', BLOCKSIZE => '65536', IN_MEMORY => 'false'
, BLOCKCACHE => 'true'}
1 row(s) in 3.2410 seconds
要禁止所有输出,请将其回显到/ dev / null:
$ echo "describe 'test'" | ./hbase shell -n > /dev/null 2>&1
由于脚本不是以交互方式运行的,因此您需要一种方法来检查命令是否失败或成功。 HBase shell使用标准约定,即为成功命令返回值0,为失败命令返回一些非零值。
Bash将命令的返回值存储在名为$?的特殊环境变量中。 因为每次shell运行任何命令时都会覆盖该变量,所以应该将结果存储在另一个脚本定义的变量中。
这是一个天真的脚本,它显示了一种存储返回值并根据它做出决定的方法。
#!/bin/bash
echo "describe 'test'" | ./hbase shell -n > /dev/null 2>&1
status=$?
echo "The status was " $status
if ($status == 0); then
echo "The command succeeded"
else
echo "The command may have failed."
fi
return $status
获取退出代码为0表示您编写的命令肯定成功。 但是,获取非零退出代码并不一定意味着命令失败。 该命令可能已成功,但客户端失去了连接,或其他一些事件掩盖了它的成功。 这是因为RPC命令是无状态的。 确保操作状态的唯一方法是检查。 例如,如果您的脚本创建了一个表,但返回了非零退出值,那么您应该在再次尝试创建表之前检查该表是否已实际创建。
您可以将HBase Shell命令输入到文本文件中,每行一个命令,并将该文件传递给HBase Shell。
示例命令文件
create 'test', 'cf'
list 'test'
put 'test', 'row1', 'cf:a', 'value1'
put 'test', 'row2', 'cf:b', 'value2'
put 'test', 'row3', 'cf:c', 'value3'
put 'test', 'row4', 'cf:d', 'value4'
scan 'test'
get 'test', 'row1'
disable 'test'
enable 'test'
将路径传递给命令文件,作为hbase shell命令的唯一参数。 执行每个命令并显示其输出。 如果在脚本中未包含exit命令,则返回到HBase shell提示符。 无法以编程方式检查每个命令的成功或失败。 此外,虽然您看到每个命令的输出,但命令本身不会回显到屏幕,因此很难将命令与其输出对齐。
$ ./hbase shell ./sample_commands.txt
0 row(s) in 3.4170 seconds
TABLE
test
1 row(s) in 0.0590 seconds
0 row(s) in 0.1540 seconds
0 row(s) in 0.0080 seconds
0 row(s) in 0.0060 seconds
0 row(s) in 0.0060 seconds
ROW COLUMN+CELL
row1 column=cf:a, timestamp=1407130286968, value=value1
row2 column=cf:b, timestamp=1407130286997, value=value2
row3 column=cf:c, timestamp=1407130287007, value=value3
row4 column=cf:d, timestamp=1407130287015, value=value4
4 row(s) in 0.0420 seconds
COLUMN CELL
cf:a timestamp=1407130286968, value=value1
1 row(s) in 0.0110 seconds
0 row(s) in 1.5630 seconds
0 row(s) in 0.4360 seconds
您可以使用HBASE_SHELL_OPTS环境变量将VM选项传递给HBase Shell。 您可以在您的环境中设置它,例如通过编辑〜/ .bashrc,或将其设置为启动HBase Shell的命令的一部分。 以下示例设置了几个与垃圾收集相关的变量,仅用于运行HBase Shell的VM的生命周期。 为了便于阅读,该命令应该在一行中全部运行,但由\字符打破。
$ HBASE_SHELL_OPTS="-verbose:gc -XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps \
-XX:+PrintGCDetails -Xloggc:$HBASE_HOME/logs/gc-hbase.log" ./bin/hbase shell
从hbase-2.0.5 / hbase-2.1.3 / hbase-2.2.0 / hbase-1.4.10 / hbase-1.5.0开始,您可以通过传递或覆盖hbase - * .xml中指定的hbase配置。 在命令行上以-D为前缀的键/值,如下所示:
$ ./bin/hbase shell
-Dhbase.zookeeper.quorum=ZK0.remote.cluster.example.org,ZK1.remote.cluster.example.org
,ZK2.remote.cluster.example.org -Draining=false
...
hbase(main):001:0> @shell.hbase.configuration.get("hbase.zookeeper.quorum")
=>
"ZK0.remote.cluster.example.org,ZK1.remote.cluster.example.org,ZK2.remote.cluster.exam
ple.org"
hbase(main):002:0> @shell.hbase.configuration.get("raining")
=> "false"
HBase 0.95添加了shell命令,为表提供了jruby风格的面向对象引用。 以前,作用于表的所有shell命令都具有一个过程样式,该样式始终将表的名称作为参数。 HBase 0.95引入了将表分配给jruby变量的功能。 表引用可用于执行数据读写操作(如put,scanner),并可作为管理功能(如禁用,删除,描述表)。
例如,以前您始终指定一个表名:
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方法将表分配给变量:
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>
在您的主目录中为自己创建一个.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文档以了解其他可能的配置。
要将日期’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
To go the other direction:
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。
hbase(main):001:0> @shell.hbase.configuration.get("hbase.rpc.timeout")
=> "60000"
To set a config in the 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"
通过HBase Shell create命令创建表时,可以使用各种选项预分割表。
最简单的方法是在创建表时指定一个拆分点数组。 请注意,将字符串文字指定为拆分点时,这些将根据字符串的基础字节表示创建拆分点。 因此,当指定分割点’10’时,我们实际上指定了字节分割点’\ x31 \ 30’。
分裂点将定义n + 1个区域,其中n是分裂点的数量。 最低区域将包含最低可能键的所有键,但不包括第一个分割点键。 下一个区域将包含第一个分割点的键,但不包括下一个分割点键。 对于所有分割点,这将持续到最后一个。 最后一个区域将从最后一个分割点到最大可能键定义。
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>
hbase(main):072:1>
hbase(main):073:1>
hbase(main):074:1>
hbase(main):075:2>
hbase(main):076:2>
hbase(main):077:1>
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命令truncate有效地删除并使用默认选项重新创建表,这将丢弃任何预拆分。 如果需要截断预拆分表,则必须显式删除并重新创建表以重新指定自定义拆分选项。
Shell调试开关
您可以在shell中设置调试开关以查看更多输出 - 例如 更多的异常堆栈跟踪 - 运行命令时:
hbase> debug <RETURN>
DEBUG日志级别
要在shell中启用DEBUG级别日志记录,请使用-d选项启动它。
$ ./bin/hbase shell -d
计数
Count命令返回表中的行数。 配置正确的CACHE时速度非常快
hbase> count '<tablename>', CACHE => 1000
以上计数一次提取1000行。 如果您的行很大,请将CACHE设置得更低。 默认是一次获取一行。