我可以使用以下命令告诉 hbase 禁用和删除特定表:
disable 'tablename'
drop 'tablename'
但我想删除数据库中的所有表,而不对任何表的名称进行硬编码。有没有办法做到这一点?我想通过命令行实用程序来执行此操作./hbase shell
,而不是通过 Java 或 Thrift。
我可以使用以下命令告诉 hbase 禁用和删除特定表:
disable 'tablename'
drop 'tablename'
但我想删除数据库中的所有表,而不对任何表的名称进行硬编码。有没有办法做到这一点?我想通过命令行实用程序来执行此操作./hbase shell
,而不是通过 Java 或 Thrift。
disable_all和drop_all已作为命令添加到 HBase ruby shell 中。这些命令是在 jira HBASE-3506中添加的。 这些命令采用表的正则表达式来禁用/删除。他们会在继续之前要求确认。这应该使删除大量表变得非常容易,并且不需要外部库或脚本。
我有一个方便的脚本可以做到这一点,使用 Python Happybase库:
import happybase
c = happybase.Connection()
for table in c.tables():
c.disable_table(table)
c.delete_table(table)
print "Deleted: " + table
您需要安装 Happybase 才能使用此脚本,您可以将其安装为:
sudo easy_install happybase
您可以通过管道将命令传递给bin/hbase shell
命令。从那里您可以使用一些脚本来获取表名并将禁用/删除命令传回 hbase。
IE
echo "list" | bin/hbase shell | ./filter_table_names.pl > table_names.txt
./turn_table_names_into_disable_delete_commands.pl table_names.txt | bin/hbase shell
有一个黑客。打开 $HBASE_HOME/lib/ruby/shell/commands/list.rb 文件并在命令方法的底部添加以下行。
return list
之后,list 命令返回所有表的名称数组。然后就这样做。
list.each {|t| disable t;drop t}
我不是通过 hbase shell 删除表,而是通过命令行删除它们,
-删除我的 hadoop 分布式文件系统目录,然后,
-创建一个新的干净的 hadoop 分布式文件系统目录,然后,
-用'格式化我的 hadoop 分布式文件系统hadoop namenode -format',然后,
-start-all.sh 和 start-hbase.sh
参考:
http ://hadoop.apache.org/common/docs/r0.20.1/api/overview-summary.html#overview_description
如果您正在寻找可以通过 shell 脚本在“单行”中执行此操作的东西,您可以使用以下方法:
$ echo 'list.each {|t| disable t; drop t}; quit;' | hbase shell
注意:以上是从 Bash shell 提示符运行的。它将命令回显到命令hbase shell
返回的所有表中并循环list
执行,然后在遍历list
返回的数组时禁用并删除每个表。一旦完成,它就会退出。