PySpark以退出码52失败:Amazon EMR集群任务执行异常求助
我之前在AWS EMR上跑PySpark任务时,也碰到过和你几乎一模一样的Lost task问题!结合你的场景,咱们来梳理下最可能的原因和解决办法:
你看到的WARN TaskSetManager: Lost task错误,核心是Executor节点在执行任务时崩溃,或者和Driver节点失联了。尤其是你调用take()/first()/collect()这类触发Spark Action的操作时,会触发任务执行,很容易暴露集群配置或数据本身的问题。
1. Executor内存配置不足(最常见)
你给Driver分配了10G内存,但完全没设置Executor的资源参数!EMR默认的Executor配置通常很小,处理数据时很容易因为内存溢出(OOM)导致任务直接崩掉。
- 解决办法:在
spark-submit命令里补充Executor相关参数,根据你的集群实例类型调整数值,比如:
举个例子,如果用的是m5.xlarge实例,给每个Executor分配8G内存、4个核心是比较合理的配置。spark-submit --master yarn --driver-memory 10g --executor-memory 8g --executor-cores 4 --num-executors 5 convert.py
2. Python版本不兼容
你的脚本基于Python 3.4运行,但EMR集群默认的Python环境可能是2.x版本(尤其是老版本EMR),这会导致PySpark在Executor端执行Python代码时出现兼容性错误,直接丢任务。
- 解决办法:
- 提交命令里直接指定Python3的路径:
spark-submit --master yarn --driver-memory 10g --conf spark.pyspark.python=/usr/bin/python3 convert.py - 如果是长期使用,建议创建EMR集群时就选择支持Python3的版本(比如EMR 5.10+以上,默认自带Python3环境)。
- 提交命令里直接指定Python3的路径:
3. 数据倾斜导致单任务过载
如果你的源文本文件里存在数据倾斜(比如某几个Key对应的数据量特别大),take()/collect()这类操作会让单个Executor承担远超负载的计算量,直接被YARN Kill掉。
- 解决办法:
- 先快速排查数据分布:可以用
rdd.countByKey()(注意仅在数据量不大时用)查看是否有异常大的Key; - 对倾斜的Key做拆分处理,比如给Key加盐拆分分区,或者先过滤掉异常大的数据集再做测试。
- 先快速排查数据分布:可以用
4. YARN容器资源限制
EMR的YARN配置里,容器的内存上限可能比你设置的Executor内存小,导致YARN直接杀掉超出限制的Executor容器。
- 解决办法:
- 登录EMR主节点,检查
/etc/hadoop/conf/yarn-site.xml里的yarn.nodemanager.resource.memory-mb和yarn.scheduler.maximum-allocation-mb参数,确保它们大于你设置的--executor-memory; - 如果是集群创建时没配置,下次创建集群可以通过Bootstrap脚本提前调整这些YARN参数。
- 登录EMR主节点,检查
最后提醒下:一定要看完整的错误日志!EMR控制台的「集群详情」→「步骤」里,点击对应的Spark步骤就能查看详细日志,或者在主节点用yarn logs -applicationId <你的应用ID>命令拉取日志,里面会有更具体的报错原因(比如OOM的堆栈、Python版本不匹配的提示),能帮你更快定位问题。
内容的提问来源于stack exchange,提问作者Vlad

