Tomo's IT Blog

技術的な調査メモ

Apache Sparkの勉強-Clusterを構成してみよう!spark-ec2スクリプトでクラスタ簡単構築

f:id:tmnj:20161213134842p:plain

今日は、自動でec2インスタンスを作成してSpark Clusterを構成してくれるspark-ec2ツールを利用してクラスタを構成してみます。

正式なサイトは以下です。こちらに書かれている内容に沿って実施してみます。

github.com

ツールの概要

spark-ec2は、Apache Sparkクラスタをec2上で起動・管理・シャットダウンできるツールです。Apache SparkとHDFSクラスタ上に自動で構成してくれます。
ツールでは同時に複数のクラスタを扱うことができますが、クラスタはec2インスタンスが所属するセキュリティグループにより識別されます。たとえば、testという名前のクラスタには、マスターノードはtest-masterと呼ばれるセキュリティグループ内に、複数のスレーブノードは、test-slavesというセキュリティグループ内に含まれます。spark-ec2スクリプトは、要求したクラスタ名に基づいて、これらのセキュリティグループを自動で作成します。

事前準備

  • 当然ですが、awsのアカウントは事前に作成しておきます。
  • 利用するKey Pairを作成しておきます。これはAWS Console上で作成できます。
  • AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYに自身のec2 access keyとsecret access keyをセットしておきます。
    • AWS Homepageへ行き、アカウント > セキュリティ認証情報をクリックしてアクセスキーから作成できます。
    • アクセスキーとシークレットキーはセキュリティ上、絶対に外部に漏らさないようにしてください。特にスクリプトに直書きして、GitHubのPublicリポジトリに公開などしないように注意してください。この情報が漏れると不正利用されます。特に大規模なBitCoin発掘用途でEC2インスタンスを不正に大量作成されてしまうという被害があるようです。

作業用のec2インスタンスの作成

作業用にec2インスタンスを1つスポットインスタンスで作成しておきます。

作成方法は以下の記事を参照してください。

tmnj.hatenablog.com

作業用ec2インスタンスへspark-ec2のインストール

spark-ec2はGitHubから入手できます。

$ sudo install git
$ git clone https://github.com/amplab/spark-ec2.git

なお、spark-ec2はspark 1.6.3以前はspark本体に同梱されていましたが、2.0.0から上記GitHub上に分離されました。*1

クラスタの起動

では早速起動してみます。上記で取得したspark-ec2ディレクトリに移動します。

以下のようにアクセスシークレットキーとアクセスキーを環境変数にセットします。(以下の値はダミーです。)
注意: 自身のアクセスキー情報は絶対に外部に漏らさないでください。また、テストが終わったらアクセスキーは削除しておきましょう!

export AWS_SECRET_ACCESS_KEY=xxxxxx
export AWS_ACCESS_KEY_ID=xxxxxx

private-key.pemという名称で、ec2インスタンス作成に利用するKey PairのPrivate Keyをセットしておきます。
以下のように600をパーミッションとしてセットしておきます。

chmod 600 private-key.pem


次に、インスタンスを作成するリージョン名とアベイラビリティ名を調べておきます。
リージョン名は以下のURLから参照できます。

リージョンとアベイラビリティーゾーン - Amazon Elastic Compute Cloud


リージョンで利用可能なアベイラビリティゾーンは、以下のURLを参照してください。

リージョンとアベイラビリティーゾーン - Amazon Elastic Compute Cloud


ここでは、東京リージョン(ap-northeast-1)のap-northeast-1aを利用します。

以下のようなコマンドを実行します。

./spark-ec2 \
  --key-pair=admin-key-pair-tokyo \
  --identity-file=private-key.pem \
  --region=ap-northeast-1 \
  --zone=ap-northeast-1a \
  --instance-type=c3.large \
  --slaves=3 \
  --spot-price=0.03 \
  --hadoop-major-version=2 \
  launch spark-ec2-cluster


インスタンスタイプはc3.largeを指定して、slave数を3インスタンスとしています。また、--spot-priceを指定することでスポットインスタンスを作席できます。価格はec2ダッシュボードのスポットリクエストから調べることができますので現状の値を下回らない値を指定してください。
--hadoop-major-version=2は、これを入れないとsparkのダウンロードが404になってしまうため指定しておきます*2

途中でsshがrefuseされたエラーが出るかもしれませんが、おそらくec2がまだ準備中のためであり、しばらく待っていれば処理が進むと思います。(5~10分ぐらい)もし、private-keyのパーミッション設定などが間違っていた場合は、一旦停止して、--resumeをつけて再実行してみてください。

トータルでは15分ぐらいかかると思います。コーヒーでも飲んで待ちましょう!


ただ、デフォルトだとSpark1.6.2がインストールされるっぽいです。--spark-version=2.0.2を指定すると最初のバージョンチェックでエラーとなるため、動作が不明です。今後調査します。

インストールが完了すると、以下のようにMaster Web USが表示されます。

Spark standalone cluster started at http://ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:8080
Ganglia started at http://ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com:5080/ganglia
Done!

Master Web UIにアクセスすると、以下のようにMaster/Workerが構成されています。

f:id:tmnj:20161213162736p:plain

クラスタを止める

以下のコマンドでec2インスタンスごと止まります。

./spark-ec2 --key-pair=admin-key-pair-tokyo --identity-file=private-key.pem --region=ap-northeast-1 --zone=ap-northeast-1c destroy spark-ec2-cluster

まとめ

大規模なクラスタ環境をec2上に作成する場合は非常に便利かもしれません。
ただ、内部的にブラックボックスな部分が多いので、ちゃんと理解するにはまだまだ勉強が足りません…。