我编写了一个脚本来计算每 2 小时插入 3 个单独的 HBase 表中的记录数。我知道这是劣质的,但它效果很好,我检索到了想要的结果......但是,每次通过循环工作时,我都必须调用HBase外壳。
有没有办法改进我的代码,这样我就不必这样做来加快速度?
#!/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
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 命令disable X
后跟drop X
。
在电信工作期间,我经常需要与没有任何 API 的各种 CLI 工具进行交互。对于几乎所有这样的情况,期望都是一个完美的工具。因此,它可以在"期望提示"然后"编写命令"然后"收集输出"的样式中工作。对于高级脚本,有将其与TCL语言相结合的方法。
对我来说,它曾经允许使用仅由SSH提供的多个路由器来控制分布式设置。所以这绝对是你可以使用的方法,问题是它是否不太强大。
另一种选择是将HBase shell的脚本准备到外部文件中,然后通过输出处理执行它。从表面上看,这是努力和结果的最佳结合。