当前位置: 首页 > 工具软件 > shell-tricks > 使用案例 >

第四章:Hbase Shell--Apache HBase TM Reference Guide

方琦
2023-12-01

Apache HBase Shell是(J)Ruby的IRB,添加了一些HBase特定命令。 你可以在IRB中做任何事情,你应该可以在HBase Shell中做。

要运行HBase shell,请执行以下操作:


$ ./bin/hbase shell

键入help,然后键入以查看shell命令和选项的列表。 至少浏览帮助输出末尾的段落,了解如何将变量和命令参数输入HBase shell; 特别注意必须引用表名,行和列等。

请参阅shell练习,例如基本shell操作。

这是Rajeshbabu Chintaguntla所有shell命令的格式很好的列表。

用Ruby编写脚本

有关编写Apache HBase脚本的示例,请查看HBase bin目录。 查看以* .rb结尾的文件。 要运行其中一个文件,请执行以下操作:

 $ ./bin/hbase org.jruby.Main PATH_TO_SCRIPT
 

在非运行Shell互动模式

HBase Shell(HBASE-11658)中添加了一个新的非交互模式。 非交互模式捕获HBase Shell命令的退出状态(成功或失败),并将该状态传递回命令解释程序。 如果使用普通的交互模式,HBase Shell将只返回自己的退出状态,为了成功,退出状态几乎总是为0。

要调用非交互模式,请将-n或–non-interactive选项传递给HBase Shell。

OS脚本中的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命令输入到文本文件中,每行一个命令,并将该文件传递给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

将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
 

覆盖配置启动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"
 

Shell Tricks

表变量

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

在您的主目录中为自己创建一个.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。

查询Shell配置

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预分割表

通过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设置得更低。 默认是一次获取一行。

 类似资料: