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はデータノード達です。
※ ヘッドノードとデータノードの両方を指定するときは、書き方に注意してください。

  1. ○ -ClusterRoleCollection HeadNode,WorkerNode
  2. ○ –ClusterRoleCollection “HeadNode”, “WorkerNode”
  3. × –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__