我有一个典型的批处理作业,它从云存储中读取CSV,然后进行一堆连接和聚合,整个文件不超过3G。但是在将结果写回到存储时,我总是收到OOM异常,我有两个执行器,每个执行器都有80G的RAM,这没有任何意义,这是我的Spark UI和异常的屏幕截图。并且建议,如果我的代码在内存方面是超级次优的,为什么它不显示在spark UI上?
更新:源代码太复杂了,无法在此处显示,但是我发现根本原因是多重连接。
Dataset<Row> ret = something dataframe
for (String cmd : cmds) {
ret = ret.join(processDataset(ret, cmd), "primary_key")
}
因此,每个processDataset(ret,cmd),如果自己运行,速度都非常快,但是如果您多次进行这种for循环联接,例如10或20次,它将得到很多慢得多,并出现OOM问题。
答案 0 :(得分:1)
当我的内存有问题时,请检查以下内容:
total-executor-cores
和SparkSession中的spark.executor.core
定义)spark.executor.core
)多得多spark.executor.memory
)添加记忆力driver-memory
).config("spark.sql.shuffle.partitions", numPartitionsShuffle)
)explain
来分析执行计划