EMR起動時に任意のソフトウェアを追加するには

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

EC2インスタンスを利用する際はカスタムAMI(ユーザーが自分自身で作成するAMI)を利用することがよくあると思います。一方、EMRではカスタムAMIが利用できません。その代わりEMRにはブートストラップアクションという機能が用意されています。
(オプション)追加のソフトウェアをインストールするためのブートストラップアクションの作成 - Amazon Elastic MapReduce

概要

ブートストラップアクションはEMRによって起動されるノード(EC2インスタンス)に対して、起動時に任意の処理を追加で実行できる仕組みです。イメージ的にはcloud-initのようなもので、S3バケット上に任意のスクリプトファイルを配備しておくと、起動時にそのスクリプトファイルをノード上で実行することが出来ます。実行ユーザーはhadoopユーザーとなりsudoコマンドを利用してroot権限でのコマンド実行も可能です。そのため、例えばyumコマンドを使って各ノードに任意のソフトウェアを追加でインストールしたりすることが可能です。

ブートストラップアクションの利用手順は以下の通りです。

  1. スクリプトファイルを作成する
  2. スクリプトファイルをS3にアップロードする
  3. EMR起動時にブートストラップアクションを追加する

利用手順

ブートストラップの利用手順について説明します。今回はGroovyをインストールしてみたいと思います。

スクリプトファイルを作成する

まずはGroovyをインストールするためのスクリプトファイルを作成します。

#!/bin/bash -ex

# カレントをhadoopユーザーのホームディレクトリに変更する
cd ~

wget http://dl.bintray.com/groovy/maven/groovy-binary-2.4.1.zip
unzip groovy-binary-2.4.1.zip

cat << 'EOF' >> .bashrc

# Groovy
export GROOVY_HOME=/home/hadoop/groovy-2.4.1
export PATH=$PATH:$GROOVY_HOME/bin
EOF

ポイントとしてはcd ~という形でホームディレクトリに移動している所です。ブートストラップアクションのデフォルトの実行ディレクトリは/mnt/var/lib/bootstrap-actions/n/ *1であるため最初にhadoopユーザーののホームディレクトリに移動しています。また、ブートストラップアクションのデバッグ用にshebangを#!/bin/bash -exとしています。

スクリプトファイルをS3にアップロードする

次にinstall-groovy.shをS3にアップロードします。今回はemr.noto.example.comというS3バケットにアップロードしました。
emr-install-groovy.sh-on-s3

EMR起動時にブートストラップアクションを追加する

ではEMRクラスタを起動します。起動時にブートストラップアクションを追加します。
emr-install-groovy-Bootstrap-Actions
[Add bootstrap action]のセレクトボックスで[Custom action]を選択し、[Configure and add]ボタンをクリックします。すると追加用の画面が表示されるのでS3にアップロードしたinstall-groovy.shを選択します。
emr-Add Insall Groovy Bootstrap Action
後は普段通りにEMRクラスタを起動するだけです。

インストールされていることの確認

実際にGroovyがインストールされているか確認したいと思います。SSHでマスターノードに接続して下さい。

ssh hadoop@ec2-54-65-248-XXX.ap-northeast-1.compute.amazonaws.com -i ~/XXX.pem

ログイン後にGroovyがインストールされていることを確認します。

[hadoop@ip-172-31-18-160 ~]$ groovy -version
Groovy Version: 2.4.1 JVM: 1.7.0_71 Vendor: Oracle Corporation OS: Linux

インストールされていますね。ではログも確認しましょう。ログは/mnt/var/log/bootstrap-actions/n/ *2に出力されるようになっています。

[hadoop@ip-172-31-18-160 ~]$ ll /mnt/var/log/bootstrap-actions/1/
合計 64
-rw-r--r-- 1 hadoop hadoop  3202  2月 20 03:57 controller
-rw-r--r-- 1 hadoop hadoop 50295  2月 20 03:57 stderr
-rw-r--r-- 1 hadoop hadoop  4697  2月 20 03:57 stdout

shebangで-xオプションを指定してるためstderrファイルにトレースログが出力されます。

[hadoop@ip-172-31-18-160 ~]$ head -n 3 /mnt/var/log/bootstrap-actions/1/stderr
+ cd /home/hadoop
+ wget http://dl.bintray.com/groovy/maven/groovy-binary-2.4.1.zip
--2015-02-20 03:57:14--  http://dl.bintray.com/groovy/maven/groovy-binary-2.4.1.zip

まとめ

ブートストラップアクションを利用する上で留意点をまとめておきます。

  • 実行ユーザーhadoop(sudoは可能)
  • hadoopユーザーのホームディレクトリは/home/hadoop
  • 実行時のカレントディレクトリは/mnt/var/lib/bootstrap-actions/n/となるので必要に応じてcdする。もしくは絶対パスで操作する
  • ログは/mnt/var/log/bootstrap-actions/n/に出力される。

ブートストラップアクションは実行時に引数を渡すことも可能です。また、今回紹介したものはカスタムアクションになりますが、Hadoopの設定ファイルを変更するために予め用意されているアクションも存在します。詳細はドキュメントをご参照下さい。
(オプション)追加のソフトウェアをインストールするためのブートストラップアクションの作成 - Amazon Elastic MapReduce

最後に

ブートストラップアクションは任意のスクリプトファイルを実行することができるため、BashだけでなくRubyやPythonを利用することも可能です。GitHubのawslabsに色々なソフトウェアのブートストラップアクションが公開されているため、そのまま利用するでもいいですし、自分でブートストラップアクションを作成する際の参考にもしてもらえればと思います。
awslabs/emr-bootstrap-actions

脚注

  1. nは1からの連番になります
  2. nは1からの連番になります