EMR Serverless使用spark-dynamodb包写入DynamoDB卡壳求助
解决EMR Serverless加载spark-dynamodb包任务卡住问题
1. 核对环境版本兼容性
先确认你的EMR Serverless Spark环境的Scala版本:
- EMR 6.x系列默认用Scala 2.12,适配你选的
com.audienceproject:spark-dynamodb_2.12:1.1.1; - 如果是EMR 5.x,Scala版本是2.11,必须换成对应版本的包(比如
spark-dynamodb_2.11:1.0.0),版本不匹配会导致类加载失败,任务卡住。
2. 修复包加载逻辑,解决依赖阻塞
EMR Serverless默认可能无法顺畅访问Maven中央仓库,或者依赖下载超时导致任务挂起,试试这两种方案:
方案A:指定Maven仓库地址
在SparkSession配置里明确添加中央仓库地址,确保依赖能正常拉取:
spark = SparkSession.builder.appName("EMR_SERVERLESS") # ... 其他配置 ... .config("spark.jars.repositories", "https://repo1.maven.org/maven2/") .config("spark.jars.packages", "com.audienceproject:spark-dynamodb_2.12:1.1.1") # ... 其他配置 ... .getOrCreate()
方案B:上传包到S3直接引用
把spark-dynamodb_2.12-1.1.1.jar及其所有依赖包(比如aws-java-sdk-dynamodb、dynamodb-streams-kinesis-adapter等)上传到S3的某个路径(比如s3://your-bucket/spark-jars/),然后修改配置跳过Maven下载:
spark = SparkSession.builder.appName("EMR_SERVERLESS") # ... 其他配置 ... .config("spark.jars", "s3://your-bucket/spark-jars/spark-dynamodb_2.12-1.1.1.jar,s3://your-bucket/spark-jars/aws-java-sdk-dynamodb-1.12.xxx.jar,...") # ... 其他配置 ... .getOrCreate()
依赖包可以从Maven中央仓库下载,注意版本要和spark-dynamodb兼容。
3. 查看任务日志定位具体问题
任务卡住但无报错,一定要去EMR Serverless控制台看Driver日志:
- 搜索
ClassNotFoundException:如果出现,说明确实没加载到DynamoDB的类,回到步骤1、2排查; - 搜索
download或timeout:如果有依赖下载超时/失败的信息,说明网络或仓库访问有问题,需要调整VPC配置或者用方案B; - 搜索
DynamoDB:看看写入阶段有没有节流、权限相关的隐性报错(虽然你说权限开了,但日志能确认)。
4. 清理无效配置+优化写入参数
- 移除Yarn相关配置:EMR Serverless不基于Yarn运行,
yarn.nodemanager.*这些配置完全没用,删掉避免干扰; - 调低
targetCapacity:你设置的0.99太接近满容量,很容易触发DynamoDB的写入节流,导致任务无限等待。改成0.7或0.8试试:df.write.mode("append") .option("tableName", "MYTABLE") .option("targetCapacity","0.7") .option("region","MYREGION") .format("dynamodb") .save()
内容的提问来源于stack exchange,提问作者Valle1208
相关产品推荐
相关产品推荐

