よしだのブログ

サブタイトルはありません。

Spark 1.2.0 を Amazon EMRで動かす。

どうも!今年の初エントリーです。今年もよろしくお願い致します。

今回は、Apache Spark 1.2.0 を Amazon EMR で動かしてみることに挑戦しました。Spark ではずっと遊んでいたんですが、MLLib をつかうのが目的だったので開発中はクラスタで動かすひつようもなく、ローカルで動かしていたためイマイチその速さがわかりませんでした。まあ、今後の本番のことを考えると、クラスターでの可動は検証しておく必要があったので、トライしてみました。Amazon EMR で動かしてみた理由は、Hadoop / YARN を立てるのがめんどくさかったので、YARN にも対応したとのことなので、こちらで動かしてみました。結果としては、かなりお手軽に動かすことができるので、おすすめです。

ちなみに、EMR で動かす前に、Spark 1.2.0 に付属している、Spark の スタンドアロンモードを EC2 上で機動する、EC2 スクリプトを試してみましたが、うまく動きませんでした。起動は timeout を500秒に設定することで成功しましたが、停止はうまく動かず手でインスタンスを全て停止する必要がありました。多分スクリプトのバグですw

作業は、以下の記事を参考にしました。詳細な手順はこちらをご参考にどうぞ。私のエントリでは、下記の記事でうまく行かなかったところやTIPSなどを載せたいと思います。

Spark on EMR(YARN対応)を動かす - Qiita

Spark on Amazon EMR の、そもそもの仕組み

まず、エントリで紹介されているそもそもの仕組みについて、ちょっとだけ補足。この辺りを先に知っておくと、作業がスムーズに進むと思います。

  • そもそもですが、EMR はそのまま起動しただけでは、Spark は使えません。

  • EMR で Apache Spark を動かす方法ですが、起動コマンドで指定する bootstrap-action が肝になっています。bootstrap-action で指定された URL 上にあるスクリプトを EMR はダウンロードしてきて、インスタンスの起動後に実行します。Spark の場合、install-spark というスクリプトが用意されておりこれが実行され、全インスタンスに Spark がインストールされます。

  • エントリでは作業用にインスタンスを1台立てています。IAMロールの指定など条件がありますが、条件が揃っているインスタンスならOKです。こちらでは、Spark は稼働しませんのでスペックは問いません。コマンド実行時に、MASTER と CORE のインスタンス数をそれぞれ指定しますが、さらにその台数分インスタンスが起動します。この上で Spark は稼働します。したがって、エントリ通りですと、1台+11台(MASTER 1台、CORE 10台)のインスタンスが全部で起動します。

  • インスタンスの種別に m1.large を指定していますが、特に問題はありませんでした。EC2 でお馴染みの、m3.large は指定できないなど、EC2 とは差異があります。*1

  • クラスタの正常起動後の Spark の使い方ですが、ssh で MASTER に指定したサーバーにログインし、そこで Spark を起動します。pyspark を起動している様は以下の通り。

[hadoop@ip-172-31-6-19 ~]$ cd spark/
[hadoop@ip-172-31-6-19 spark]$ ls
bin  CHANGES.txt  classpath  conf  ec2  examples  lib  LICENSE  NOTICE  python  README.md  RELEASE  sbin
[hadoop@ip-172-31-6-19 spark]$ bin/
beeline               run-example           spark-shell.cmd       utils.sh
compute-classpath.sh  spark-class           spark-sql
pyspark               spark-shell           spark-submit
[hadoop@ip-172-31-6-19 spark]$ bin/pyspark
  • 自作した Spark アプリを動かすには、クラスタ起動後に SSH で MASTER に転送する必要があります。MASTER のサーバーへのプログラムの配置は、emr ssh コマンドで行うのが正解だと思いますが、EC2 のセキュリティグループをいじって、手元のローカルから SCP 接続してファイルを転送することも可能です。セキュリティ上問題がある可能性もあるのでおすすめはしませんが。。。どのインスタンスがマスターかは、EMR の管理UIで確認することが出来ます。

コマンドラインについて

まずはじめに、エントリー通りの以下のコマンドを実行してみました。結果、インスタンスが起動するところまではうまくいくのですが、bootstrap 処理でエラーになり、クラスタが起動しませんでした。

aws emr create-cluster --region ap-northeast-1 --name SparkCluster --ami-version 3.3.1 --no-auto-terminate --service-role EMR_DefaultRole --instance-groups InstanceCount=1,BidPrice=0.03,Name=sparkmaster,InstanceGroupType=MASTER,InstanceType=m1.large InstanceCount=10,BidPrice=0.03,Name=sparkworker,InstanceGroupType=CORE,InstanceType=m1.large --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=xxxxxxxxxx --applications Name=HIVE --bootstrap-actions Path=s3://support.elasticmapreduce/spark/install-spark,Args=[-v,1.2]

そこで、Spark 用の bootstrap-action が配布されている AWS Lab の Github レポジトリ *2 を確認したところ、バージョンの指定がどうやら違うことがわかりました。バージョンを 1.2 から 1.2.0.a に変更して再実行したところうまくいきました。(一番おしりのバージョン指定のみが異なります。)

aws emr create-cluster --region ap-northeast-1 --name SparkCluster --ami-version 3.3.1 --no-auto-terminate --service-role EMR_DefaultRole --instance-groups InstanceCount=1,BidPrice=0.03,Name=sparkmaster,InstanceGroupType=MASTER,InstanceType=m1.large InstanceCount=10,BidPrice=0.03,Name=sparkworker,InstanceGroupType=CORE,InstanceType=m1.large --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=xxxxxxxxxx --applications Name=HIVE --bootstrap-actions Path=s3://support.elasticmapreduce/spark/install-spark,Args=[-v,1.2.0.a]

上記のコマンド実行後は、MASTER に自作の Spark アプリなり、スクリプトなりを転送して実行するとクラスタで稼働します。spark-submit コマンドの --master 引数に yarn-client を指定することを忘れないようにしましょう。

アドバイス:Spark するなら Scala で! (もしくは Java...)

以下は、Python のスクリプトを ganglia でモニタリングしているところ。なんか一箇所だけ赤い。。

f:id:yoshi0309:20150129221239p:plain

ganglia でモニターしてわかったことですが、pyspark はクラスタ構成時の実行に問題があるようで、1つの WORKER に処理が集中していました。このことが原因で、すべて Scala で書き直しをするはめになったのですが pyspark の問題はそれだけではなく、処理の途中でフリーズすることもあるようです。同じ処理を Scala で書きなおしたものを実行したところ、こちらはフリーズせずに稼働しました。

参考。

Hadoop のおすすめ書籍はこちら。Kindle版 もあります。オライリーの Hadoop 本は厚すぎて引いた、まずは使ってみて手を動かしながら覚えたい、という方には特におすすめです。

Spark の話はありませんが、Spark を使う上での必須の知識が詰まっています。

Hadoop徹底入門 第2版

Hadoop徹底入門 第2版

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築

*1:こちらに指定可能なインスタンスタイプが一覧されています。 http://aws.amazon.com/jp/elasticmapreduce/pricing/

*2:https://github.com/awslabs/emr-bootstrap-actions/tree/master/spark