0

SQLジョインを実行するスパークジョブがあります。java.lang.OutOfMemoryErrorスパークDAGのステージ数が多い

私はDAGを視覚化し、結合ごとに+5段階を作成します。いずれにせよ、DAGが約40ステージを有するステージの後では、次のステップは常に例外を伴い、すなわちそれぞれ5ステージの8回の反復の後で失敗する。

java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:155)でのスレッドの例外 "メイン" java.lang.OutOfMemoryErrorを でjava.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:161) でjava.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125) java.lang.AbstractStringBuilder.append java.lang.StringBuilder.appendで(AbstractStringBuilder.java:448) (StringBuilder.java:136)で にあるjava.lang.StringBuilder.append(StringBuilder.java:131) (StringContext.scala:95) org.apache.spark.sql.execution.QueryExecution.toString(QueryExecution.scala:230)の org.apache.spark.sql.execution.SQLExecution $ .withNewExecutionId(SQLExecution.scala:54): org.apacheで org.apache.spark.sql.Dataset.withNewExecutionId(2788 Dataset.scala)で 。 spark.sql.Dataset.org $ apache $ spark $ sql $データセット$$が$ 1を実行する(Dataset.scala:2385) を に設定するorg.apache.spark.sql.Dataset.org $ apache $ spark $ sql $ Dataset $$ collect(Dataset.scala:2392) at org.apache.spark.sql.Dataset $$ anonfun $ count $ 1.apply(Dataset.scal a:2420) at org.apache.spark.sql.Dataset $$ anonfun $ count $ 1.apply(Dataset.scala:2419) at org.apache.spark.sql.Dataset.withCallback(Dataset.scala:2801) ) org.apache.spark.sql.Dataset.count(Dataset.scala時:2419) com.samsung.cloud.mopay.linking.controller.PostNotificLinkController.linkPostNotific(PostNotificLinkController.java:51) で コムで。 (ting)。 .mopay.linking.Linking.main(Linking.java:72)at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)at sun.reflect.NativeMethodAccessorImpl.invoke sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invokeで で(NativeMethodAccessorImpl.java:62) (Method.java:498) org.apache.spark.deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ SparkSubmit $$ runMain(SparkSubmit.scala:743) at org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit .scala:187) at org.apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:212) at org.apache.spark.deploy.SparkSubmit $ .main(SparkSubmit.scala:126) at org .apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

私は、ノードあたり

--conf spark.driver.memory=30g 
--conf spark.yarn.driver.memoryOverhead=15g 
--conf spark.executor.memory=10g 
--conf spark.yarn.executor.memoryOverhead=6g 
--conf spark.executor.cores=5 

3インスタンス(R3と火花を実行しています。2xlarge)=> 12のエグゼキュータインスタンス

答えて

-1

私はあなたにいくつかのアイデアを与えることができます。

データセットの大きさ、パーティションの大きさ/パーティションの数はどれくらいですか?より多くの/より小さいパーティションを使用するようにしてください。デフォルトのspark.default.parallelism/spark.sql.shuffle.partitionsは何ですか?

おそらくあなたのデータセットにホットスポットがありますか?結合されたデータセットに多数のレコードを持つキーがありますか?あなたはあなたのデータを分析し、関係するすべてのオペランドといくつかの統計情報を収集し、それぞれの上位の結合キーを上位にする必要があります(結合によってデータが増えます)。

詳細をご提供いただければ、私はより教育的な推測をお伝えします。

+0

これは、データ量や並列性とあまり関係ありません。作成されたクエリの実行計画が大きすぎてメモリに収まらないように見えます。 –

+1

あなたは正しいです、私の悪い、私は全体のスタックトレースに注意を払っていませんでした。まあ、最初に私はそれを見て、あなたは多くのことをやっていなければなりません...その場合、複数のステップで処理を分割し、中間データセットをチェックポイントするなどして系統を破壊しようとします。 – Traian

0

解決策は、数段階の後にデータを保持することでした。これにより、新しい実行計画が開始され、既存の計画には追加されず、計画が大きくなってメモリがなくなります。

関連する問題