目的
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で用意したデータを暗黙に渡すことも出来る。
val masterData = sc.broadcast(fetchMasterData())
rdd.map(v => somelogic(v, masterData.value))
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
ログ調査