HDInsight のクラスタ作成時にスクリプトを実行する “Script Action”
autoexec.bat あるいは /etc/rc 的なやつ
HDInsight は「ジョブを繰り返し実行する間だけクラスタを動かしておき、使わなくなればクラスタを削除」という使い方が一般的です。「次回も使う(かもしれない)からとっておきたいデータ」はデフォルトファイルシステムである BLOB ストレージへ置いておくわけです。
こういう使い方をする以上、頻繁に「クラスタの作成」を繰り返すことになりますが、そうなると「クラスタ作成時に行う環境設定処理を自動化」したくなるのが人情というものです。最近追加された ”Script Action” で、これが可能になりました。
Script Action を試してみる
最近の Azure 新機能の例にもれず、Script Action も現時点(2014/12/01)では管理ポータルから設定できません。Azure PowerShell を使う必要があります。
具体的には、下記のように New-AzureHDInsightClusterConfig の出力を Add-AzureHDInsightScriptAction にパイプして、スクリプトのURIなどを指定します。
New-AzureHDInsightClusterConfig <ゴニョゴニョ> |
Add-AzureHDInsightScriptAction `
-Name スクリプト名 `
-ClusterRoleCollection 実行するノードの指定 (HeadNode|WorkerNode|HeadNode,WorkerNode)`
-Uri スクリプトのURI
-Name はスクリプト定義に対して付ける名前です。スクリプトファイル名ではありません。処理の内容が分かりやすい名前を付けておくのがよいと思います。
-ClusterRoleCollection には、スクリプトを実行したいノードの種別を指定します。”HeadNode”はHadoopのネームノード(HA構成なので2台)、DataNodeはデータノード達です。
※ ヘッドノードとデータノードの両方を指定するときは、書き方に注意してください。
- ○ -ClusterRoleCollection HeadNode,WorkerNode
- ○ –ClusterRoleCollection “HeadNode”, “WorkerNode”
- × –ClusterRoleCollection “HeadNode,WorkerNode”
3番目の書き方は、“HeadNode,WorkerNode”という一つの文字列になってしまいますので、正しく解釈されません。このオプションには配列を渡す必要があるのです。
–Uri にスクリプトのフルパス名、というか URL を指定します。
https://アカウント.blob.core.windows.net/scripts/hdistartup.ps1
という感じで。
スクリプトは、PowerShell で記述してどこか適当な所 (全ノードからHTTPでアクセス可能なところ) に置いておきます。HDInsight なのでデフォルトの BLOB ストレージへ置いておくのが簡単です。私は、Set-AzureHDInsightDefaultStorage で指定するストレージアカウントに、 scripts というコンテナを作成して、そこへ置いています。 内容は、たとえばこんな感じです。(実際今日試したもの)
setx HADOOP_OPTS "-Dfile.encoding=UTF-8" /M |
全然 PowerShell である必要がない一行ですね…これを “hdistartup.ps1”などと名付けて BLOB ストレージへ置いておくわけです。
権限!
さて。賢明なる読者諸氏はすでにお気づきかもしれません。先ほどのスクリプト例、 setx に /M をつけて「システム環境変数」をセットしていますが、これは管理者権限が必要な操作です。
HDInsight のヘッドノードへログオンできるユーザーには管理者権限が付与されず、システム環境変数の設定やシステムロケールの変更、あるいはノードの再起動など様々な操作を封じられてしまっていますが、Script Action なら管理者権限が得られるわけです。これはいろいろ応用の幅が広そうですね!
注意点!
Script Action によって実行されるスクリプトは、Azure の Cloud Services におけるスタートアップタスクと同様に、「何度も実行される」ことがあるという点に留意してください。HDInsight のクラスタは Worker ロールの塊ですから、何らかのタイミングで reimage 処理が走り、ロールインスタンスの再作成が起こることがあります。この際、Script Action のスクリプトも再実行されるわけです。
現在の状態に依存せず、何度実行しても同じ結果が得られる、 idempotent な処理を記述するように心がける必要があります。
クラスタ作成スクリプトをどうぞ
さて、Azure 管理ポータルからの GUI によるクラスタ作成に比べると、 PowerShell スクリプトによる作成は若干面倒です(特に不慣れなうちは)。そこで、私が Script Action の実行を試す際に作成したクラスタ作成スクリプトを、GitHub へ置いておきました。よろしければご覧ください。
New-HDInsightClusterWithScriptAction.ps1
Script Action 以外にも、
- クラスタの仮想ネットワークへの配置
- Hive/Oozie メタストアとしての SQL Database の指定
などやっておりますので、パクって使いやすいかと。
関連情報
まだ英語しかないのですが、割とわかりやすい情報がいくつか出ておりますので、ご覧下さい。
基本的な使い方は、こちら
Script Action (Preview) Development with HDInsight
Apache Spark をインストールする例!
Install and use Spark 1.0 on HDInsight clusters (Preview)
そしてこちらは R をインストールする例!
Install and use R on HDInsight Hadoop clusters (Preview)
ぜひ、Script Action をご活用ください。
__END__