Spark on EMR(YARN)の個人的Tips


目的

Sparkアプリを動かしてきた中でハマったところをまとめます。
(随時追加予定)

とりあえず動かす

Scala版のSpark Jarの最小限の構成
http://qiita.com/uryyyyyyy/items/a4524e87537e3a8bb745

Spark2.0をEMRで試す
http://qiita.com/uryyyyyyy/items/15f2e8f153aa86375227

YARN上でジョブを走らせてみる(Spark編)
http://qiita.com/uryyyyyyy/items/72624c7b1e9d021d9ee0

Scala2.11のPre defとかでClassNotFound

Spark-assemblyのScalaバージョンと、自身が作ったSparkアプリのScalaバージョンが違う。

Scala2.11を使いたい場合は、こちらの記事を参考に、Scala2.11ビルド版の spark.yarn.jar を指定しましょう。

Key毎に異なるファイルを出力したい。

参考:
http://qiita.com/uryyyyyyy/items/d49ef0ab4eb25d52c43c

MapでSerializeエラーで怒られる

(Sparkに限らないですが、、)

mapValuesを使っている場合、それがシリアライズされてない。

こちらのissueを参照
https://issues.scala-lang.org/browse/SI-7005

(Scala2.11でもまだ治ってないぽい。)

hoge.mapValues().map(identity)

などmapを一度噛ませればいけた。

リソースを使いまわしたい。

例えば外部コネクションなど(本来はmap/reduce処理ですべきではないのだが、、)を使いたい場合、Driver上でインスタンスを作ってしまうと、それを各ExecutorにbroadCastすることになり、Seriarizableでないと怒られたり、コネクション使いまわして変なところで怒られる危険性がある。
そこで、それぞれのExecutor上で作るようにしてあげる必要がある。

参考:
http://qiita.com/uryyyyyyy/items/d59f34ce9e9f6e98329d

環境変数を使いたい。

参考;
http://qiita.com/uryyyyyyy/items/d64f131619eb0e1de195

sparkアプリ内のジョブを並列に実行する。

(map/reduce内でやるのは良くないと知りつつも)外部リソースにアクセスするなどが必要になった場合、それのIO Waitを有効に使いたいので、その間に他のJobも並列で走らせたいなどの需要がある。

参考:
http://qiita.com/uryyyyyyy/items/512e3bd0bdab7223578d

Driverで取得したデータをbroadcastする。

Sparkのプログラミング作法として、Driverで共通データの準備とRDD、DAGの生成を行って、Executorに処理をお願いすることになる。

受け渡す方法は、sc.broadcastを使って明示的に渡すか、valで用意したデータを暗黙に渡すことも出来る。

明示Ver.
val masterData = sc.broadcast(fetchMasterData())

rdd.map(v => somelogic(v, masterData.value))
暗黙Ver.
val masterData = fetchMasterData()

rdd.map(v => somelogic(v, masterData))

EMRからS3を操作する。

参考:
http://qiita.com/uryyyyyyy/items/19773e3263711646ceb3

ローカルからS3を操作する。

参考:
http://qiita.com/uryyyyyyy/items/b1f7a9fea928e1003602

Spark WebUIで色々なデータをチェックする。

TODO

Sparkでのリトライの作法

基本的には冪等に作るべし
どうしても冪等にならなそうな場合は、影響を局所化すべし。
Sparkのリトライはプログラムからは当てにしないのが吉。

例外の吐かれる場所

collect forEachなどが走るタイミングで例外が吐かれる。
それまでの処理は遅延で処理される。

ログ設定をする。

参考:
http://qiita.com/uryyyyyyy/items/0f5026ffa998c1bac9c7

Java8対応のbootstrap

参考:
http://qiita.com/uryyyyyyy/items/e9ec40a8c748d82d4bc4

また、Stepの追加を受け入れられるようにするには一工夫必要。

EMRのメモリ・コア割り当て

EMRでのSparkに割り当てられるメモリ・コアの上限メモ
http://qiita.com/uryyyyyyy/items/5cc7fa8957ad5953f111

ログ調査