如何克服spark java.lang.OutOfMemoryError:Java堆空间和java.lang.OutOfMemoryError:GC开销限制超出问题?

问题描述 投票:0回答:1

我正在尝试联接操作,这里表 1 有 3 GB 的数据,表 2 有 120 GB 的数据。为了避免随机播放表 1。

执行时出现以下错误: 引起原因:java.lang.OutOfMemoryError:Java堆空间 java.lang.OutOfMemoryError:超出 GC 开销限制

我使用的 Spark 配置:

--executor-memory 18g
--conf spark.sql.autoBroadcastJoinThreshold=3221225472
--conf spark.driver.maxResultSize=0 --executor-cores 4
--conf spark.reducer.maxReqsInFlight=1
--conf spark.shuffle.useOldFetchProtocol=true
--conf spark.shuffle.io.retryWait=60s
--conf spark.shuffle.io.maxRetries=10
--conf spark.network.timeout=800
--conf spark.driver.memory=16g
--conf spark.executor.memoryOverhead=2g
--conf spark.reducer.maxSizeInFlight=128m
--conf spark.maxRemoteBlockSizeFetchToMem=256m
--conf spark.dynamicAllocation.maxExecutors=600
--conf "spark.executor.extraJavaOptions=-XX:MaxDirectMemorySize=2048m"
--conf spark.sql.shuffle.partitions=6000
--conf spark.shuffle.compress=true
--conf spark.io.compression.codec=zstd
--conf spark.io.compression.zstd.level=2

我尝试增加执行程序内存、驱动程序内存和分区,但仍然面临同样的问题。

apache-spark pyspark apache-spark-sql hive spark-streaming
1个回答
0
投票

如果增加执行程序内存、驱动程序内存和分区未能解决问题,您可能需要考虑优化代码以减少操作所需的内存量。在这里您可以尝试实施这些建议:

  1. 使用更高效的联接算法:根据数据分布和联接条件,使用不同的联接算法(例如广播联接、排序合并联接或分桶哈希联接)可能会更高效并且需要更少的内存。

  2. 减少数据大小:如果可能,请在执行连接之前过滤掉不必要的列或行来尝试减少数据大小。

  3. 使用更高效的数据格式:根据数据格式,使用更高效的格式(例如 Parquet 或 ORC)可能会减少操作所需的内存量。

  4. 增加执行器的数量:如果您有足够的资源,增加执行器的数量可能有助于分配工作负载并减少每个执行器的内存需求。 希望它能有所帮助:-)

© www.soinside.com 2019 - 2024. All rights reserved.