0

我有一個運行sql連接的spark任務。java.lang.OutOfMemoryError具有更多階段的Spark DAG

我想象了DAG,它每創建一個+5個階段。無論如何,在DAG大約有40個階段之後,下一個步驟總是失敗,除了8次迭代之後,每個階段都有5個階段。在螺紋

異常 「主」 java.lang.OutOfMemoryError在 java.lang.AbstractStringBuilder.hugeCapacity(AbstractStringBuilder.java:161) 在 java.lang.AbstractStringBuilder.newCapacity(AbstractStringBuilder.java:155) 在 java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125) 在 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) 在java.lang.StringBuilder.append(StringBuilder.java:136)在 java.lang.StringBuilder.append(StringBuilder.java:131)at scala.StringContext.standardInterpolator(StringContext.scala:125)at scala.StringContext.s(StringContext.scala:95)at org.apache.spark.sql.execution.QueryExecution.toString(QueryExecution.scala:230) at org.apache.spark.sql.execution.SQLExecution $ .withNewExecutionId(SQLExecution.scala:54) 在 org.apache.spark.sql.Dataset.withNewExecutionId(Dataset.scala:2788) 在 org.apache。 spark.sql.Dataset.org $ apache $ spark $ sql $ Dataset $$執行$ 1(Dataset.scala:2385) at org.apache.spark.sql.Dataset.org $ apache $ spark $ sql $ Dataset $$收集(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) 在 融爲一體。 samsung.cloud.mopay.linking.txn.TxnLinking.performTxnLinking(TxnLinking.java:26) at com.samsung.cloud.mopay.linking.Linking.processData(Linking.java:199) at com.samsung.cloud .mopay.linking.Linking.main(Linking.java:72)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(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

解決的辦法是在數個階段後堅持數據。這將啓動一個新的執行計劃,並且不會增加現有的計劃,使其變得越來越大,並且耗盡內存。