PySpark流式写入Elasticsearch报NoSuchMethodError求助
问题解决:PySpark流写入Elasticsearch出现NoSuchMethodError
错误根源
这个java.lang.NoSuchMethodError是版本兼容性问题:你使用的Elasticsearch Hadoop 8.5.3基于Spark 3.2.x开发,而PySpark 3.3.1中SQLExecution$.withNewExecutionId方法的签名发生了变更,导致Elasticsearch的Sink代码找不到对应方法。
可行解决方案
方案1:升级Elasticsearch Hadoop到兼容Spark 3.3.x的版本
Elasticsearch官方从8.6.0版本开始支持Spark 3.3.x,修改SparkSession的依赖配置:
spark_session = SparkSession.builder.appName("spark-test")\ .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.3.1,org.elasticsearch:elasticsearch-hadoop:8.6.2")\ .getOrCreate()
注意:Kafka依赖版本必须和PySpark版本完全一致(这里用3.3.1匹配你的PySpark版本)。
方案2:降级PySpark到3.2.x并同步调整所有依赖
如果坚持使用Elasticsearch Hadoop 8.5.3,需要将PySpark降级到3.2.x,同时把Kafka依赖换成对应Spark 3.2.x的版本:
spark_session = SparkSession.builder.appName("spark-test")\ .config("spark.jars.packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.2.4,org.elasticsearch:elasticsearch-hadoop:8.5.3")\ .getOrCreate()
你之前降级Spark到3.2.0但Kafka依赖仍用3.1.2,版本不匹配导致Kafka集成失败,这是核心原因。
额外注意事项
- 依赖包的Scala版本要统一:你的Spark依赖用的是
_2.12(Scala 2.12),因此Elasticsearch依赖不能用_2.11版本,elasticsearch-hadoop会自动匹配Scala版本,无需手动指定。 - Elasticsearch 7+无需指定文档类型:
es.resource参数直接写索引名即可,比如"name_of_index",不用再加/name_of_type(Elasticsearch 7.x开始废弃了type概念)。
内容的提问来源于stack exchange,提问作者PRONKERIJ
相关产品推荐
相关产品推荐

