EMR集群Spark Submit任务失败:节点丢失致容器释放(大数据场景)
问题分析与解决方案
核心问题定位
报错中的Exit status: -100是YARN容器因节点资源耗尽或节点被标记为丢失导致的终止,结合Authorized committer failed; but task commit success,本质是节点丢失时Spark的S3提交机制出现一致性问题,同时动态资源分配的不合理配置加剧了节点不稳定。
针对性解决方案
1. 调整YARN与节点稳定性配置
- 禁用
maximizeResourceAllocation:该配置会强制Executor占用节点全部资源,极易触发YARN因资源耗尽杀容器,替换为手动配置合理资源:'--conf', 'maximizeResourceAllocation=false', '--conf', 'spark.executor.memory=12G', # 预留20%内存给YARN和系统进程 '--conf', 'spark.executor.cores=3', '--conf', 'spark.yarn.executor.memoryOverhead=2G', # 增加堆外内存,避免OOM触发节点标记丢失 - 恢复任务重试机制:原配置
spark.yarn.maxAppAttempts=1直接放弃重试,改为允许合理次数的故障恢复:'--conf', 'spark.yarn.maxAppAttempts=3', '--conf', 'spark.task.maxFailures=4', # 允许单个任务重试,避免节点单次故障导致Stage失败
2. 优化S3写入的提交机制
Spark 3.5默认S3提交器在节点丢失时易出现提交状态不一致,改用EMR优化的专用提交器提升容错:
'--conf', 'spark.hadoop.fs.s3a.committer.name=emr', '--conf', 'spark.hadoop.fs.s3a.committer.staging.conflict-mode=replace', '--conf', 'spark.hadoop.fs.s3a.committer.magic.enabled=true'
3. 数据分区与写入逻辑优化
- 避免
repartition与partitionBy的无效洗牌:当前先全局repartition再按TEXT_ID_END_DATE分区,会导致大量数据重复洗牌,改为按分区键+companyId分区,减少数据倾斜:Dataset rowDataset = transformedDataWithTextId.toDF(TEXT_ID_END_DATE, DATA) .repartition(jobParams.getPartitions(), functions.col(TEXT_ID_END_DATE), functions.col("companyId")); - 开启自适应小文件合并:降低S3写入IO压力,同时减少节点负载:
'--conf', 'spark.sql.adaptive.enabled=true', '--conf', 'spark.sql.adaptive.coalescePartitions.enabled=true', '--conf', 'spark.sql.adaptive.advisoryPartitionSizeInBytes=128m'
4. 动态资源分配参数调优
动态分配在节点不稳定时易频繁增减Executor,加剧节点资源竞争,调整参数:
'--conf', 'spark.dynamicAllocation.enabled=true', '--conf', 'spark.dynamicAllocation.minExecutors=20', # 提高最小Executor数,避免频繁启动销毁 '--conf', 'spark.dynamicAllocation.maxExecutors=150', # 降低最大数,减少节点资源过载 '--conf', 'spark.dynamicAllocation.executorIdleTimeout=300s', # 延长空闲超时,减少Executor波动
验证步骤
- 用小数据量验证调整后的资源配置、提交器逻辑是否正常运行
- 逐步放大数据量,通过EMR控制台监控YARN节点的CPU、内存负载
- 若仍出现节点丢失,检查集群节点健康状态,替换故障节点或升级节点规格
内容的提问来源于stack exchange,提问作者Shaik Yasmeen
相关产品推荐
相关产品推荐

