elasticsearch,apache-kafka,Scala,Apache Spark,elasticsearch,Apache Kafka" /> elasticsearch,apache-kafka,Scala,Apache Spark,elasticsearch,Apache Kafka" />

Scala 通过Spark Streaming使用elastic search 5.5批量摄取API时出现NullPointerException

Scala 通过Spark Streaming使用elastic search 5.5批量摄取API时出现NullPointerException,scala,apache-spark,elasticsearch,apache-kafka,Scala,Apache Spark,elasticsearch,Apache Kafka,获取NullPointerException: java.lang.NullPointerException at org.elasticsearch.action.bulk.BulkRequest.validate(BulkRequest.java:604) at org.elasticsearch.action.TransportActionNodeProxy.execute(TransportActionNodeProxy.java:46) at org.elast

获取NullPointerException:

java.lang.NullPointerException
    at org.elasticsearch.action.bulk.BulkRequest.validate(BulkRequest.java:604)
    at org.elasticsearch.action.TransportActionNodeProxy.execute(TransportActionNodeProxy.java:46)
    at org.elasticsearch.client.transport.TransportProxyClient.lambda$execute$0(TransportProxyClient.java:59)
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:250)
    at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
    at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:363)
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:408)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:54)
我有一个场景,在Spark Streaming应用程序中的4个执行器中运行多个并发任务,每个执行器从Kafka读取数据,准备批量并接收ES索引中的一批记录。我第一次在这些批记录中得到了一个奇怪的NullPointerException,但是在第二次运行中它们得到了成功的处理


有人能告诉我为什么会发生这种情况。

这是我正在使用的代码片段,第一行是build.sbt文件中的依赖项

//lib dependency in build.sbt
"org.elasticsearch" %% "elasticsearch-spark-20" % "5.6.5"

//below is the connection variables required by Spark

val resources: String =
  s"${appConf.getString("es-index")}/${appConf.getString("es.type")}"
val esConfig: Map[String, String] = Map(
  "es.index.auto.create" -> s"${appConf.getString("es.index.auto.create")}",
  "es.nodes" -> s"${appConf.getString("es-nodes")}",
  "es.port" -> s"${appConf.getInt("es.port")}",
  "es.nodes.wan.only" -> s"${appConf.getString("es.nodes.wan.only")}",
  "es.net.ssl" -> s"${appConf.getString("es.net.ssl")}"
)

import org.elasticsearch.spark._
    val dstream: InputDStream[ConsumerRecord[String, String]] =
  KafkaUtils.createDirectStream[String, String](
    ssc,
    LocationStrategies.PreferConsistent,
    ConsumerStrategies.Subscribe[String, String](conn.topic,
                                                 conn.kafkaProps)
  )
dstream.foreachRDD(rdd =>
  rdd.map(_.value).saveJsonToEs(resources,esConfig))
ssc.checkpoint("/tmp/OACSpark")
ssc.start()
ssc.awaitTermination()
我使用typesafe配置从属性文件读取配置。
我以json的形式将数据发布到kafka,因此我使用了“saveJsonToEs()”api,您可以在Elasticsearch网站上的连接器文档中找到更多信息“

到目前为止,我已经找到了一种解决方法,一次将记录推送到ES索引,并删除了这个批量api(批量api在幕后也做同样的事情).

谢谢@Yayati…但到目前为止,我们还没有使用Spark ES connector。请告诉我是否有办法通过我们目前使用的ES JAVA API来实现。嗨,Shobhit。ES Spark connector在引擎盖下使用ES JAVA connector。我相信你会没事的。嗨,Yayati。我们正计划继续使用它。谢谢!你考虑过只使用ES JAVA connector吗ng Kafka Connect(它是Apache Kafka的一部分)将数据从Kafka流式传输到Elasticsearch?请查看:目前,我们正在使用Spark Kafka流式传输作为当前工具堆栈的一部分。但这确实是您共享的coll内容,请查看。谢谢!