Amazon Elastic Mapreduce(EMR)では、起動時にHadoopのオプションなどを設定できるbootstrapというものが用意されています。うまく利用すれば、細かくHadoopのチューニングをしたり、Jobが起動する前に前処理を行ったりすることができます。
今回は、Webコンソール、Amazon Elastic MapReduce Ruby Client、Java SDKのそれぞれでbootstrapを設定する方法をご紹介します。
Webコンソールでbootstrapを設定するには
まずWebコンソールを使用して設定する方法を見ていきましょう。Webコンソールからは「Job作成」画面の「BOOTSTRAP ACTIONS」で設定します。この画面で「Configure your Bootstrap Actions」を選択しましょう。図1のような画面になります。
まずは、Action Typeでアクションのタイプを設定します。デフォルトとして以下のものが標準で設定されています。
- Configure Hadoop
- Configure Daemons
- Run If
- Custom Action
「Amazon S3 Location」にbootstrapの実体のS3パスを指定します。「Optional Arguments」はbootstapの実体ファイルに渡すパラメータです。
Configure Hadoop
名前のとおり、Hadoopのコンフィグに対して設定するbootstrapです。デフォルトでは以下のようにバッファのI/Oサイズを指定するようになっているのがわかると思います。
この値は、実際にはHadoop設定ファイルのcore-site.xmlに記述するものです。ここでパラメータとして渡すものは、基本的にHadoopの以下の3つのファイルです。
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
Configure Daemons
これも名前のとおりデーモン(JobTracker/NameNodeなど)に対して設定するbootstrapです。デフォルトでは、以下のようにネームノードに対してガベージコレクション時間とスループット時間の比率を制御するオプションが設定されています。
ここでパラメータとして渡すものはHadoopのhadoop-env.shで指定するものです。
Run If
Hadoop関連に限らず、何かしらの処理を実行したい場合に使用します。デフォルトでは以下のように起動したインスタンスがHadoopのマスターだった場合にその旨を表示するオプションが設定されています。
- instance.isMaster=true echo Running on master node
デフォルトで設定されている上記3つのスクリプトは、スクリプトファイルとしてRuby、Bashで記述されています。ファイルはS3上に存在するので、ダウンロードして、どういう処理を行っているのか確認してみるのも良いでしょう。
Custom Action
自分でbootstrapのスクリプトを作成した時に選択します。
以上から、「Custom Action」を選択し、S3上にチューニング、前処理などを記述したスクリプトファイルを設置しておけば、細かいチューニングがEMRの起動時に行えることがわかると思います。
bootstrapでサポートされているスクリプトは以下の4つです。
また、「Add another Bootstrap Action」をクリックすることでbootstrapをさらに追加することもできます。
bootstrapを設定してEMRを起動すると、「Job詳細」の「Bootstrap Actions」タブ(図2)に設定したbootstrapが表示されます。指定したものがbootstrapとして設定されているか確認してみてください。
Amazon Elastic MapReduce Ruby Clientでbootstrapを設定するには
次はAmazon Elastic MapReduce Ruby Clientを使ってbootstrapを設定する方法です。本連載の第3回もあわせて確認してみてください。
設定には以下のようにelastic-mapreduceコマンドを使います。
ポイントは以下の3点を指定することです。
- --bootstrap-action
- →WebコンソールでのAmazon S3 Locationを指定します。
- --arg
- →WebコンソールでのOptional Argumentsを指定します。
複数のパラメータを使用する場合は、以下のいずれかで設定します。
- --argを複数設定する
- --argsを使って「,」(カンマ区切り)で設定する
- --bootstrap-name
- →WebコンソールでのNameを指定します。
Java SDKでbootstrapを設定するには
最後はJava SDKでbootstrapを設定する方法です。やり方はかんたんで、いつものRunJobFlowRequestに渡すパラメータとして、bootstrap用のコンフィグを定義するだけです。
ポイントは以下の5点を指定することです。
- RunJobFlowRequest#withBootstrapActions
- →BootstrapActionConfigを設定します。
- BootstrapActionConfig#withName
- →WebコンソールでのNameを指定します。
- BootstrapActionConfig#withScriptBootstrapAction
- →ScriptBootstrapActionConfigを設定します。
- ScriptBootstrapActionConfig#withPath
- →WebコンソールでのAmazon S3 Locationを指定します。
- ScriptBootstrapActionConfig#withArgs
- →WebコンソールでのOptional Argumentsを指定します。
その他のbootstrap
実は、Webコンソールでデフォルトで登録されているもの以外にも、デフォルトで登録されているbootstrapが2つ存在します。
bootstrapの動きを確認するためのサンプルです。中身を確認していただけるとわかると思いますが、以下からファイルをダウンロードしてfile.tar.gzを展開するだけの簡単なスクリプトです。
memory-intensive
EMRで指定したインスタンスタイプに合わせて、各Javaプロセスのヒープ設定を最適な値にしてくれます。こちらも中身を確認していただけるとわかると思いますが、Rubyで書かれています。最高のパフォーマンスを引き出すためにもぜひ設定したいbootstrapです。
shutdown actionsで終了時にも処理できる
ここまで起動時の処理について説明してきましたが、実は終了時にも処理を行うよう設定できます。それがshutdown actionsです。shutdown actionsはJobが終了してterminateが実行される前に、以下のディレクトリに配置されているものがすべて実行されます。
- /mnt/var/lib/instance-controller/public/shutdown-actions/
終了時に処理を行いたい場合は、このディレクトリにbootstrapでスクリプトを配置するようにしましょう。
なお、shutdown actionsはインスタンスがエラーで終了する場合、動作が保証されていません。その点だけは注意しましょう。
以上がbootstrapの基本です。EMRはMapReduce処理を簡単に実行できますが、最適に使うためにはぜひbootstrapを設定してください。
次回はbootstrapとも絡みがあるパフォーマンスについて説明します。通常のHadoop同様、細かいパフォーマンスチューニングができますし、じつはデフォルトでもチューニング設定がされています。このあたりはぜひ押さえておきたいところです。お楽しみに。