Amazon EC2上でApache Sparkを動かす

# Apache SparkをEC2上で動かす
Apache Spark 1.0 がリリースされました。
EC2上で動かすScriptが用意されているとのことなので早速試してみました。

# Apache Spark インストール
Clouderaのリポジトリにまだ1.0が上がっていないため手動でインストールすることにします。

## Clouderaのリポジトリからインストールする場合
```shell-session
sudo yum install http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm
sudo rpm --import http://archive.cloudera.com/cdh5/redhat/6/x86_64/cdh/RPM-GPG-KEY-cloudera
sudo yum install spark-core spark-master spark-worker spark-history-server spark-python
```

※このリポジトリではSparkのバージョンは0.9.0なので注意

## 手動でインストールする
```shell-session
wget http://d3kbcqa49mib13.cloudfront.net/spark-1.0.0-bin-hadoop2.tgz
tar xzvf spark-1.0.0-bin-hadoop2.tgz
```

# 動作確認

参考サイト：
[Spark Overview - Spark 1.0.0 Documentation](http://spark.apache.org/docs/latest/)

Sparkのインストールディレクトリへ移動し、下記コマンドを実行する。

```shell-session
./bin/run-example SparkPi 10
```

ログが出力され、結果が表示されました。

```
Pi is roughly 3.142832
```

# インタラクティブシェルを試してみる
参考サイト：
[Quick Start - Spark 1.0.0 Documentation](http://spark.apache.org/docs/latest/quick-start.html)
[Apache Spark ドキュメント和訳 - Quick Start - Qiita](http://qiita.com/mychaelstyle/items/46440cd27ef641892a58)

```shell-session
./bin/spark-shell

...
...
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.0.0
      /_/

Using Scala version 2.10.4 (OpenJDK 64-Bit Server VM, Java 1.7.0_55)
Type in expressions to have them evaluated.
...
...
Spark context available as sc.

scala> 
```

```scala
scala> val textFile = sc.textFile("README.md")
textFile: org.apache.spark.rdd.RDD[String] = MappedRDD[1] at textFile at <console>:12

scala> textFile.count()
res0: Long = 127

scala> textFile.first()
res1: String = # Apache Spark
```

他にもサンプルやQuickStartがあるので試してみてください。

# spark-ec2 script

参考にしたサイト：
[Running Spark on EC2 - Spark 1.0.0 Documentation](http://spark.apache.org/docs/latest/ec2-scripts.html)
[Apache Spark ドキュメント和訳 - Apache Spark on AWS EC2 - Qiita](http://qiita.com/mychaelstyle/items/b752087a0bee6e41c182)

## 事前作業
Key Pairを作成しておく必要があります。
今回は、spark-demo.pemを作成しました。

### 環境変数を設定
```shell-session
export AWS_ACCESS_KEY_ID=XXXXXXXX
export AWS_SECRET_ACCESS_KEY=YYYYYYYY
```
※本番では、- IAM roles for EC2 instancesを使うことになるかと思います。

## クラスタを起動する
ec2ディレクトリへ移動する

```shell-session
cd spark-1.0.0-bin-hadoop2/ec2
```

以下のコマンドを実行する

```shell-session
./spark-ec2 -k spark-demo -i spark-demo.pem -s 2 launch spark-demo --instance-type t1.micro --region ap-northeast-1
```

![スクリーンショット 2014-06-12 2.25.20.png](https://qiita-image-store.s3.amazonaws.com/0/18582/1440c614-3b26-c37e-5dee-d85eb0e0e787.png)

起動しましたが、コンソール上にエラーが出ています。

```
Setting up security groups...
Creating security group spark-demo-master
Creating security group spark-demo-slaves
Searching for existing cluster spark-demo...
Spark AMI: ami-c7bfd4c6
Launching instances...
Launched 2 slaves in ap-northeast-1c, regid = r-713a2977
Launched master in ap-northeast-1c, regid = r-c7392ac1
Waiting for instances to start up...
Waiting 120 more seconds...
Generating cluster's SSH key on master...
ssh: connect to host ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com port 22: Connection refused
Error executing remote command, retrying after 30 seconds: Command '['ssh', '-o', 'StrictHostKeyChecking=no', '-i', 'spark-demo.pem', '-t', '-t', u'root@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com', "\n      [ -f ~/.ssh/id_rsa ] ||\n        (ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa &&\n         cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys)\n    "]' returned non-zero exit status 255
ssh: connect to host ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com port 22: Connection refused
Error executing remote command, retrying after 30 seconds: Command '['ssh', '-o', 'StrictHostKeyChecking=no', '-i', 'spark-demo.pem', '-t', '-t', u'root@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com', "\n      [ -f ~/.ssh/id_rsa ] ||\n        (ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa &&\n         cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys)\n    "]' returned non-zero exit status 255
ssh: connect to host ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com port 22: Connection refused
Error executing remote command, retrying after 30 seconds: Command '['ssh', '-o', 'StrictHostKeyChecking=no', '-i', 'spark-demo.pem', '-t', '-t', u'root@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com', "\n      [ -f ~/.ssh/id_rsa ] ||\n        (ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa &&\n         cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys)\n    "]' returned non-zero exit status 255
ssh: connect to host ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com port 22: Connection refused
Error executing remote command, retrying after 30 seconds: Command '['ssh', '-o', 'StrictHostKeyChecking=no', '-i', 'spark-demo.pem', '-t', '-t', u'root@ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com', "\n      [ -f ~/.ssh/id_rsa ] ||\n        (ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa &&\n         cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys)\n    "]' returned non-zero exit status 255
Warning: Permanently added 'ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com,xx-xxx-xx-xxx' (ECDSA) to the list of known hosts.
Connection to ec2-xx-xxx-xx-xxx.ap-northeast-1.compute.amazonaws.com closed.
Traceback (most recent call last):
  File "./spark_ec2.py", line 823, in <module>
    main()
  File "./spark_ec2.py", line 815, in main
    real_main()
  File "./spark_ec2.py", line 700, in real_main
    setup_cluster(conn, master_nodes, slave_nodes, opts, True)
  File "./spark_ec2.py", line 430, in setup_cluster
    dot_ssh_tar = ssh_read(master, opts, ['tar', 'c', '.ssh'])
  File "./spark_ec2.py", line 637, in ssh_read
    return subprocess.check_output(
AttributeError: 'module' object has no attribute 'check_output'
```

下記コマンドでSSHを使用してクラスタにログインを行う

```
./spark-ec2 -k <keypair> -i <key-file> login <cluster-name>
```

ダメですね。。。

クラスタを停止してみる。

```
./spark-ec2 stop spark-demo
```

止まらない・・・

クラスタを破棄してみる。

```
./spark-ec2 destroy spark-demo
```

ターミネートされない。。。

とりあえず、手動で停止してみました。
続きは今度。