Bluemix上でSparkアプリケーションを動かすよ


bluemixのSpark周りがしれっと更新されてるみたい。
* sparkのverson 1.6.0に更新
* notebookだけじゃなくてアプリケーションとして.jarの実行が可能に
* notebook実行時に右のenvironmentからjob historyが見れるように


ってことで、sparkのversionもv1.6.0に更新されてました。
今までのインスタンスから新しいnotebookを作成すると1.4.1、
新しいインスタンスを作成してから新しいnotebookを作成すると1.6.0の模様

バッチ実行はclientがLinuxでしかまだ動作しないって公式は書いてありますが、macでも動きます。
これでSpark Streamingの実行も簡単にできるようになりました。

## spark-submit.shをダウンロード

bluemix上でSparkを動作させるためのシェルをダウンロードする必要があります。
[spark-submit.sh](https://spark-service-attr-yp.ng.bluemix.net/spark_service_attr/spark-submit.sh)


##VCAPファイルを作成

vcap.jsonの名称でサービス資格情報をjsonファイルに保存しておきます。

```json
{
  "credentials": {
    "tenant_id": "XXXXXXXXXXX",
    "tenant_id_full": "XXXXXXXXXXXXXX",
    "cluster_master_url": "https://XXXXXXXXX:8443/",
    "instance_id": "XXXXXXXXXXXXXXXXXX",
    "tenant_secret": "XXXXXXXXXXXXXXXXX",
     "plan":"ibm.SparkService.PayGoPersonal"
  }
}
```

ちなみにこの情報はSparkのダッシュボードのメニューからサービス資格情報で取得できます。
下記の図のところから取得可能
![スクリーンショット 2016-04-21 15.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/31585/8dbba728-9a1e-e4d9-6e57-527a0b482400.png "スクリーンショット 2016-04-21 15.56.21.png")

##作ったSparkのアプリケーションの実行

```bash
/spark-submit.sh --vcap ./vcap.json --deploy-mode cluster --class com.y.t.p.sample --master https://169.54.219.20 target/scala-2.11/xxxxxxx.jar param1 param2
```

こんな感じで実行すると勝手に.jarのアップロードが始まるのでしばし待つ。

アップロードが終わると下のようにポーリングしてくれる
![スクリーンショット 2016-04-21 18.58.16.png](https://qiita-image-store.s3.amazonaws.com/0/31585/82c1d78c-08cc-2780-105a-30cb5884e239.png "スクリーンショット 2016-04-21 18.58.16.png")

数回ポーリングし終わると、stderrとstdoutのダウンロードを勝手にやってくれて終わり。
![スクリーンショット 2016-04-21 19.01.20.png](https://qiita-image-store.s3.amazonaws.com/0/31585/bbe58de5-c949-4df7-cd34-5cbbc5cd46f7.png "スクリーンショット 2016-04-21 19.01.20.png")

job may still be runnningという文言でて終わってます。
statusを取得したい場合はこちら的なメッセージも一緒に吐いてくれてる

##実行中のアプリケーションのstatus取得

下記を実行

```baash
./spark-submit.sh --status driver-20160421045627-0000-6fa7a1db-b58a-4bbf-a277-81bb8d25b0f7 --vcap ./vcap.json --master https://169.54.219.20
```

ちゃんと実行されてるのが見て取れる
![スクリーンショット 2016-04-21 19.04.17.png](https://qiita-image-store.s3.amazonaws.com/0/31585/8aeaabe4-f767-6d0b-58be-0c0f5e31523d.png "スクリーンショット 2016-04-21 19.04.17.png")

bluemixのダッシュボードとかの画面も確認して見たけれども、特に実行中のアプリケーションに関する情報は表示されない模様・・・え”、コマンド毎回叩くの？？

##アプリケーションの終了

終了する場合はkillする

```bash
./spark-submit.sh --kill driver-20160421045627-0000-6fa7a1db-b58a-4bbf-a277-81bb8d25b0f7 --vcap ./vcap.json --master https://169.54.219.20
```

![スクリーンショット 2016-04-21 19.09.20.png](https://qiita-image-store.s3.amazonaws.com/0/31585/5f8086b1-6f51-a121-9082-24eb8a3c1fce.png "スクリーンショット 2016-04-21 19.09.20.png")

kill後、再度statusを確認するとちゃんとKILLEDになってる
![スクリーンショット 2016-04-21 19.10.10.png](https://qiita-image-store.s3.amazonaws.com/0/31585/e2ea96a7-34c4-5f2c-27c7-d5ab9e5ab927.png "スクリーンショット 2016-04-21 19.10.10.png")


##ファイル周り
Spark as a Service にはディフォルトでオブジェクトストレージがついてきますが、
今までのnotebookでの指定の仕方から変更が必要な場合があります。

公式ページの注意書き
>Restriction: If your application accesses Object Store using credentials, do not include spark in the Swift URI. For example: Instead of sc.textFile("swift://notebooks.spark/2015_small.csv”), use sc.textFile("swift://notebooks.keystone/2015_small.csv”).

あと、はまりそうなのが、今までnotebookでSparkConfの設定を飛ばして書いてる場合。
アプリケーションとして実行するときはきちんとSparkConfの設定が必要です。

以下参考までに

```scala
def setConfig(name:String, settings:scala.collection.mutable.HashMap[String,String]) : SparkConf = {
    val pfx = "fs.swift.service." + name
    val i = settings.toIterator
    val conf = sc.getConf
    for(v <- i){
        conf.set(pfx + v._1,v._2)
    }
    conf.set(pfx + "auth.endpoint.prefix", "endpoints")
}
var c2 = scala.collection.mutable.HashMap[String, String](
  "auth_uri"->"",
  "global_account_auth_uri"->"",
  "username"->"aaa",
  "password"->"bbb",
  "auth_url"->"https://identity.open.softlayer.com",
  "project"->"ccc",
  "project_id"->"ddd",
  "region"->"dallas",
  "user_id"->"eee",
  "domain_id"->"fff",
  "domain_name"->"aaa",
  "filename"->"xxx.csv",
  "container"->"objectstore",
  "tenantId"->"s76f-aaa"
)
val conf = setConfig("sample",c2)
```

設定内容はご自身の環境のものに置き換えてください。