![f8b37a7f4959d072740f66f8b9afbc7d.png](https://i-blog.csdnimg.cn/blog_migrate/0e993ab5d0eade259e54be056ec24e0f.jpeg)
Apache HBase Shell是JRuby的IRB,并在此基础上加入了HBase特有的命令。
JRuby是用Java实现的Ruby解释器。通过JRuby,你可以在JVM上直接运行Ruby程序,调用Java的类库。
IRB即interactive ruby,交互式Ruby。
运行HBase Shell:$ ./bin/hbase shell
例如,我使用CDH搭建的Hadoop集群,并且安装了HBase;登录后,在集群上直接使用命令:hbase shell
![bf5b1827afb0cc0154ecf41917f74595.png](https://i-blog.csdnimg.cn/blog_migrate/694277139ed7e8abdca6031c0b305ee2.jpeg)
输入命令:help ,然后回车,可以看到对各种命令的简单描述。
![e6754e7e5b31d8d0d92d75e60f131557.png](https://i-blog.csdnimg.cn/blog_migrate/02f9cb51cffe62b07686779f10591b35.jpeg)
输入命令:help "COMMAND" 可看具体信息。
例:help "move"
![f645705c21fb136ec66c74f082772e68.png](https://i-blog.csdnimg.cn/blog_migrate/a6d15f28544714904da4b027667e9529.jpeg)
常用命令举例:
1) 查看表结构
desc '表名'
![43cd9ee6f5fba1e63eb4af68bd8dce27.png](https://i-blog.csdnimg.cn/blog_migrate/2d6e35a8390ef373129e89ccfe48e8dd.jpeg)
2)执行大合并
major_compact '表名'
3)列出Region
list_regions '表名'
![7c13c8da4e5ccb3b28e9d6586b673670.png](https://i-blog.csdnimg.cn/blog_migrate/e25fd6e5c2372d5c4be5e177d6464628.jpeg)
看的不是很清晰,取一条:
SERVER_NAME:
bg87.cnki.com,16020,1539856447742
REGION_NAME:CNKI_Search201702,1412*1487792102000#1170222153901497888|4170222193201735373$,1539880666725.bbe3ff87712f654cb29a05243229effe.
START_KEY:1412*1487792102000#1170222153901497888|4170222193201735373$
END_KEY:
358*1487455399000#1161229194701353797|5170218220001766105$
SIZE:957
REQ:4705
LOCALITY:1.0
还可以有选择性的输出信息,例如只输出服务器名称,起始键
list_regions 'testtable', {}, ['SERVER_NAME', 'start_key','end_key']
![082d4c8acfaecc123a9fd59744727d0f.png](https://i-blog.csdnimg.cn/blog_migrate/f616238d01983f12e97c59ae287b2e95.jpeg)
4)移动Region
move 'ENCODED_REGIONNAME', 'SERVER_NAME'
找到ENCODED_REGIONNAME:
从REGION_NAME中找,上例中倒数第二个句点后的一段就是,即bbe3ff87712f654cb29a05243229effe
例:
move '8a5e97bcb910be18cf6f9e07f59816c6','bg84.cnki.com,16020,1539856459310'
5)修改表结构
例:将表CNKI_Search201701的COMPRESSION都改为snappy
alter 'CNKI_Search201701',{NAME => 'im', COMPRESSION => 'snappy'}, {NAME => 'fw', COMPRESSION => 'snappy'},{NAME => 'wf', COMPRESSION => 'snappy'}
6)列出所有表:
list
7) 查询表行数
count '表名'
1使用Ruby编写脚本
在HBase的bin目录下可以找到以rb为后缀的脚本文件,为了运行这个脚本,可以使用命令
$ ./bin/hbase org.jruby.Main PATH_TO_SCRIPT
PATH_TO_SCRIPT是脚本路径。
让我看看bin目录下的ruby脚本。
![f857e0ae3f8623b95a57e43f74d8aa2e.png](https://i-blog.csdnimg.cn/blog_migrate/665c02d496a4991e06cd70ce0d9d17df.jpeg)
其实切换到bin目录下,使用下面的命令也是可以的。
$ hbase-jruby SCRIPT
例如,$ hbase-jruby get-active-master.rb
让我们看看hbase-jruby这个文件里有啥:
![eebdbde657715ea2ef5eab046274bd7a.png](https://i-blog.csdnimg.cn/blog_migrate/27c52b85a7c1da95f5fe01633434864e.jpeg)
看,它其实封装了org.jruby.Main。
2以非交互模式运行Shell
非交互模式会捕获HBase Shell命令退出的状态(成功或失败),如果使用普通模式,那么HBase Shell总是返回它自己的执行状态,大多数时候返回代表成功的数字0。
使用-n或--non-interactive选项开启非交互模式。
![35f0a6ff2ab3d5725456c056151fc09b.png](https://i-blog.csdnimg.cn/blog_migrate/2e2268481fd6eaffabf0ce8225d49cc3.jpeg)
不过我使用CDH安装的HBase长时间无法返回。
![b73aa01b043febad07843711138a5fdf.png](https://i-blog.csdnimg.cn/blog_migrate/58381de59816bb6bc8392b3760a44323.jpeg)
3操作系统脚本中的HBase Shell
你可以在操作系统脚本中使用HBase Shell,比如Bash shell,这种大多数Linux和Unix默认的交互式命令接口。以下准则使用Bash语法,但可以调整,使其可同C样式的shell一起使用,例如csh或tcsh,而且经过调整后,还可以和Microsoft Windows 脚本解释器一起使用。
注意:以这种方式生成 HBase Shell 命令的速度很慢,所以要注意何时将HBase 操作与操作系统命令行相结合是合适的。
例,将命令传递给HBase Shell
使用echo命令和|(管道)操作,以非交互模式将命令传递给HBase Shell。务必要转义HBase命令中的字符,否则shell将会解释这些字符。
$ echo "describe 'test1'" | ./hbase shell -n
如果想抑制所有输出,使用下面的命令:
$ echo "describe 'test'" | ./hbase shell -n > /dev/null 2>&1
例,检查脚本命令执行结果
由于脚本没有设计成交互式执行,所以需要一种方法来检查命令是否执行成功。成功执行的命令返回0,失败的命令返回非零值。Bash将命令的返回值存储在一个名为 $? 的特殊环境变量中。因为每次shell执行任何命令时都会为该变量重新赋值,所以应该将结果存储在另一个脚本定义的变量中。
不过,我们还应注意,成功执行的脚本返回值一定是0,但返回值非零不一定代表失败。因为RPC(远程过程调用)命令是无状态的,所以有可能是客户端连接断开了,或者受其他是他事件的影响。最好的办法就是,检查执行结果,比如,你创建了一张表,但shell返回了一个非零值,那么你查下这个表是否已经存在了。
下面的这个脚本展示了一种存储返回值的方法并根据返回值做出决定。
![06a06ece1af25f557897f4979ed9f48b.png](https://i-blog.csdnimg.cn/blog_migrate/b4c681923a21e115d84e3054416fa4c6.jpeg)
4从命令文件读取HBase Shell命令
在txt文本中写HBase Shell命令,一行一个命令,例如:
![db9be9deeda025fbbad885dad8f9e871.png](https://i-blog.csdnimg.cn/blog_migrate/80f534f96eb63d9da01176bd01b034b1.jpeg)
例,引导HBase Shell执行命令
将命令文件的路径作为传递给hbase shell的唯一参数,如果脚本中不包含exit命令,则会返回提示符。无法以编程方式检查每个单独的命令是否成功。
![ba216df3f72549e6616923ce3f3a99f3.png](https://i-blog.csdnimg.cn/blog_migrate/2a90c183a9c5dc42a151fdba0513b00b.jpeg)
5传递VM选项给Shell
使用HBASE_SHELL_OPTS环境变量将VM选项传递给HBase Shell 。在你的环境中进行设置HBASE_SHELL_OPTS,例如通过编辑 〜/ .bashrc,或将其设置为启动HBase Shell 的命令的一部分。下面的示例设置了几个与垃圾回收相关的变量,仅用于VM运行HBase Shell的时候。可以将命令写成一行,如果命令很长的话,也可以使用字符将命令分隔为多行。
![b24e0c8aa46360807c64c2714f88ddbc.png](https://i-blog.csdnimg.cn/blog_migrate/31047e49b1480a87ccec0977b49deac3.jpeg)
6重写配置文件启动HBase Shell
像hbase-2.0.5/hbase-2.1.3/hbase-2.2.0/hbase-1.4.10/hbase-1.5.0这几个版本的HBase,通过传递带有-D前缀的键值对,可以传递或重写hbase-*.xml中的配置项,
![48ee145dc325bed7c3afaf7a6ddcf131.png](https://i-blog.csdnimg.cn/blog_migrate/7f86560650b2c1629517e4e9e3b924d6.jpeg)
7 Shell技巧
表变量
HBase 0.95增加了面向对象jruby风格的表引用Shell,以前所有的HBase Shell命令都是面向过程风格的,它总是把表名当做参数传递给命令。HBase 0.95引入了将表看做jruby变量这一特性,表引用可以用于数据读写操作,如put, scan, get,禁用表,删表,描述表等。
HBase 0.95之前,你会这样写命令:
![6b37f94287384045e9cb848183948ca9.png](https://i-blog.csdnimg.cn/blog_migrate/7e607c7fbc1939a4cca9df841e0860ee.jpeg)
从HBase 0.95版本开始,你会这样写命令,就是讲一个表赋给一个变量:
![86a2da8550f65e7755b28abc0947eadb.png](https://i-blog.csdnimg.cn/blog_migrate/afc9b5ecdfa8f6b0273662ab31533337.jpeg)
如果一个表已经创建了,可以使用get_table方法将其赋给一个变量
![b5065510c6c1fbe4961fe630d63d851a.png](https://i-blog.csdnimg.cn/blog_migrate/a2b40571a00482970a7350516e7884a0.jpeg)
list命令也被扩展了,它能将表名集合拼接成字符串返回。可以使用jruby根据表名来操作表。list_snapshots命令与此相似。
![497b1cf8a95194df878c45c18e8c9773.png](https://i-blog.csdnimg.cn/blog_migrate/44bee0838935b2982f99c55b96775e75.jpeg)
irbrc文件
在主目录下创建一个irbrc文件,添加自定义项,比较有用的是,记录历史命令。然后可以跨Shell调用。
![f372e0016fbd102ec56c37b1f811cad2.png](https://i-blog.csdnimg.cn/blog_migrate/3017a226b9c37d85ac80d1c2507a9d14.jpeg)
如果不想将每个表达式的结果打印到stderr,可以这样做,例如list命令返回的表集合。
![6f6dd8c19b10f680c81c4960f30b8461.png](https://i-blog.csdnimg.cn/blog_migrate/e62028e37ab3131979ef57d11437415a.jpeg)
日志数据的时间戳
从HBase日志文件中,将08/08/16 20:56:29,这种格式的日期转换为时间戳
![aa1fb15cf01555b8020497028cfdbc1f.png](https://i-blog.csdnimg.cn/blog_migrate/0da5cf93d10467467ccb5bbdde08db99.jpeg)
再转成日期形式
![ba4eb7c22c9962fb3476effbffe23b41.png](https://i-blog.csdnimg.cn/blog_migrate/d92ca5dda9e7589912e5fa843b5c4c74.jpeg)
Shell查询配置
![365ba43577a7bc6aa9532071d5d0e821.png](https://i-blog.csdnimg.cn/blog_migrate/72be652a154a76919d785d942275ba44.jpeg)
在Shell中设置配置
![e926e33774a01e5c4632a19882348c1b.png](https://i-blog.csdnimg.cn/blog_migrate/6af80d692d2958a30bfa414395e549b8.jpeg)
使用HBase Shell预分裂表
使用HBase Shell的create命令创建表时,可使用各种选项预先拆分表。
最简单的方法是在创建表格时指定一个分割点数组。请注意,当将字符串直接量指定为分割点时,将根据字符串所代表的字节形式创建分割点。所以将“10”指定分割点,实际上指定“x3130”为分割点。
分割点集合将定义n+1个区域,其中n是分割点的数量。最低的区域包含了所有第一个分隔点之前的所有可能最低的键值,但不包含第一个分割点;下一个区域将包含从第一个分割点开始的键值,但不包括下一个分割点键值。以此类推,直到最后一个分割点。最后一个区域将从最后一个分割点开始直到最后的所有可能的最大键值。
![b9ea6400f0d8c5477f84d54d0422a005.png](https://i-blog.csdnimg.cn/blog_migrate/19104ec21af009a4bd215553d01e705c.jpeg)
在上面的例子中,将使用列族 "f" 创建表 "t1",预先拆分为四个区域。注意,第一个区域将包含从“x00”到“x30”(因为“x31”是“1”的 ASCII 码)的所有键值。
可以使用文件传递分割点。下面的例子中,从本地文件系统的文件中读取分割点。文件中,一行指定一个分割点键值。
![ed81fca92f29061decb72632d90acebc.png](https://i-blog.csdnimg.cn/blog_migrate/ee1fd9701cc98f0470a367263583d31e.jpeg)
其他选项是根据所需的区域数量和分割算法自动分割。HBase提供基于均匀拆分或十六进制密钥的分割键值范围算法,也可以提供自己的拆分算法来细分键值范围。
![ab37811da889cf4fe325ea0e1d148c5f.png](https://i-blog.csdnimg.cn/blog_migrate/2cf0105de20b24eec7d0730885530b53.jpeg)
HBase Shell实际是Ruby环境,可以使用Ruby脚本写分割算法。
![69e81215219938c7448249749a77672d.png](https://i-blog.csdnimg.cn/blog_migrate/805863ca1a279396420143628490298f.jpeg)
请注意,HBase Shell中的truncate命令在删除并重建具有默认选项的表时会将任何预分割都丢弃。如果需要truncate预分割的表,删除并重建表的时候,必须显式地指定自定义分割选项。
调试
可以设置调试开关,以便可以输出更多信息。例如想看到更多的异常栈追踪信息,那么使用下面的命令:
hbase> debug
设置日志级别为DEBUG,使用下面的命令:
$ ./bin/hbase shell -d
Count命令
使用count查询表大小时,指定正确的CACHE会查的更快
hbase> count '', CACHE => 1000
上面,一次拉取1000行。行数越多设置CACHE越小,默认一次取一行。
英文官方文档见:http://hbase.apache.org/book.html#shell