【发布时间】:2011-04-28 19:17:43
【问题描述】:
我可以使用以下命令告诉 hbase 禁用和删除特定表:
disable 'tablename'
drop 'tablename'
但我想删除数据库中的所有表,而不对任何表的名称进行硬编码。有没有办法做到这一点?我想通过命令行实用程序 ./hbase shell 来执行此操作,而不是通过 Java 或 Thrift。
【问题讨论】:
标签: command-line hbase
我可以使用以下命令告诉 hbase 禁用和删除特定表:
disable 'tablename'
drop 'tablename'
但我想删除数据库中的所有表,而不对任何表的名称进行硬编码。有没有办法做到这一点?我想通过命令行实用程序 ./hbase shell 来执行此操作,而不是通过 Java 或 Thrift。
【问题讨论】:
标签: command-line hbase
您可以通过管道将命令传递给bin/hbase shell 命令。从那里您可以使用一些脚本来获取表名并将禁用/删除命令通过管道传回 hbase。
即
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 shell 删除表,而是通过命令行删除它们,
- 删除我的 hadoop 分布式文件系统目录,然后,
- 创建一个新的干净的 hadoop 分布式文件系统目录,然后,
- 使用“hadoop namenode -format”格式化我的 hadoop 分布式文件系统,然后,
- start-all.sh 和 start-hbase.sh
参考:
http://hadoop.apache.org/common/docs/r0.20.1/api/overview-summary.html#overview_description
【讨论】:
我有一个使用 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
【讨论】:
disable_all 和 drop_all 已作为命令添加到 HBase ruby shell 中。这些命令已添加到 jira HBASE-3506 这些命令采用表的正则表达式来禁用/删除。他们会在继续之前要求确认。这应该使删除大量表变得非常容易,并且不需要外部库或脚本。
【讨论】:
disable_all '*.*' 是禁用所有 HBase 表的适当命令。使用disable_all '*'时,会收到来自HBase的不正确的禁用确认;这是一个known issue,在 HBase 0.94.4 及更高版本中已修复。
有一个黑客。 打开 $HBASE_HOME/lib/ruby/shell/commands/list.rb 文件并在命令方法的底部添加以下行。
return list
之后,list 命令返回所有表的名称数组。 然后就这样做。
list.each {|t| disable t;drop t}
【讨论】:
如果您正在寻找可以通过 shell 脚本在“单行”中执行此操作的东西,您可以使用以下方法:
$ echo 'list.each {|t| disable t; drop t}; quit;' | hbase shell
注意:以上是在 Bash shell 提示符下运行的。它将命令回显到hbase shell 并循环遍历从list 命令返回的所有表,然后在遍历list 返回的数组时禁用并删除每个表。一旦完成,它就会退出。
【讨论】: