Azure Databricks配置报错:堆内存超出节点最大Executor内存
问题背景
将扁平化JSON文件保存到Azure Blob为CSV时,持续触发org.apache.spark.SparkException: Job aborted错误。尝试增大Executor内存时,遇到节点限制报错:指定堆内存(4096MB)超过Standard_F4节点类型允许的最大Executor内存(3157MB)。
补充错误堆栈:
ERROR FileFormatWriter: Aborting job 0d8c01f9-9ff3-4297-b677-401355dca6c4.
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 79.0 failed 4 times, most recent failure: Lost task 0.3 in stage 79.0 (TID 236) (10.139.64.7 executor 15): ExecutorLostFailure (executor 15 exited caused by one of the running tasks) Reason: Command exited with code 52
Driver stacktrace:
at org.apache.spark.scheduler.DAGScheduler.failJobAndIndependentStages(DAGScheduler.scala:3312)
at org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2(DAGScheduler.scala:3244)
at org.apache.spark.scheduler.DAGScheduler.$anonfun$abortStage$2$adapted(DAGScheduler.scala:3235)
已尝试使用/不使用coalesce保存数据框,均无效。
解决方案
1. 合规配置Executor内存参数
严格遵循Standard_F4节点的内存限制,调整以下Spark配置:
- 设置
spark.executor.memory为3072MB(比最大限制3157MB留足余量) - 配套设置
spark.executor.cores为2(Standard_F4共4核,每个Executor分配2核,可同时运行2个Executor) - 可选配置
spark.executor.memoryOverhead为256MB(手动设置避免默认值波动导致内存溢出)
2. 优化数据写入逻辑
- 替换
coalesce为repartition:coalesce是窄依赖,易造成单Task数据量过载;repartition会重新洗牌数据,均匀分配到多个Task,降低单Task内存压力 - 启用分区写入:按数据中的维度字段(如日期、类别)分区,减少单个CSV文件的大小,示例代码:
df.write.partitionBy("date").mode("overwrite").csv("wasbs://container@storageaccount.blob.core.windows.net/target-path") - 限制单文件记录数:通过配置
spark.sql.files.maxRecordsPerFile控制每个CSV文件的记录数,避免文件过大触发错误码52(对应LinuxSIGXFSZ文件大小超限):spark.conf.set("spark.sql.files.maxRecordsPerFile", 100000)
3. 简化扁平化数据结构
检查JSON扁平化逻辑,移除不必要的冗余字段,仅保留CSV需要的列,减少单条记录的数据体积:
// 示例:只保留需要的字段 val simplifiedDf = flattenedDf.select("id", "name", "date", "value")
4. 排查Driver内存压力
如果Driver端出现内存不足,可设置spark.driver.memory为4096MB(Standard_F4节点的Driver内存上限通常高于Executor)
内容的提问来源于stack exchange,提问作者Alex K

