配置Spark事件日志到S3后Streaming作业因退出码134失败
Spark Streaming作业Executor退出码134问题分析与解决
环境信息
- EMR版本:emr-5.30.0
- Spark版本:2.4.5
- Hadoop版本:2.8.5
问题原因
退出码134对应进程收到SIGABRT信号,通常由JNI层面崩溃或内存异常引发,这里的核心诱因是手动复制的AWS SDK和hadoop-aws.jar与EMR集群原生依赖版本不兼容。
EMR的Spark、Hadoop组件已预集成适配当前版本的AWS相关依赖,手动将aws-java-sdk-core、aws-java-sdk-s3、hadoop-aws.jar复制到Spark jars目录后,打破了集群原生的依赖一致性。普通Spark作业或PyShell因生命周期短、与S3交互频率低,暂时未触发冲突;但Streaming作业持续运行,会频繁和S3进行事件日志读写操作,版本冲突直接触发JNI崩溃,导致Executor容器被终止。
解决方法
- 移除手动添加的jar包:删除复制到Spark jars目录的
aws-java-sdk-core、aws-java-sdk-s3、hadoop-aws.jar文件,恢复集群原生依赖环境。 - 重新配置S3事件日志:仅通过
spark-defaults.conf完成配置即可,无需额外添加jar包:- 编辑
/etc/spark/conf/spark-defaults.conf,添加或修改以下参数:spark.eventLog.enabled=true spark.eventLog.dir=s3a://你的存储桶路径/ # 若实例角色未覆盖S3权限,可添加: # spark.hadoop.fs.s3a.access.key=你的AK # spark.hadoop.fs.s3a.secret.key=你的SK - 重启Spark历史服务器:
sudo stop spark-history-server sudo start spark-history-server
- 编辑
- 依赖管理规范:后续如需调整AWS相关依赖,不要手动复制jar包,应通过EMR集群的配置分类(如
spark-defaults或hadoop-env)进行参数指定,确保依赖版本与集群原生组件兼容。
内容的提问来源于stack exchange,提问作者Ritik Kaushik
相关产品推荐
相关产品推荐

