Apache BigtopとAmazon EMRでカスタムアプリケーションを構築しデプロイする方法
クラスタを起動する時に、Amazon EMRではそのクラスタで実行するアプリケーションを選択することができます。しかし、もし自分のカスタムアプリケーションをデプロイしたいと思ったらどうでしょうか?この記事では、どのようにカスタムアプリケーションをビルドしてApache Bigtopベースになっているリリース4.x以上のEMRで利用するかをお見せします。EMRのノードはAmazon Linux AMIをベースにしているので、パッケージはRPMでデプロイしたいと思います。また、アプリケーションの例としてElasticsearchを取り上げたいと思います。
Apache Bigtopとは?
Apache Bigtopはコミュニティでメンテナンスされているレポジトリで、幅広いコンポーネントとプロジェクトをサポートしています。Hadoop、HBase、そしてSpark等が含まれますがこれらに限りません。Bigtopはまた数多くのLinuxパケージングシステムをサポートしていて、例えばRPMやDebなどが含まれます。アプリケーションのクラスタ上でのデプロイや設定にはPuppetを使っています。
概要
以下の図が、Bigtopのパッケージ作成プロセスを表しています。
EMR用のBigtopパッケージを作成するには、以下のステップに従います:
- 開発用のEMRクラスタを起動する。
- Bigtopの公開レポジトリをクローンする。
- アプリケーションの定義をbigtop.bomに追加する。
- アプリケーションのディレクトリと設定ファイルを作成する。
- RPMパッケージを作成する。
- Yumレポジトリを作成する。
- アウトプットのレポジトリをS3に移し、新しいアプリケーションをインストールしたい新しいクラスタからアクセスできるようにする。
- アプリケーションをテストする。
- bootstrapスクリプトを作成する。
- そのbootstrapスクリプトを使ってEMRクラスタを起動する。
EMRクラスタを開発目的で作成したいと思います。ここにはMavenやGradleやその他のツールを含めたBigtopアプリケーションを作成しテストするのに必要なツールが入ります。
開発用のEMRクラスタを起動する
CLIを使って、以下のコマンドを実行して開発用のクラスタを起動します:
aws emr create-cluster --name "EMR_Bigtop_Dev" --release-label emr-4.7.2 --instance- type =m3.xlarge --instance-count 1 --ec2-attributes KeyName=<YOUR-KEY-PAIR> --log-uri s3: // <YOUR-BUCKET>/ --no-auto-terminate --use-default-roles --bootstrap-action Name= "Install EMR DEV Tools" ,Path=s3: //us-west-2 .awssupportdatasvcs.com /bootstrap-actions/EMR_Dev/setup_EMR_Dev .sh |
Bigtopの公開レポジトリをクローンする
クラスタが起動したら、EMR Bigtop devのマスターノードにSSHしてBigtopの公開レポジトリをクローンします:
|
アプリケーションの定義をbigtop.bomに追加する
前のセクションのコマンドでクローンした際に作成されたディレクトリの中に(/home/hadoop/bigtop/)、bigtop.bomという名前のファイルがあると思います。このファイルには現在のバージョンのBigtopで利用可能な全てのアプリケーションの定義が保存されています。
componentsのセクションに、’elasticsearch’というセクションを以下の通り追加します:
'elasticsearch' { name = 'elasticsearch' relNotes = 'Search and Analytics engine' version { base = '1.6.0' ; pkg = base; release = 1 } tarball { destination = "$name-${version.base}.tar.gz" source = "v${version.base}.zip" } url { site = "https://github.com/elastic/elasticsearch/archive" archive = site } } |
以下のスクリーンショットの様になると思います。
ここでアプリケーションを定義しているのは以下の様な項目になります:
- アプリケーション名
- アプリケーションのバージョン
- Tarball:
- destination: ダウンロードしたソースコードからビルドされるtarballの名前
- source: ソースコードのファイル名。個々ではGitHubから特定のリリース(Tag v1.6.0)をダウンロードしてきます。
- url: コードをダウンロードしてくるURL
レポジトリをテストする
BigTopアプリケーションをビルドするのに必要なGradleや他のツールがインストールされているかテストするために、以下のコマンドを実行します:
gradle tasks | grep elasticsearch |
初めての実行には少し時間がかかります。以下の様な最終的な出力が得られるはずです。
アプリケーションのディレクトリと設定ファイルを作成する
Bigtopでアプリケーションをデプロイするということには、2つの主要なタスクが含まれています: アプリケーションのRPMパッケージを作成することと、Puppetのスクリプトを作成することです。
- アプリケーションのRPMパッケージを作成する
アプリケーション例として使うElasticsearchの場合、カスタマイズされたバージョンのSPEC RPM定義を使います。もしBigtopに加えたいアプリケーションがRPMを提供していれば、それをBigtop用にカスタマイズできます。そうでなれけば、SPEC RPM定義ファイルをゼロから作成する必要があります。デフォルトのこれらのファイルの置き場所はこちらです:
bigtop-packages/src/rpm/<application-name>/SPECS
共通スクリプトは、最終のRPMを作るパッケージビルドプロセスで実行されます。もしRed HatベースのディストリビューションでBigtopを使う時は、RPMになります。Debianベースのディストリビューションの場合には、Debがパッケージ管理システムになります。これらのファイルのデフォルトのディレクトリはこちらです:
bigtop-packages/src/common/<application-name>/
幾つかの共通スクリプトはこちらです:
- do-component-build: このファイルはパッケージを作成する時の環境変数の設定とビルドコマンドが含まれます。例: mvn clean install -DskipTests -Dhadoop.version=$HADOOP_VERSION "$@"
- install-<application-name>.sh: このスクリプトはパッケージのディレクトリ構造と、その上にどの様にファイルが配布されるかを定義します。
一般的なガイダンスとして、FedoraドキュメントのHow to create an RPM packageをご覧下さい。もし初めてであれば、FedoraドキュメントのHow to create a GNU Hello RPM packageをご覧下さい。
- Puppetスクリプトを作成する
Puppetはアプリケーションのインストールと設定のプロセスを担当しています。各アプリケーションはメインとなる’init.pp’スクリプトで、アプリケーションをどの様にインストールし、どの様に設定ファイルを生成し、サービスが他のタスクの中でどの様にハンドルされるかを定義します。init.ppスクリプトのデフォルトの配置ディレクトリはこちらです:
bigtop-deploy/puppet/modules/<application-name>/manifests/
Puppetの中でもう一つ重要なディレクトリは’templates’です。Bigtopでは設定ファイルをコードとデータから生成してデプロイするためによくtemplatesを用います。templatesのデフォルトのディレクトリはこちらです:
bigtop-deploy/puppet/modules/<application-name>/templates/
Puppet templatesの詳細な情報はPuppetドキュメントのLanguage: Using templatesをご覧下さい。Puppetが初めてであれば、Puppet Hello Worldをご覧下さい。
ファイルとディレクトリ構造を作成する
この例では、必要なファイルとディレクトリ構造を以下のコマンドで作成します。
cd ~ |
アプリケーションに必要な構造をクローンしたら、以下のコマンドを使ってBigtopレポジトリをクローンして作ったローカルのBigtopレポジトリにコピーします。
cd aws-big-data-blog /aws-blog-bigtop-application-emr/ cp -r bigtop-packages/* ~ /bigtop/bigtop-packages/ cp -r bigtop-deploy/* ~ /bigtop/bigtop-deploy/ |
新しいアプリケーションのRPMパッケージを作成する
これで全ての設定ファイルが揃ったので、新しいアプリケーションをビルドするためのコマンドを実行します。このコマンドはソースコード(bigtop.bomで定義されている)をダウンロードし、ソースコードをコンパイルし、SPECファイルの指定で新しいRPMを作成します。
cd /home/hadoop/bigtop gradle realclean elasticsearch-rpm --stacktrace |
最終的な出力は以下の様になります:
単にgradle elasticsearch-rpmと実行するだけでパッケージを作ることはできるはずですが、幾つかパラメータを追加しています:
- --stacktraceはビルドプロセスの間に例外があったら、完全なスタックトレースを表示するためです。
- “realclean”は一度以上ビルドする必要がある時に、過去のビルドアウトプットをきれいに掃除するためです。
新しいアプリケーションのためのレポジトリを作成する
RPMパッケージが作成できたら、新しいRPMをホストするためのYumレポジトリを作成します。これによって、Puppetは必要な時にyumを呼ぶことで新しいアプリケーションをインストールできます。以下のコマンドを実行すると、RPMレポジトリは/home/hadoop/bigtop/output/に作成されます:
gradle yum |
アウトプットのレポジトリをS3に移動する
これでYumレポジトリが作成できたので、それをS3に移動することで、EMRクラスタが起動時に使えるようにします。このレポジトリは後ほどEMRクラスタをElasticsearchと共に起動するためのbootstrapスクリプト作成時に参照します。
aws s3 sync /home/hadoop/bigtop/output s3: // <your-bucket> /bigtop/output --acl public- read |
それから、新しく作成したレポジトリを指しているYumレポジトリの定義ファイルを作成します。/etc/yum.repos.d/にbigtop_custom.repoという名前のファイルを以下の様な中身で作成します:
[bigtop_custom] name=bigtop_custom_repo baseurl=https: //<your-s3-endpoint>.amazonaws.com/<your-bucket>/bigtop/output enabled=1 gpgcheck=0 |
“baseurl”を作成したレポジトリを同期したS3の場所に置き換えることを忘れないで下さい。
例えば、バケットがeu-west-1にあったら、ベースURLアドレスはこの様になります:
baseurl=https://s3-eu-west-1.amazonaws.com/my-bucket/bigtop/output
このより詳しい情報は、Working with Amazon S3 Bucketsをご覧下さい。
このレポジトリ定義をS3にアップロードして、新しいクラスタがパッケージを参照する時に利用できるようにしておきます。
aws s3 cp /etc/yum .repos.d /bigtop_custom .repo s3: // <your-bucket> /bigtop/repos/ |
レポジトリをテストする
以下のコマンドでレポジトリをテストします:
sudo yum list elasticsearch |
出力は以下の様になります:
アプリケーションをテストする
これで全て揃ったので、Puppetを適応してマスターノード上でアプリケーションをテストしてみます:
sudo puppet apply --verbose -d --modulepath= /home/hadoop/bigtop/bigtop-deploy/puppet/modules : /etc/puppet/modules -e 'include elasticsearch::client' 2>&1 | tee ~ /puppet_apply .log |
Puppetが設定スクリプトを適応している間、沢山のテキストが出力されると思います。これはホームディレクトリに”puppet_apply.log”という名前でホームディレクトリに保存されています。puppet applyコマンドが成功したら、クラスタ上にはElasticsearchが実行されているはずです。
REST APIを使ってヘルスチェックをすることができます。以下のコマンドを実行します:
curl localhost:9200 /_cluster/health ?pretty= true |
Elasticsearchは以下の様な結果を返してくるはずです。
新しいアプリケーションを新規クラスタにデプロイするためのbootstrapスクリプトを作成する
これでアプリケーションの作成が終わったので、そのアプリケーションを他のEMRクラスタ上に起動するために必要なbootstrapスクリプトを作成します。このスクリプトは、前にクローンしたディレクトリに含まれています:
vi ~/aws-big-data-blog/aws-blog-bigtop-application-emr/puppet_install_elasticsearch.sh
スクリプトを編集して、自身のバケットを指す様にしておきます:
#!/bin/bash set -x echo "creating custom Bigtop repository" sudo aws s3 cp s3: // <your-bucket> /bigtop/repos/bigtop_custom .repo /etc/yum .repos.d /bigtop_custom .repo |
新しいEMRクラスタを起動する時に利用できる様に、スクリプトをS3にアップロードします:
aws s3 cp ~ /aws-big-data-blog/aws-blog-bigtop-application-emr/puppet_install_elasticsearch .sh s3: // <your-bucket> /bigtop/scripts/ |
アプリケーションを新しいクラスタで起動する
使用しているroleによりますが、開発用のクラスタのマスターノードからはEMRクラスタを起動できないかもしれません。AWSコマンドラインツールがインストールされた他のEC2インスタンスかご自身のマシンから以下の様なコマンドでクラスタを起動できます:
aws emr create-cluster --name "EMR_Bigtop_Application_Test" --release-label emr-4.7.2 --instance- type =m3.xlarge --instance-count 3 --ec2-attributes KeyName=<your-key> --log-uri s3: // <your-bucket> /logs/ --no-auto-terminate --use-default-roles --bootstrap-action Name= "Install Elasticsearch" ,Path=s3: // <your-bucket> /bigtop/scripts/puppet_install_elasticsearch .sh |
または、EMRコンソールを使ってクラスタを起動することもできます。
クラスタが準備できたら、マスターノードにSSHしてアプリケーションが正しく起動しているか確認してみましょう:
まとめ
この記事では、どの様にApache Bigtopのアプリケーションを作成すればよいか、またそれをどの様にEMRクラスタ上で実行すれば良いかをお見せしました。
もし疑問やご意見がありましたら、以下のコメント欄をご利用下さい。
原文: Building and Deploying Custom Applications with Apache Bigtop and Amazon EMR (翻訳: SA岩永)
コメント