Spark Streaming:将处理后的数据存储到elasticsearch

时间:2018-10-25 06:29:12

标签: java apache-spark elasticsearch streaming

我进行了一个练习,即实现一个服务,该服务从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中使用它。

谢谢。

1 个答案:

答案 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)