SlideShare a Scribd company logo
本当にあった
Apache Spark障害の話
株式会社サイバーエージェント 井上 ゆり
自己紹介>
井上 ゆり
株式会社サイバーエージェント
アドテク本部 AMoAd所属
twitter: @iyunoriue
GitHub: x1-
HP: バツイチとインケンのエンジニアブログ
http://x1.inkenkun.com/
2014年3月、ApacheSparkの
メジャー・バージョンがリリースされました。
1年半経った現在1.5.2がリリースされています。
公式JIRAから取得した、Sparkバージョン別のissue数です。
機能も増えていますが当然バグも増えています。
1年近くApacheSparkと付き合って、
その間に行ってきた
トラブルシューティングを
3つほどお話させて頂きます。
その前に・・・
Spark環境と用途
• Sparkクラスタ : N十台, オンプレ
• Sparkクラスタ化: zookeeper + Mesos
• SparkノードのFS: HDFS-HA + GCS + S3
• GUI : Apache Zeppelin, iPython
• 開発言語 : scala
• ジョブのビルド : sbt
• 用途 : 定常ジョブ(cron実行)
アドホック分析
Sparkのバージョンを1.4.0から1.5.1に
アップグレードしたら、HDFS-HAでエラー
case.1
case.1 Spark1.5系&HDFS-HAでエラー
Sparkクラスタを1.4.0から1.5.1へバージョンアップしたと
ころ、ジョブがfailするようになりました。
NameNodeが解決できていないようなエラーメッセージです。
※nameservice1はHDFS-HAクラスタに設定した論理サービス名です。
内容
15/10/21 15:22:12 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, spark003.example.com):
java.lang.IllegalArgumentException: java.net.UnknownHostException: nameservice1
at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:374)
at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:312)
at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:178)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:665)
at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:601)
:
case.1 Spark1.5系&HDFS-HAでエラー
• HDFSのHighAvailabilityを無効にすると正常に終了します。
• また、クラスタのバージョンを1.4系に戻すと正常に終了し
ます。
• JIRAにバグ報告するものの、HDFSの設定ファイルを見なおせ
とのこと。
SPARK-11227: Spark1.5+ HDFS HA mode throw
java.net.UnknownHostException: nameservice1
https://issues.apache.org/jira/browse/SPARK-11227
Try
case.1 Spark1.5系&HDFS-HAでエラー
• Apache Zeppelinで同じ内容を実行すると正常終了す
るので差異を調べました。
• Zeppelinで使われているSQLContextはHiveContext。
• 私たちが使っていたSQLContextはデフォルトの
SQLContext。
どうやらHiveContextが鍵のようです。
原因
case.1 Spark1.5系&HDFS-HAでエラー
• SQLContextではなくHiveContextを使うと、
NameNodeの名前解決ができました。
• デフォルトのSQLContextの使用をやめて、
HiveContextを使うようにしました。
解決
implicit val sqlContext = new HiveContext( sc )
executorからの応答がなくなる
case.2
case.2 executorからの応答がなくなる
Sparkでジョブを実行すると、タスクはdriverによって複数
個に分割されてexecutorで実行されます。
内容
分割タスクが完了するとexecutorはdriverにレスポンスを返
します。
driver
executor
executor
executor
driver
タスク 結果
case.2 executorからの応答がなくなる
ところが、GCなどのためにいつまで待ってもレスポンスを返
さないexecutorがたまにいます。
内容
driverは全てのexecutorのレスポンスを待ち受けるので(fail
しない限り)、半永久的にジョブが完了しません。
driver
executor
executor
executor
driver
タスク 結果
a a
case.2 executorからの応答がなくなる
• 完了しないジョブがSparkクラスタ内のメモリ資源を確保し続け
てしまいました。
• 別のジョブが開始されると、クラスタ内のメモリ解放を待ち続
けるという負の待ち行列が発生してしまいました。
問題
ジョブAが確保したメモリ 空きメモリ
ジョブBが必要なメモリ
クラスタの総メモリ
不足!
メモリに空きができるまで待つ
ジョブCが必要なメモリ
case.2 executorからの応答がなくなる
•spark.network.timeout: 120s
spark.network.timeoutに設定した値は、ほとんど全ての通信系タ
イムアウト(下記)のデフォルト値になります。
* spark.core.connection.ack.wait.timeout
* spark.akka.timeout
* spark.storage.blockManagerSlaveTimeoutMs
* spark.shuffle.io.connectionTimeout
* spark.rpc.askTimeout
* spark.rpc.lookupTimeout
Try
まずはタイムアウト関連の設定を見直しました。
case.2 executorからの応答がなくなる
•spark.dynamicAllocation.executorIdleTimeout: 60s
ダイナミック・アロケーションが有効な場合のexecutorのアイドル
時間です。
※ダイナミック・アロケーションを有効にしていないので関係あり
ませんでした。
Try
タイムアウトの設定ではなさそうです。
その他のタイムアウト設定。
case.2 executorからの応答がなくなる
遅延タスクを再起動するspark.speculationを設定しました。
spark.speculationがtrueに設定されていると、遅いタスクの
再起動を実施します。
※DatabicksのMatei Zahariaがここ↓で回答しているように、stragglersをkill
するような仕組みはないようです。
http://apache-spark-user-list.1001560.n3.nabble.com/Does-Spark-always-wait-for-
stragglers-to-finish-running-td14298.html
解決.1
spark.speculation true
spark.speculation.multiplier 1.5
spark.speculation.quantile 0
case.2 executorからの応答がなくなる
更に、OSのtimeoutコマンドで終了しないジョブを強
制タイムアウトさせました。
タスクの強制再起動で予想外に時間がかかってしまっ
たジョブは、強制終了させます。
解決.2
timeout 600 $SPARK_HOME/bin/spark-submit job.jar
CIツール(Jenkins)でジョブの
sbtテストがfailする
case.3
case. ジョブのsbtテストがfailする
各テスト内でSparkコンテキストを生成してテストを実施し
ていました。
内容
sc = new SparkContext( conf )
val rdd = sc.parallelize( Seq( 1, 2 ) ).map( id =>
Row( id, 0d, "", "http://example.com/" )
)
val df = sqlContext.createDataFrame( rdd, schema )
case. ジョブのsbtテストがfailする
• sbt>=0.10.0からタスクの並列実行機能が入ったた
め。
• SparkContextは1つのJVMプロセスで複数生成できな
い。
SPARK-2243: Support multiple SparkContexts in the same JVM
https://issues.apache.org/jira/browse/SPARK-2243
原因
case. ジョブのsbtテストがfailする
• テスト実行時のタスク並列実行をやめました。
• build.sbtに下記を追加したところ、正常に実行さ
れるように・・・!
解決
parallelExecution in Test := false
まとめ
solv 1.
Spark1.5系ではHiveContextを使ったほうが幸せ
solv 2.
executorから応答がなくなって困ったときは
spark.speculationを使おう
timeout付きでジョブを実行すると安心
solv 3.
sbt testの前にparallelExecutionの設定を!

