Apache HBase【从无到有从有到无】【AH6】Apache HBase Shell

目录

Apache HBase Shell

1.用Ruby编写脚本

2.在非交互模式下运行命令行管理程序

3.OS脚本中的HBase Shell

3.1.检查脚本中的成功或失败

4.从命令文件中读取HBase Shell命令

5.将VM选项传递到命令行管理程序

6.覆盖启动HBase Shell的配置

7.Shell Tricks

7.1.表变量

7.2.irbrc

7.3.将数据记录到时间戳

7.4.Query Shell Configuration

7.5.使用HBase Shell进行预拆分表

7.6.Debug

7.6.1.Shell debug switch

7.6.2.DEBUG log level

7.7.Commands

7.7.1.count


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降低。 默认值为一次获取一行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过融合先进技术,如物联网、大数据、人工智能等,实现校园的智能化管理与服务。政策的推动和技术的成熟为智慧校园的发展提供了基础。该方案强调了数据的重要性,提出通过数据的整合、开放和共享,构建产学研资用联动的服务体系,以促进校园的精细化治理。 智慧校园的核心建设任务包括数据标准体系和应用标准体系的建设,以及信息化安全与等级保护的实施。方案提出了一站式服务大厅和移动校园的概念,通过整合校内外资源,实现资源共享平台和产教融合就业平台的建设。此外,校园大脑的构建是实现智慧校园的关键,它涉及到数据中心化、数据资产化和数据业务化,以数据驱动业务自动化和智能化。 技术应用方面,方案提出了物联网平台、5G网络、人工智能平台等新技术的融合应用,以打造多场景融合的智慧校园大脑。这包括智慧教室、智慧实验室、智慧图书馆、智慧党建等多领域的智能化应用,旨在提升教学、科研、管理和服务的效率和质量。 在实施层面,智慧校园建设需要统筹规划和分步实施,确保项目的可行性和有效性。方案提出了主题梳理、场景梳理和数据梳理的方法,以及现有技术支持和项目分级的考虑,以指导智慧校园的建设。 最后,智慧校园建设的成功依赖于开放、协同和融合的组织建设。通过战略咨询、分步实施、生态建设和短板补充,可以构建符合学校特色的生态链,实现智慧校园的长远发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值