Spark写入ElasticSearch报错EsHadoopIllegalArgumentException:无法检测ES版本
解决Spark写入ElasticSearch时的
Cannot detect ES version错误 嘿,我之前也碰到过一模一样的问题,咱们一步步来排查解决:
1. 先确认网络连通性是基础
这个错误最直接的原因就是Spark程序根本连不上ES集群,先做这些基础检查:
- 如果是本地运行Spark,先试试ping一下ES节点的IP/域名,看能不能通;如果是集群环境,要确保Spark集群的所有节点都能访问ES的端口(默认9200)
- 用curl命令直接访问ES的版本接口,验证ES本身是正常可访问的:
如果能返回包含curl http://<你的ES节点IP>:9200version字段的JSON,说明ES本身没问题,问题出在Spark的配置上。
2. 必须配置es.nodes.wan.only(针对云/WAN环境)
如果你的ES是云服务商提供的(比如AWS、阿里云ES),或者是跨网络部署的,一定要加上这个配置!它会告诉ES-Hadoop插件不要尝试用内部节点发现机制,直接用你指定的外部节点地址连接:
val spark = SparkSession.builder() .appName("SparkToES") .config("es.nodes", "你的ES节点IP或域名") .config("es.port", "9200") .config("es.nodes.wan.only", "true") // 这行是关键! .getOrCreate()
3. 检查依赖版本兼容性
你给出的Scala 2.11.5 + Spark 2.3.0,一定要保证elasticsearch-hadoop的版本和你的ES集群版本完全匹配大版本!比如:
- 如果你的ES是7.x版本,就用7.x系列的es-hadoop(比如7.17.10)
- 如果是6.x版本,就用6.x系列的es-hadoop(比如6.8.23)
正确的sbt依赖配置应该是这样的(补充完整你的配置):
scalaVersion := "2.11.5" val sparkVersion = "2.3.0" val esHadoopVersion = "7.17.10" // 这里要和你的ES集群版本对应! resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven" libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % sparkVersion % Provided, "org.apache.spark" %% "spark-sql" % sparkVersion % Provided, "org.elasticsearch" % "elasticsearch-hadoop" % esHadoopVersion )
划重点:版本不兼容是很多人踩的坑,哪怕差一个大版本,都会出现连接失败或者版本检测错误!
4. 额外排查点(如果以上都没用)
- 如果ES开启了账号密码验证,要在Spark配置里加上:
.config("es.net.http.auth.user", "你的ES账号") .config("es.net.http.auth.pass", "你的ES密码") - 检查ES集群的
http.enabled配置是不是true,有些集群可能关闭了HTTP端口(默认是开启的)
内容的提问来源于stack exchange,提问作者Cassie
相关产品推荐
相关产品推荐

