如何在HBase shell中循环执行命令而不必每次都调用shell

时间:2015-05-18 09:37:36

标签: bash shell hadoop hbase

我编写了一个脚本来计算每2小时插入3个HBase表的记录数。我知道它是劣质但它运行良好,我检索到所需的结果....但是每次它通过循环工作时我都要调用HBase shell。

有没有办法改进我的代码,以便我不必这样做来加快速度?

#!/bin/bash

declare -a hbaseTables=("table1" "table2" "table3");
for i in "${hbaseTables[@]}"
  do
        echo $i >> results.txt
        time=1431925200000
        for ((x=0; x<2; x=x+1))
          do
                hbase shell <<EOF | tail -2 | grep -oE "^[0-9]+" >> results.txt
                scan '$i', {TIMERANGE => [$time,$time+7199999]}
EOF
                time=$time+7200000
          done
    echo ----- >> results.txt
  done

2 个答案:

答案 0 :(得分:2)

HBase shell是用Ruby编写的,因此您可以完全访问任何Ruby命令。

因此,例如,如果我想删除不以字符串dev01开头的集群中的所有表,我可以这样做:

$ echo 'a=list; a.delete_if{ |t| t=~/dev01.*/}; \
     a.each{ |t| disable t; drop t}; quit;' | hbase shell

以上内容将list数组的副本复制为a。然后它在复制的数组a中删除所有以dev01开头的元素,然后循环遍历a中的其余元素并运行HBase shell命令{{1} }后跟disable X

答案 1 :(得分:0)

在电信公司工作期间,我经常需要与各种没有任何API的CLI工具进行交互。几乎所有像expect这样的案例都是完美的工具。所以它可以在风格上工作,期待提示&#39;那么&#39;写命令&#39;然后&#39;收集输出&#39;。对于高级脚本,有一种方法可以将它与TCL语言结合起来。

对我而言,它曾经允许使用几个仅通过SSH可用的路由器来控制分布式设置。所以这绝对是你可以使用的方法,问题是它是不是太强大了。

其他替代方法是将HBase shell的脚本准备到外部文件中,然后使用输出处理执行它。可以肯定的是,它是努力和结果的最佳组合。