我进行了一个练习,即实现一个服务,该服务从Kafka获取数据,对其进行处理,然后使用Spark Streaming将结果存储到elasticsearch中。
我可以将数据从Kafka提取到我的服务中,并在Spark集群中对其进行处理,但是我不知道如何在操作中将结果持久化到elasticsearch中。到目前为止,我的代码如下:
SparkConf sparkConf = new SparkConf()...
JavaStreamingContext streamingContext = new JavaStreamingContext(sparkConf, Durations.seconds(1));
...
JavaPairInputDStream<String, Event> eventStream = KafkaUtils.createDirectStream(...);
eventStream.foreachRDD( rdd -> {
rdd.foreach(Application::processEvent);
});
processEvent方法如下:
public static void processEvent(Tuple2<String, Event> t) {
//Process event t here
...
// here I want to persist the result into elasticsearch
}
我是Apache Spark的新手。请告诉我在处理事件后如何将结果持久化到elasticsearch中。 请注意,我知道如何在独立的Java应用程序中将文档索引到elasticsearch中,我只是不知道如何在Spark Streaming中使用它。
谢谢。
答案 0 :(得分:0)
您需要提供弹性配置并调用saveToEs()
,以将数据从Spark RDD保存到弹性搜索索引。
以下是 scala 代码,您可以将其用作参考,并且可以在Java中实现相同的代码
我具有以下依赖性:
libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.1.0"
libraryDependencies += "org.apache.spark" % "spark-sql_2.11" % "2.1.0"
libraryDependencies += "org.elasticsearch" % "elasticsearch-spark-20_2.11" % "5.0.0"
然后代码如下:
// Create SparkConf object with Elastic details
val sparkConf = new SparkConf().setAppName("Job Name")
sparkConf.set("es.nodes", "Elastic_IP_1, Elastic_IP_2")
sparkConf.set("es.port", "9200")
sparkConf.set("es.batch.size.entries", "1000")
sparkConf.set("es.batch.size.bytes", "102400")
// Create SparkSession using the above SparkConf
val sparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
...
...
...
val myRDD = ......
var elasticConfig = new HashMap[String, String]
elasticConfig += ("es.mapping.date.detection" -> "false")
elasticConfig += ("es.mapping.date.rich" -> "false")
import org.elasticsearch.spark._
// Save rdd to elastic search index
myRDD.saveToEs("indexName", elasticConfig)