使用Spark读取DynamoDB时遇java.lang.ClassNotFoundException异常
解决Spark读取DynamoDB时的数据源找不到问题
你遇到的DATA_SOURCE_NOT_FOUND和ClassNotFoundException: dynamodb.DefaultSource问题,核心是Spark无法识别指定的dynamodb数据源格式,以及依赖打包或配置有误,以下是具体修复方案:
1. 修正数据源格式配置
你使用的com.audienceproject/spark-dynamodb依赖,其对应的数据源格式名称不是dynamodb,而是com.audienceproject.spark.dynamodb,或者可以直接指定完整的数据源类名。修改Java代码中的format部分:
方式一:使用依赖指定的格式名称
Dataset citations = sparkSession.read() .option("tableName", "Covid19Citation") .option("aws.dynamodb.region", "us-east-1") .option("aws.dynamodb.endpoint", "dynamodb.us-east-1.amazonaws.com") .format("com.audienceproject.spark.dynamodb") // 修正此处 .load();
方式二:直接指定数据源类名
Dataset citations = sparkSession.read() .option("tableName", "Covid19Citation") .option("aws.dynamodb.region", "us-east-1") .option("aws.dynamodb.endpoint", "dynamodb.us-east-1.amazonaws.com") .format("com.amazonaws.services.dynamodbv2.spark.DefaultSource") // 指定完整类名 .load();
2. 修复FatJar打包配置
你的Gradle FatJar任务存在两处问题,导致依赖可能未被正确打包:
exclude配置放错了位置,应该放在任务根级别而非manifest内- 使用已弃用的
configurations.compile,建议替换为configurations.compileClasspath
修改后的FatJar任务:
task fatJar(type: Jar) { zip64 true manifest { attributes 'Main-Class': 'com.lcarvalho.sparkddb.Covid19CitationsWordCount' attributes 'Implementation-Title': 'Spark Job', 'Implementation-Version': version } exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' baseName = 'Covid19CitationsWordCount' from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } } with jar }
3. 验证依赖兼容性
com.audienceproject:spark-dynamodb_2.12:1.1.2本身兼容Spark 2.4.x版本,无需调整依赖版本,但确保执行gradle fatJar时没有依赖下载失败的情况。
备选方案:提交任务时指定依赖包
如果不想打包FatJar,可以在Spark提交命令中通过--packages参数引入依赖:
spark-submit --packages com.audienceproject:spark-dynamodb_2.12:1.1.2 --class com.lcarvalho.sparkddb.Covid19CitationsWordCount your-app.jar
内容的提问来源于stack exchange,提问作者Nemanja
相关产品推荐
相关产品推荐

