AWS EMR中Spark Step执行失败(退出码13),求问题排查
我来帮你拆解下这个问题——YARN的退出码13通常和内存资源不足、代码逻辑错误或者权限/路径问题有关,结合你的操作和代码,咱们一步步定位:
1. 先修正代码里的明显错误
你这段代码里有个容易忽略的问题:df = spark.createDataFrame(mylist, IntegerType()).show() 中,show()方法的返回值是None,不是DataFrame对象!这会导致后面执行df.write.parquet时直接抛出AttributeError,因为None没有write属性。
修正后的代码应该把show()单独调用:
from pyspark.sql.types import IntegerType mylist = [1, 2, 3, 4] df = spark.createDataFrame(mylist, IntegerType()) df.show() # 单独执行show(),不赋值给df df.write.parquet('s3://your-bucket/path/to/save', mode='overwrite')
2. 检查路径配置
你写的/path/to/save如果是本地路径,在Cluster部署模式下会有问题:Application Master运行在集群的某个节点上,本地路径仅对该节点可见,而且可能没有写入权限。推荐直接使用S3路径(格式为s3://bucket-name/xxx)或者HDFS路径(hdfs:///xxx),同时要确保:
- EMR的实例角色(EC2 Instance Profile)拥有对应S3桶的读写权限
- 如果用HDFS路径,确认路径存在且Spark有写入权限
3. 调整YARN/Spark内存参数
退出码13很常见的原因是Application Master的内存不足,你在添加Step时留空了附加参数,默认的内存配置可能无法满足需求。可以在Step的“附加参数”中添加以下配置(根据你的集群实例类型调整数值):
--conf yarn.app.mapreduce.am.resource.mb=2048 --conf spark.driver.memory=2g --conf spark.executor.memory=2g
比如如果你的集群用的是m5.xlarge实例(16G内存),可以把数值调到4G左右。
4. 查看详细日志定位问题
如果上面的调整还是没解决,你可以去EMR控制台的“步骤”页面,点击失败的步骤,查看“日志链接”,在YARN的Application Master日志里找具体的错误栈,这能帮你更精准地定位问题(比如是权限报错还是内存溢出)。
内容的提问来源于stack exchange,提问作者Thagor