More Related Content

PDF
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
PDF
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PPTX
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
PPT
Visual Studioでテストデータを作ろう
PPTX
Amazon EKS によるスマホゲームのバックエンド運用事例
PDF
PlaySQLAlchemy: SQLAlchemy入門
Apache Sparkにおけるメモリ - アプリケーションを落とさないメモリ設計手法 -
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
爆速クエリエンジン”Presto”を使いたくなる話
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
Visual Studioでテストデータを作ろう
Amazon EKS によるスマホゲームのバックエンド運用事例
PlaySQLAlchemy: SQLAlchemy入門

What's hot (20)

PDF
これからのJDK/JVM 何を選ぶ?どう選ぶ?
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
PDF
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
PPTX
Azure API Management 俺的マニュアル
PPTX
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
PDF
単なるキャッシュじゃないよ!?infinispanの紹介
PDF
Elasticsearchを使うときの注意点 公開用スライド
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
PDF
ストリーム処理を支えるキューイングシステムの選び方
PPTX
Kafkaを活用するためのストリーム処理の基本
PDF
Unified JVM Logging
PPTX
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
PDF
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
PDF
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
PDF
WebSocket / WebRTCの技術紹介
PDF
Drone.io のご紹介
PPTX
Amazon Athena で実現する データ分析の広がり
PPTX
MongoDBが遅いときの切り分け方法
これからのJDK/JVM 何を選ぶ?どう選ぶ?
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Azure API Management 俺的マニュアル
Apache Sparkの基本と最新バージョン3.2のアップデート(Open Source Conference 2021 Online/Fukuoka ...
単なるキャッシュじゃないよ!?infinispanの紹介
Elasticsearchを使うときの注意点 公開用スライド
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(前編)
ストリーム処理を支えるキューイングシステムの選び方
Kafkaを活用するためのストリーム処理の基本
Unified JVM Logging
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
PacemakerのMaster/Slave構成の基本と事例紹介(DRBD、PostgreSQLレプリケーション) @Open Source Confer...
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
【de:code 2020】 Azure Synapse Analytics 技術編 ~ 最新の統合分析プラットフォームによる新しい価値の創出(後編)
WebSocket / WebRTCの技術紹介
Drone.io のご紹介
Amazon Athena で実現する データ分析の広がり
MongoDBが遅いときの切り分け方法
Ad

More from x1 ichi (10)

PDF
リアルタイムにデータ分析してWebサービスの面白さを伝えたい
PDF
逆引き!Scala x ビッグデータ
PDF
競馬の格言を地方競馬で検証してみた
PDF
あなたのScalaを爆速にする7つの方法(日本語版)
PDF
あなたのScalaを爆速にする7つの方法
PDF
MillWheel Fault-Tolerant Stream Processing at Internet Scaleの意訳
PDF
広告配信現場で使うSpark機械学習
PDF
女性エンジニアの1週間
PDF
Sparkを用いたビッグデータ解析 〜 前編 〜
PDF
解説: a semantic approach to recommending text advertisements for images
リアルタイムにデータ分析してWebサービスの面白さを伝えたい
逆引き!Scala x ビッグデータ
競馬の格言を地方競馬で検証してみた
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法
MillWheel Fault-Tolerant Stream Processing at Internet Scaleの意訳
広告配信現場で使うSpark機械学習
女性エンジニアの1週間
Sparkを用いたビッグデータ解析 〜 前編 〜
解説: a semantic approach to recommending text advertisements for images
Ad

本当にあったApache Spark障害の話