Spark Streaming读取Kinesis数据时出现NoSuchFieldError: NO_INTS错误求助
问题分析
这个java.lang.NoSuchFieldError: NO_INTS错误的核心原因是Jackson版本冲突:你手动引入的Jackson相关JAR包(比如jackson-dataformat-cbor-2.9.8.jar)和Spark自身内置的Jackson版本,或者AWS SDK依赖的Jackson版本不匹配,导致CBOR解析器类在加载时找不到对应的字段。
Spark 2.4.x系列默认依赖Jackson 2.9.x版本,而AWS SDK的部分版本可能依赖更高(或更低)的Jackson版本,手动指定--jars很容易触发这种版本不兼容问题。
解决方案
我推荐两种解决方式,按优先级排序:
1. 使用--packages自动管理依赖(最省心)
放弃手动指定一堆--jars,改用Spark的--packages参数,它会自动处理依赖冲突,拉取兼容的版本组合。针对你的Spark 2.4.5环境,执行以下命令即可:
spark-submit --packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.4.5,com.amazonaws:aws-java-sdk-kinesis:1.11.745,com.amazonaws:amazon-kinesis-client:1.13.2 snowplow_spark/src/main.py
Spark会自动拉取所有必要的依赖(包括匹配的Jackson版本),无需你手动逐个指定JAR包。
2. 手动调整依赖并强制加载顺序(如果必须用--jars)
如果你坚持手动管理JAR包,需要做两个关键调整:
- 移除重复依赖:删掉
aws-java-sdk-1.11.745.jar,因为你已经引入了细分的AWS SDK模块(比如aws-java-sdk-kinesis、aws-java-sdk-core),完整包和细分包重复引入会引发冲突。 - 强制优先加载你的依赖:添加Spark配置参数,让你的自定义JAR包优先于Spark内置依赖加载,确保使用你指定的Jackson 2.9.8版本。
修改后的命令如下:
spark-submit --jars spark-streaming-kinesis-asl_2.11-2.4.5.jar,amazon-kinesis-client-1.13.2.jar,aws-java-sdk-kinesis-1.11.745.jar,aws-java-sdk-core-1.11.745.jar,aws-java-sdk-sts-1.11.745.jar,aws-java-sdk-dynamodb-1.11.745.jar,aws-java-sdk-cloudwatch-1.11.745.jar,jackson-core-2.9.8.jar,jackson-dataformat-cbor-2.9.8.jar,jackson-databind-2.9.8.jar --conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true snowplow_spark/src/main.py
额外注意事项
- 确保
spark-streaming-kinesis-asl的版本和你的Spark版本完全一致(都是2.4.5),你当前已经做到了这一点,这是避免兼容性问题的基础。 - 尽量避免手动管理大量JAR包,使用
--packages或构建工具(比如Maven/Gradle)来管理依赖,能大幅降低版本冲突的概率。
内容的提问来源于stack exchange,提问作者Gagan
相关产品推荐
相关产品推荐

