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

解决的办法是在数个阶段后坚持数据。这将启动一个新的执行计划,并且不会增加现有的计划,使其变得越来越大,并且耗尽内存。