概要
分かってしまえば簡単なのだけど、クラスタだの、Docker だのの情報に振り回されてハマってしまったので、開発目的や評価目的で Spark を動かすのは簡単なんだよ、というのを書いておく。
サーバ仕様
- t2.large (Memory 8GB)
- Amazon Linux
t2.micro + docker-spark のメモリエラーで悩まされたので、どこかで読んだ「Hadoop, Spark の最低スペックはメモリ8GB」という情報を元に t2.large を借りた。Memory 1GB だと厳しいけど、評価だけなら 2 ~ 4GB でも十分かもしれない。
Spark のインストール
Spark 自体は Hadoop に依存しているけど、事前に Hadoop をインストールする必要はない。Spark Overview にある情報をもとに、ダウンロードページ から Pre-built for Hadoop 2.6 and later をダウンロードして、展開すれば OK。
$ cd /usr/local/src
$ sudo wget http://ftp.riken.jp/net/apache/spark/spark-1.4.0/spark-1.4.0-bin-hadoop2.6.tgz
$ sudo tar zxvf spark-1.4.0-bin-hadoop2.6.tgz
$ cd spark-1.4.0-bin-hadoop2.6
展開したディレクトリの中に入れば、あとは自由にコマンドを実行できる。(必要に応じて、ディレクトリを /usr/local/spark などに移動しよう)
Spark を動かす
単体のサーバで Spark を動かす方法は、主に下記の2通り。(local-cluster というモードもあるけど、一般的でないので、ここでは無視)
- local モードで動かす方法
- standalone のクラスタで動かす方法
local モードで動かす場合
$ ./bin/run-example SparkPi 10
$ ./bin/spark-shell --master "local[2]"
scala> sc.parallelize(1 to 1000).count()
$ ./bin/pyspark --master "local[2]"
>>> sc.parallelize(range(1000)).count()
などなど。
コマンドの --master
引数に local[*]
等を渡せば良い。カッコ内の数字は利用するスレッドの数で、*
を与えると CPU core 数のスレッドが立ち上がる。マルチスレッド特有の振る舞いもあるので、2以上の値で実行するのが良いと思う。
なお、--master
引数の詳細は SparkContext: マスターURLが詳しい。
standalone モードで動かす
詳細は Spark Standalone Mode を参照。下記のように master, slave を起動する。
$ sudo ./sbin/start-master.sh
$ sudo ./sbin/start-slave.sh "spark://ip-10-0-1-42:7077"
start-slave.sh の引数には、master の URL を与える必要があるので注意。ps aux | grep java
などとプロセスを確認すれば、master がどういう名前で立ち上がっているかを確認できる。
あとは、spark-shell
や pyspark
の起動時の引数に master url を渡せば、クラスタを使って演算することができる。
$ ./bin/spark-shell --master "spark://ip-10-0-1-42:7077"
scala> sc.parallelize(1 to 1000).count()
なお、サーバの 8080 ポートにブラウザでアクセスすると、下記のようなクラスタの詳細が見られるはず。spark-shell でコマンドを実行したりすると、worker への分配処理などが見れて楽しい。
まとめ
というわけで、ダウンロードして展開すれば、単体のサーバで Spark や Spark のクラスタ機能を試せます。
実際に大規模なデータ処理が必要になったら、 spark-ec2 で EC2 でクラスタを立てたり、EMR で動かしたりしてみようと思います。