はじめに
Cloudera Manager Advent Calendar 2015の12日目です。
Cloudera Managerは色々できますがなんでもできるわけではなく、場合によってはOSコマンドを直接実行したかったり、しないといけなかったりということがあります。
各ノードに一つ一つログインして実行するのは面倒なので、一括して実行できると良いと思いますが、sshするにも環境の作り方によってはノード名がランダムで作られていたりして取得も面倒なことがあると思います。
今回はCloudera Managerが持っているノード情報をAPIを使って持ってくることを考えます。
前提
- Cloudera Manager起動ノードでの実行を想定しています。
- コマンド実行ノードから各ノードに鍵交換しておくと便利です。
必須ではありませんが各ノードにひとつひとつログイン処理していくのはつらいです。
スクリプト
やってることは単純でノードのリストを持ってきてそれに対してfor文を実行しているだけです
必要に応じてUSERNAME/USERPASSを変更してください。変更したら~/bin/distなどに置いて実行権限を付与してください。
#!/bin/bash
BASE=http://localhost:7180/api/v8
USERNAME="admin"
USERPASS="admin"
nodes=$(curl -X GET -s -u "$USERNAME:$USERPASS" $BASE/hosts | grep '"hostname" :' | awk -F'"' '{print $4}' | sort)
for node in $nodes; do ssh $node 'echo -n "## "; hostname;'"$*;"'echo'; done
実行例
どういうことに使えるかという例とその実行結果を下記に示します。
awkで実行している変数の$など、bashに解釈されてしまうものもあるので注意してください。
クラスタ削除後に、再度のインストールに備えて以前のHDFSのデータを削除する(デフォルトでNN/DNどちらも/dfs)
dist "rm -rf /dfs; test -d /dfs || echo '/dfs' is cleard"
結果
## n1.lab.cloudera.com
/dfs is cleard
## n2.lab.cloudera.com
/dfs is cleard
## n3.lab.cloudera.com
/dfs is cleard
## n4.lab.cloudera.com
/dfs is cleard
HiveServer2の起動ノードを探す
dist "ps -ef | grep HiveServer2 | grep -v grep | awk '{print \$2}'"
結果
## n1.lab.cloudera.com
27157
## n2.lab.cloudera.com
## n3.lab.cloudera.com
## n4.lab.cloudera.com
ZooKeeperへの接続数を確認する(2181ポートはZooKeeperのClient接続ポート)
dist "netstat --ip -nap | awk '{print \$5}' | grep 2181 | wc -l"
結果
## n1.lab.cloudera.com
7
## n2.lab.cloudera.com
3
## n3.lab.cloudera.com
3
## n4.lab.cloudera.com
3
各ノードのパッケージのインストール状況を確認する
dist "rpm -qa | grep lzo"
結果
## n1.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64
lzop-1.02-0.9.rc1.el6.x86_64
lzo-devel-2.03-3.1.el6_5.1.x86_64
lzo-minilzo-2.03-3.1.el6_5.1.x86_64
## n2.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64
## n3.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64
## n4.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64
おわりに
いかがだったでしょうか。
リスト自体は環境の作り方によっては他の方法で作ったのが簡単だったりするかと思いますが、Cloudera Managerがあれば同じ方法で取得できる、というのは悪くないと思います。
ちなみに、複数クラスタを構築していて操作をクラスタに限定したい場合はクラスタに所属しているノードのhostIdを取得して全体からの絞り込みが必要だったりします。ちょっと面倒ですね。
こういうコマンドをノード全体に実行できると運用や調査で便利、というものがあれば教えてもらえると嬉しいです。