在Amazon EMR上为Spark配置spark-deep-learning外部Jar遇初始化错误求助
解决EMR集群启用spark-deep-learning时的SparkContext初始化错误
我之前在EMR集群上配置spark-deep-learning做图片并行处理时也踩过类似的坑,结合你的情况(Python 2.7),给你几个针对性的排查和解决步骤:
1. 先确认版本兼容性(最容易踩的坑)
spark-deep-learning对Spark、Scala和Python版本有严格要求:
- 你用Python2.7,说明只能用EMR 5.x系列集群(EMR 6.x开始默认放弃Python2.7支持),对应的Spark版本一般是2.4.x,Scala版本是2.11。
- 要匹配spark-deep-learning的版本,比如
spark-deep-learning_2.11-1.5.0是适配Spark2.4.x+Python2.7的稳定版本,别随便用最新版,最新版大多只支持Python3和Spark3.x。
2. 确保集群所有节点都安装了依赖
光在代码里配置没用,必须让整个集群的Spark都能找到这个库:
推荐用EMR Bootstrap脚本安装(集群创建时自动完成)
写个简单的bootstrap脚本:#!/bin/bash # 安装Python依赖 sudo pip install spark-deep-learning==1.5.0 tensorflow==1.15.5 # 下载对应jar包到Spark的全局jars目录 sudo wget https://repo1.maven.org/maven2/com/databricks/spark-deep-learning_2.11/1.5.0/spark-deep-learning_2.11-1.5.0.jar -P /usr/lib/spark/jars/创建EMR集群时把这个脚本加进去,这样主从节点都会自动装好依赖,不用手动同步。
临时测试的话,手动在主节点安装并同步
登录主节点执行:sudo pip install spark-deep-learning==1.5.0 tensorflow==1.15.5 # 把jar包同步到所有从节点 for node in $(yarn node -list | grep RUNNING | awk '{print $1}'); do scp /usr/lib/spark/jars/spark-deep-learning_2.11-1.5.0.jar $node:/usr/lib/spark/jars/; done
3. 正确初始化SparkSession
别漏了关键配置,给你个能用的示例代码:
from pyspark.sql import SparkSession from sparkdl import readImages # 必须导入这个模块 # 初始化SparkSession,指定jar包或依赖 spark = SparkSession.builder \ .appName("ParallelImageRead") \ # 如果已经通过bootstrap装了jar包,这行可以省略;如果没装,用这行自动下载 .config("spark.jars.packages", "com.databricks:spark-deep-learning_2.11:1.5.0") \ .config("spark.driver.memory", "8g") \ .config("spark.executor.memory", "8g") \ .getOrCreate() # 测试读取S3或HDFS上的图片 image_df = readImages("s3://your-image-bucket/path/") image_df.show(5)
注意:如果集群没有外网,spark.jars.packages会下载失败,这时候必须提前把jar包放到/usr/lib/spark/jars/目录,然后去掉这行配置。
4. 查完整错误日志找根源
你只贴了错误开头,YARN应用的完整日志才是关键:
- 在EMR控制台的「步骤」页面,找到失败的Spark任务,点击「日志链接」查看详细日志;
- 或者在主节点执行命令拉取日志:
重点看yarn logs -applicationId <你的YARN应用ID>ClassNotFoundException或者NoClassDefFoundError,这类错误基本都是jar包没装对或者版本不匹配;如果是内存不足,就调大spark.driver.memory或spark.executor.memory。
5. 确认Python2.7的依赖兼容
Python2.7的生态已经停更了,要确保依赖版本对应:
- 执行
pip list检查:spark-deep-learning必须是1.5.0及以下,tensorflow必须是1.x版本(1.15.5是Python2.7支持的最后一个稳定版),pyspark版本要和EMR集群的Spark版本完全一致。
内容的提问来源于stack exchange,提问作者nmh26
相关产品推荐
相关产品推荐

