目录
Apache HBase Shell
Apache HBase Shell是(J)Ruby的IRB,其中添加了一些HBase特定命令。 在IRB中可以执行的任何操作,都应该可以在HBase Shell中执行。
要运行HBase Shell,请执行以下操作:
$ ./bin/hbase shell
键入help,然后输入<RETURN>以查看Shell命令和选项的列表。 至少浏览帮助输出末尾的段落,以了解如何将变量和命令参数输入HBase shell; 特别注意表名,行和列等必须加引号。
请参阅shell exercises,例如基本的shell操作。
下面是Rajeshbabu Chintaguntla all shell commands 的格式良好的上市。
1.用Ruby编写脚本
有关编写Apache HBase脚本的示例,请查看HBase bin目录。 查看以* .rb结尾的文件。 要运行这些文件之一,请执行以下操作:
$ ./bin/hbase org.jruby.Main PATH_TO_SCRIPT
2.在非交互模式下运行命令行管理程序
新的非交互模式已添加到HBase Shell(HBASE-11658)。 非交互模式捕获HBase Shell命令的退出状态(成功或失败),并将该状态传递回命令解释器。 如果您使用普通交互模式,则HBase Shell将仅返回其自己的退出状态,为成功,该退出状态几乎始终为0。
要调用非交互模式,请将-n或--non-interactive选项传递给HBase Shell。
3.OS脚本中的HBase Shell
您可以在操作系统脚本解释器(例如Bash shell)中使用HBase shell,而Bash shell是大多数Linux和UNIX发行版的默认命令解释器。 以下准则使用Bash语法,但可以进行调整以与C样式的外壳程序(例如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
例子5.检查脚本命令的结果
由于脚本并非旨在以交互方式运行,因此您需要一种方法来检查命令是失败还是成功。 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
3.1.检查脚本中的成功或失败
退出代码为0表示您编写的命令肯定成功。 但是,获得非零的退出代码并不一定意味着命令失败。 该命令可以成功执行,但是客户端失去连接,或者其他事件掩盖了其成功。 这是因为RPC命令是无状态的。 确保操作状态的唯一方法是检查。 例如,如果您的脚本创建了一个表,但是返回了一个非零的退出值,则应在再次尝试创建表之前检查该表是否已真正创建。
4.从命令文件中读取HBase Shell命令
您可以将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'
例子6.指示HBase Shell执行命令
将路径传递到命令文件作为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
5.将VM选项传递到命令行管理程序
您可以使用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
6.覆盖启动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.example.org"
hbase(main):002:0> @shell.hbase.configuration.get("raining")
=> "false"
7.Shell Tricks
7.1.表变量
HBase 0.95添加了Shell命令,这些命令为表提供了jruby样式的面向对象的引用。 以前,作用于表的所有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方法将表分配给变量:
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>
7.2.irbrc
在您的主目录中为自己创建一个.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文档以了解其他可能的配置。
7.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有点混乱。
7.4.Query Shell Configuration
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"
7.5.使用HBase Shell进行预拆分表
通过HBase Shell create命令创建表时,可以使用各种选项来预分割表。
最简单的方法是在创建表时指定分割点数组。 请注意,将字符串文字指定为拆分点时,它们将基于字符串的基础字节表示形式创建拆分点。 因此,当指定分割点“ 10”时,实际上是在指定字节分割点“ \x31\30”。
分割点将定义n + 1个区域,其中n是分割点的数量。 最低的区域将包含从最低的可能密钥到最高但不包括第一个分割点密钥的所有密钥。 下一个区域将包含从第一个分割点到下一个分割点的键,但不包括下一个分割点的键。 这将对所有拆分点一直持续到最后。 从最后的分割点到最大可能的键将定义最后一个区域。
hbase>create 't1','f',SPLITS => ['10','20','30']
在上面的示例中,表“ t1”将使用列族“ f”创建,并被预分割为四个区域。 请注意,第一个区域将包含从'\ 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命令truncate会有效地删除并使用默认选项重新创建表,该默认选项将丢弃任何预分割。 如果需要截断一个预分割表,则必须显式删除并重新创建该表以重新指定自定义分割选项。
7.6.Debug
7.6.1.Shell debug switch
您可以在外壳中设置调试开关以查看更多输出。 更多有关异常的堆栈跟踪—当您运行命令时:
hbase> debug <RETURN>
7.6.2.DEBUG log level
要在外壳中启用调试级别的日志记录,请使用-d选项启动它。
$ ./bin/hbase shell -d
7.7.Commands
7.7.1.count
Count命令返回表中的行数。 使用正确的CACHE配置后,速度非常快
hbase> count '<tablename>', CACHE => 1000
上面的计数一次获取1000行。 如果行很大,请将CACHE降低。 默认值为一次获取一行。