Amazon Elastic MapReduceの使い方─Hadoopより手軽にはじめる大規模計算

第6回bootstrapを設定するには

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のような画面になります。

図1 ⁠Configure your Bootstrap Actions」を選択
図1 「Configure your Bootstrap Actions」を選択

まずは、Action Typeでアクションのタイプを設定します。デフォルトとして以下のものが標準で設定されています。

  • Configure Hadoop
  • Configure Daemons
  • Run If
  • Custom Action

「Amazon S3 Location」にbootstrapの実体のS3パスを指定します。⁠Optional Arguments」はbootstapの実体ファイルに渡すパラメータです。

Configure Hadoop

名前のとおり、Hadoopのコンフィグに対して設定するbootstrapです。デフォルトでは以下のようにバッファのI/Oサイズを指定するようになっているのがわかると思います。

io.file.buffer.size=65536

この値は、実際にはHadoop設定ファイルのcore-site.xmlに記述するものです。ここでパラメータとして渡すものは、基本的にHadoopの以下の3つのファイルです。

  • core-site.xml
  • hdfs-site.xml
  • mapred-site.xml

Configure Daemons

これも名前のとおりデーモン(JobTracker/NameNodeなど)に対して設定するbootstrapです。デフォルトでは、以下のようにネームノードに対してガベージコレクション時間とスループット時間の比率を制御するオプションが設定されています。

-XX:GCTimeRatio=19

ここでパラメータとして渡すものは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つです。

  • Ruby
  • Python
  • Perl
  • bash

また、⁠Add another Bootstrap Action」をクリックすることでbootstrapをさらに追加することもできます。

bootstrapを設定してEMRを起動すると、⁠Job詳細」「Bootstrap Actions」タブ図2に設定したbootstrapが表示されます。指定したものがbootstrapとして設定されているか確認してみてください。

図2 ⁠Bootstrap Actions」に設定したbootstrapが表示される
図2 「Bootstrap Actions」に設定したbootstrapが表示される

Amazon Elastic MapReduce Ruby Clientでbootstrapを設定するには

次はAmazon Elastic MapReduce Ruby Clientを使ってbootstrapを設定する方法です。本連載の第3回もあわせて確認してみてください。

設定には以下のようにelastic-mapreduceコマンドを使います。

$ ./elastic-mapreduce --create \
 --name exsample \
 --master-instance-type m2.xlarge \
 --slave-instance-type m2.xlarge \
 --num-instance 20 \
 --jar s3://emrjar/examplejar \
 --args wordCount,s3://input/,s3://output
 --enable-debugging \
 --log-uri s3://emr-log/ \
 --bootstrap-name "Configure Hadoop"
 --bootstrap-action "s3n://elasticmapreduce/bootstrap-actions/configure-hadoop"
 --arg "--site-key-value io.file.buffer.size=65536" \

ポイントは以下の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用のコンフィグを定義するだけです。

RunJobFlowRequest runJobFlowRequest =
    new RunJobFlowRequest()
        .withBootstrapActions(
            new BootstrapActionConfig().withName("Configure Hadoop")
                .withScriptBootstrapAction(
                    new ScriptBootstrapActionConfig()
                        .withPath("s3n://elasticmapreduce/bootstrap-actions/configure-hadoop")
                        .withArgs("--site-key-value io.file.buffer.size=65536")))
        .withName("EMR Job")
        .withSteps(enableDebugging, stepConfig)
        .withLogUri("s3://emr-log/")
        .withInstances(new JobFlowInstancesConfig()
               .withEc2KeyName("cluster-key")
               .withHadoopVersion("0.20")
               .withInstanceCount(10)
               .withKeepJobFlowAliveWhenNoSteps(true)
               .withMasterInstanceType("m1.large")
               .withSlaveInstanceType("m1.large")
               .withPlacement(new PlacementType()
                    .withAvailabilityZone("us-east-1a")));

ポイントは以下の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つ存在します。

download.sh

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同様、細かいパフォーマンスチューニングができますし、じつはデフォルトでもチューニング設定がされています。このあたりはぜひ押さえておきたいところです。お楽しみに。

おすすめ記事

記事・ニュース一覧