EC2上でSparkを実行
Sparkのec2
ディレクトリにある spark-ec2
スクリプトを使ってAmazon EC2上のSparkクラスタを起動、管理およびシャットダウンすることができます。それはあなたのためにクラスタ上にSparkおよびHDFSを自動的にセットアップします。このガイドはクラスタを開始ためにspark-ec2
を使う方法、それらの上でジョブを実行する方法、およびそれらをシャットダウンする方法を説明します。既にAmazon Web Services サイト上でEC2アカウントのために入会していると仮定します。
spark-ec2
は複数の名前付きのクラスタを管理するように設計されています。新しいクラスタを(スクリプトにサイズと名前を渡して)起動、既存のクラスタをシャットダウン、あるいはクラスタに記録することができます。各クラスタはクラスタ名から派生した名前を持つEC2セキュリティグループにマシーンを配置することで識別されます。例えば、test
という名前のクラスタはtest-master
という名前のセキュリティグループにマスターノードを持ち、test-slaves
という名前のセキュリティグループにいくつかのスレーブノードを持つでしょう。spark-ec2
スクリプトはリクエストしたクラスタ名に基づいたセキュリティグループを作成するでしょう。Amazon EC2コンソール内に各クラスタに所属するマシーンを識別するためにそれらを使用することができます。
開始する前に
- 自身のためにAmazon EC2 キーペアを作成します。AWS consoleを使ってAmazon Web サービスアカウントにログインし、左のサイドバー上のキーペアをクリックし、生成およびキーをダウンロードすることで、これを行うことができます。
ssh
が動作するように、秘密鍵ファイルのパーミッションを600
にするのを忘れないでください(つまり、あなたのみが読み書きできる)。 spark-ec2
スクリプトを使いたい場合はいつでも、Amazon EC2アクセスキーIDと秘密アクセスキーに環境変数AWS_ACCESS_KEY_ID
およびAWS_SECRET_ACCESS_KEY
を設定します。これらは AWS ホームページから Account > Security Credentials > Access Credentials をクリックすることで取得することができます。
クラスタの起動
- ダウンロードしたSparkのリリースの
ec2
ディレクトリに行きます。 -
./spark-ec2 -k <keypair> -i <key-file> -s <num-slaves> launch <cluster-name>
を実行します。<keypair>
は EC2 キーペア(作成した時に渡しています)で、<key-file>
はキーペアの秘密鍵ファイル、<num-slaves>
は起動したいスレーブノードの数(最初は1から試してください)、そして<cluster-name>
はクラスタにつけた名前です。例えば:
bash export AWS_SECRET_ACCESS_KEY=AaBbCcDdEeFGgHhIiJjKkLlMmNnOoPpQqRrSsTtU export AWS_ACCESS_KEY_ID=ABCDEFG1234567890123 ./spark-ec2 --key-pair=awskey --identity-file=awskey.pem --region=us-west-1 --zone=us-west-1a launch my-spark-cluster
- 全てが起動した後で、web UIからクラスタのスケジューラが起動しているか調べ、全てのスレーブを見ます。これはスクリプトの一番最後に出力されているでしょう(一般的には
http://<master-hostname>:8080
)。
もっと使用方法のオプションを見るために ./spark-ec2 --help
を実行することができます。以下のオプションに注意する価値があります:
--instance-type=<instance-type>
は使用するEC2インスタンスを指定するために使われます。今のところ、スクリプトは 64-bit instance typesのみをサポートし、デフォルトのタイプはm1.large
(2コアおよび7.5 GB RAM)です。他のインスタンスタイプの情報についてのEC2 instance types と EC2 pricingについては、Amazonのページを参照してください。--region=<ec2-region>
インスタンスを起動するEC2地域を指定します。デフォルトの地域はus-east-1
です。--zone=<ec2-zone>
はインスタンスを起動するEC2利用ゾーンを指定するために設定することができます。一つのゾーンに十分な容量がないためにエラーになることが時々あります。他で起動する必要があります。--ebs-vol-size=<GB>
クラスタの再起動にまたがってノード上に永続化HDFSクラスタを持つことができるように各ノードに指定された大きさの空間を持つEBSボリュームを付けるでしょう(以下を見てください)。--spot-price=<price>
はSpot Instancesとして指定された最大金額(ドル)で入札してワーカーノードを起動するでしょう。--spark-version=<version>
は指定されたバージョンのSparkでクラスタをプリロードするでしょう。<version>
はバージョン番号(例えば “0.7.3”) あるいは特定のgitハッシュです。デフォルトでは、最新のバージョンが使われるでしょう。--spark-git-repo=<repository url>
は指定されたgitリポジトリからビルドされたSparkのカスタムバージョンを実行するでしょう。デフォルトでは、Apache Github mirrorが使われるでしょう。カスタムSparkバージョンを使う場合は、--spark-version
バージョン番号の変わりに 317e114のようなgitコミットハッシュを設定しなければなりません。- 例えば、秘密鍵ファイルのパーミッションが正しくないために起動が失敗した場合は、既存のクラスタ上でセットアッププロセスを再起動するために
--resume
オプションを付けてlaunch
を実行することができます。
VPCでクラスタを起動
-
./spark-ec2 -k <keypair> -i <key-file> -s <num-slaves> --vpc-id=<vpc-id> --subnet-id=<subnet-id> launch <cluster-name>
を実行します。<keypair>
は(生成時に指定した)EC2キーペアの名前、<key-file>
はキーペアの秘密鍵ファイル、<num-slaves>
は起動したいスレーブノードの数(最初は1から試してください)、<vpc-id>
はVPCの名前、<subnet-id>
はサブネットの名前、および<cluster-name>
はクラスタにつけた名前です。例えば:
bash export AWS_SECRET_ACCESS_KEY=AaBbCcDdEeFGgHhIiJjKkLlMmNnOoPpQqRrSsTtU export AWS_ACCESS_KEY_ID=ABCDEFG1234567890123 ./spark-ec2 --key-pair=awskey --identity-file=awskey.pem --region=us-west-1 --zone=us-west-1a --vpc-id=vpc-a28d24c7 --subnet-id=subnet-4eb27b39 --spark-version=1.1.0 launch my-spark-cluster
アプリケーションの実行
- ダウンロードしたSparkのリリースの
ec2
ディレクトリに行きます。 - クラスタにSSHするために
./spark-ec2 -k <keypair> -i <key-file> login <cluster-name>
を実行します。<keypair>
および<key-file>
は上と同じです。(これは利便性のためです; EC2コンソールを使うこともできます。) - クラスタ内にコードあるいはデータをデプロイするために、ログインして提供されたスクリプト
~/spark-ec2/copy-dir
を使用することができます。これはディレクトリを指定して、すべてのスレーブの同じ場補にRSYNCします。 - アプリケーションが大きなデータセットにアクセスしなければならない場合、もっとも速い方法はそれをAmazon S3あるいはAmazon EBSデバイスから、ノード上のHadoop 分散ファイルシステム(HDFS)のインスタンスにロードすることです。HDFSインスタンス上に
spark-ec2
スクリプトがすでにあります。それは/root/ephemeral-hdfs
にインストールされており、ディレクトリ内のbin/hadoop
を使ってアクセスすることができます。このHDFS内のデータはマシーンを停止および再起動した時に消えることに注意してください。 - クラスタ間で再起動時にデータを維持するpersistent HDFSインスタンスも
/root/persistent-hdfs
にあります。一般的には各ノードは永続的データに比較的少ない領域(約3GB)を持ちますが、永続的データを持つために各ノードに永続的EBSボリュームを加えるために--ebs-vol-size
オプションをspark-ec2
に使用することができます。 - 最後に、アプリケーションを実行中にエラーがあった場合は、スケジューラのworkディレクトリ (/root/spark/work)にあるアプリケーションのスレーブログを見てください。web UIを使ってクラスタの状態を見ることもできます:
http://<master-hostname>:8080
。
設定
JMオプションのようなSpark設定オプションを各マシーンに設定するために、/root/spark/conf/spark-env.sh
を編集することができます。このファイルは変更を反映するために 各マシーンにコピーされる必要があります。コピーするもっとも簡単な方法は copy-dir
という名前の提供されているスクリプトを使うことです。まずマスター上にある spark-env.sh
ファイルを編集し、それから全てのワーカーにそれをRSYNCするために~/spark-ec2/copy-dir /root/spark/conf
を実行します。
設定ガイド は利用可能な設定オプションを説明します。
クラスタの終了
EC2ノード上ではシャットダウンした後でデータを回復する方法は無いことに注意してください。停止する前に全ての重要なものをノードからコピーするようにしてください。
- ダウンロードしたSparkのリリースの
ec2
ディレクトリに行きます。 ./spark-ec2 destroy <cluster-name>
を実行します。
クラスタの一時停止および再起動
spark-ec2
スクリプトはクラスタの一時停止もサポートします。この場合、VMは停止しますが、終了しません。ですので、ephemeral ディスク上の全てのデータは失われますが、ルートディレクトリおよび永続的hdfs
内のデータは維持されます。停止したマシーンはどのEC2サイクルでもコストにならないでしょうが、EBSストレージについてはコストが掛かり続けるでしょう。
- クラスタの一つを停止するために、
ec2
ディレクトリに入り、./spark-ec2 --region=<ec2-region> stop <cluster-name>
を実行します。 - 後でそれを再起動するには、
./spark-ec2 -i <key-file> --region=<ec2-region> start <cluster-name>
を実行します。 - 最終的にクラスタを破棄しEBS領域の消費を停止するには、前の章で説明されたように
./spark-ec2 --region=<ec2-region> destroy <cluster-name>
を実行します。
制限事項
- “cluster compute” ノードのサポートは制限されています - localityグループを指定する方法はありません。しかし、スレーブノードを
<clusterName>-slaves
グループ内に手動で起動することができ、それらでクラスタを開始するためにspark-ec2 launch --resume
を使うことができます。
それらの制限のためのパッチあるいは提案がある場合は、気軽に貢献 してください。
S3のデータへのアクセス
SparkのファイルインタフェースはHadoopのためにサポートされているURLフォーマットと同じものを使ってAmazon S3内のデータを処理することができます。s3n://<bucket>/path
形式のURIを使って入力としてS3内のパスを指定することができます。S3アクセスのためのAWS認証を提供するために、スパーククラスタを--copy-aws-credentials
.オプションを付けて起動します。Hadoop入力ライブラリを使ったS3アクセスの完全な説明はHadoop S3 ページで見つけることができます。
一つの入力ファイルを使うことに加えて、ディレクトリへのパスを単純に入力として指定することで、ファイルのディレクトリを使うこともできます。