Spark 2.2.0本地正常但EMR环境运行报错问题咨询
我之前在EMR上跑同版本的Spark任务时,也碰到过类似的org.apache.spark.SparkException: Job aborted异常,尤其是涉及到文件读写的场景(也就是你提到的FileFormatWriter相关报错)。结合踩过的坑,给你梳理几个常见的排查方向和解决办法:
权限配置问题
本地环境的文件系统权限和EMR的HDFS/S3完全不是一回事。如果你的任务要写入HDFS或者S3,先检查:- 集群的IAM角色是否有对应存储的读写权限(比如S3的
s3:PutObject、s3:DeleteObject权限); - HDFS目标目录的权限是否允许Spark用户写入,可以用命令
hdfs dfs -ls /your/output/path查看,必要时用hdfs dfs -chmod调整权限。
- 集群的IAM角色是否有对应存储的读写权限(比如S3的
输出路径已存在
Spark默认不允许写入已存在的路径,本地测试时可能你手动清理过,但EMR上容易忽略这点。解决办法很简单:
在写数据的代码里加上mode("overwrite"),比如:df.write.mode("overwrite").parquet("s3://your-bucket/output")要是涉及分区表,还可以配置
spark.sql.sources.partitionOverwriteMode=dynamic来只覆盖更新的分区。集群资源不足
EMR集群的executor内存、CPU不够时,很容易导致任务中途失败。你可以:- 登录EMR的YARN UI(集群控制台里能找到链接),查看失败任务的日志,看是否有
OutOfMemoryError之类的报错; - 调整提交任务的参数,比如增加executor内存和数量:
spark-submit --executor-memory 4G --num-executors 6 --executor-cores 2 your-app.jar- 登录EMR的YARN UI(集群控制台里能找到链接),查看失败任务的日志,看是否有
数据格式或兼容性问题
本地用本地文件系统,EMR用分布式存储,某些文件格式的细节容易踩坑:- 比如CSV文件的编码、分隔符不一致,导致读取解析失败;
- Parquet文件的版本兼容问题,本地生成的Parquet在EMR上读取异常。
建议在读写数据时明确指定格式参数,比如读取CSV时加上option("header", "true")、option("encoding", "UTF-8")。
依赖缺失
本地开发环境可能有额外的依赖包(比如自定义UDF的jar、特定数据源的驱动),但EMR集群上默认没有。提交任务时要把依赖带上,用--jars指定本地jar包,或者--packages从Maven仓库拉取:spark-submit --jars /path/to/your-dependency.jar your-app.jar
最后提醒一句:你给出的异常栈是截断的,真正的根因藏在Caused by:部分里。一定要去EMR的YARN日志或者Spark任务日志里找完整的异常信息,这能帮你快速定位问题!
内容的提问来源于stack exchange,提问作者Nirav Shah

