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
VCAPファイルを作成
vcap.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のダッシュボードのメニューからサービス資格情報で取得できます。
下記の図のところから取得可能
作ったSparkのアプリケーションの実行
/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のアップロードが始まるのでしばし待つ。
数回ポーリングし終わると、stderrとstdoutのダウンロードを勝手にやってくれて終わり。
job may still be runnningという文言でて終わってます。
statusを取得したい場合はこちら的なメッセージも一緒に吐いてくれてる
実行中のアプリケーションのstatus取得
下記を実行
./spark-submit.sh --status driver-20160421045627-0000-6fa7a1db-b58a-4bbf-a277-81bb8d25b0f7 --vcap ./vcap.json --master https://169.54.219.20
bluemixのダッシュボードとかの画面も確認して見たけれども、特に実行中のアプリケーションに関する情報は表示されない模様・・・え”、コマンド毎回叩くの??
アプリケーションの終了
終了する場合はkillする
./spark-submit.sh --kill driver-20160421045627-0000-6fa7a1db-b58a-4bbf-a277-81bb8d25b0f7 --vcap ./vcap.json --master https://169.54.219.20
kill後、再度statusを確認するとちゃんとKILLEDになってる
ファイル周り
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の設定が必要です。
以下参考までに
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)
設定内容はご自身の環境のものに置き換えてください。