Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

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

ログ調査

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?