【问题标题】:A script that deletes all tables in Hbase一个删除Hbase中所有表的脚本
【发布时间】:2011-04-28 19:17:43
【问题描述】:

我可以使用以下命令告诉 hbase 禁用和删除特定表:

disable 'tablename'
drop 'tablename'

但我想删除数据库中的所有表,而不对任何表的名称进行硬编码。有没有办法做到这一点?我想通过命令行实用程序 ./hbase shell 来执行此操作,而不是通过 Java 或 Thrift。

【问题讨论】:

    标签: command-line hbase


    【解决方案1】:

    您可以通过管道将命令传递给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 提供的输出。我希望 hbase 有内置的东西。
    • 你不会发现 shell 的功能和 baja 的方法和你得到的一样接近。我认为改进当前外壳的计划方式并不多(这很糟糕)。我知道您想避免使用 thrift/java,但如果您可以发布避免使用它们的原因,可能会建议另一种选择?
    【解决方案2】:

    我不是通过 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

    【讨论】:

      【解决方案3】:

      我有一个使用 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
      

      【讨论】:

      【解决方案4】:

      disable_alldrop_all 已作为命令添加到 HBase ruby​​ shell 中。这些命令已添加到 jira HBASE-3506 这些命令采用表的正则表达式来禁用/删除。他们会在继续之前要求确认。这应该使删除大量表变得非常容易,并且不需要外部库或脚本。

      【讨论】:

      • 请注意,disable_all '*.*' 是禁用所有 HBase 表的适当命令。使用disable_all '*'时,会收到来自HBase的不正确的禁用确认;这是一个known issue,在 HBase 0.94.4 及更高版本中已修复。
      • 感谢 Emaad 的提示。我可以确认它在 0.94.5 中仍未修复。
      • 如果要删除命名空间中的所有表。在 hbase shell 中运行 disable_all 'namespace_name:.*' 和 drop_all 'namespace_name:.*'。
      【解决方案5】:

      有一个黑客。 打开 $HBASE_HOME/lib/ruby/shell/commands/list.rb 文件并在命令方法的底部添加以下行。

      return list
      

      之后,list 命令返回所有表的名称数组。 然后就这样做。

      list.each {|t| disable t;drop t}
      

      【讨论】:

        【解决方案6】:

        如果您正在寻找可以通过 shell 脚本在“单行”中执行此操作的东西,您可以使用以下方法:

        $ echo 'list.each {|t| disable t; drop t}; quit;' | hbase shell
        

        注意:以上是在 Bash shell 提示符下运行的。它将命令回显到hbase shell 并循环遍历从list 命令返回的所有表,然后在遍历list 返回的数组时禁用并删除每个表。一旦完成,它就会退出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-14
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 2010-12-08
          • 1970-01-01
          相关资源
          最近更新 更多