将数据从Apache中的JavaDStream <string>写入elasticsearch

时间:2016-08-25 16:52:39

标签: elasticsearch apache-spark apache-kafka

我正在进行编程以处理从Apache kafka到elasticsearch的数据。为此,我使用的是Apache Spark。我已经经历了很多链接,但无法找到将Apache Spark中的JavaDStream数据写入elasticsearch的示例。

下面是spark的示例代码,它从kafka获取数据并打印出来。

import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import scala.Tuple2;

import kafka.serializer.StringDecoder;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.*;
import org.apache.spark.streaming.api.java.*;
import org.apache.spark.streaming.kafka.KafkaUtils;
import org.apache.spark.streaming.Durations;
import org.elasticsearch.spark.rdd.api.java.JavaEsSpark;

import com.google.common.collect.ImmutableMap;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import java.util.List;
public class SparkStream {

    public static JavaSparkContext sc;
    public static List<Map<String, ?>> alldocs;

    public static void main(String args[])
    {
        if(args.length != 2)
        {
            System.out.println("SparkStream <broker1-host:port,broker2-host:port><topic1,topic2,...>");

            System.exit(1);
        }

        Logger.getLogger("org").setLevel(Level.OFF);
        Logger.getLogger("akka").setLevel(Level.OFF);
        SparkConf sparkConf=new SparkConf().setAppName("Data Streaming");
        sparkConf.setMaster("local[2]");
        sparkConf.set("es.index.auto.create", "true");
        sparkConf.set("es.nodes","localhost");
        sparkConf.set("es.port","9200");
        JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, Durations.seconds(2));

        Set<String> topicsSet=new HashSet<>(Arrays.asList(args[1].split(",")));
        Map<String,String> kafkaParams=new HashMap<>();
        String brokers=args[0];
        kafkaParams.put("metadata.broker.list",brokers);
        kafkaParams.put("auto.offset.reset", "largest");
        kafkaParams.put("offsets.storage", "zookeeper");
        JavaPairDStream<String, String> messages=KafkaUtils.createDirectStream(
                jssc,
                String.class,
                String.class,
                StringDecoder.class,
                StringDecoder.class,
                kafkaParams,
                topicsSet
        );
        JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
            @Override
            public String call(Tuple2<String, String> tuple2) {
              return tuple2._2();
            }
        });
        lines.print();
       jssc.start();
       jssc.awaitTermination();
    }
}

`

2 个答案:

答案 0 :(得分:0)

保存为弹性搜索的一种方法是在saveToEs函数中使用foreachRDD方法。您希望使用的任何其他方法仍然需要{d}调用您的dstream。

例如:

foreachRDD

See here for more

答案 1 :(得分:0)

 dstream.foreachRDD{rdd=>
        val es = sqlContext.createDataFrame(rdd).toDF("use headings suitable for your dataset")
        import org.elasticsearch.spark.sql._
        es.saveToEs("wordcount/testing")
  es.show()
}

在此代码块&#34; dstream&#34;是从kafka服务器观察数据的数据流。 &#34; toDF()&#34;的括号内你必须使用标题。在&#34; saveToES()&#34;你有使用elasticsearch索引。在此之前,您已经创建了SQLContext。

val sqlContext = SQLContext.getOrCreate(SparkContext.getOrCreate())

如果您使用kafka发送数据,则必须添加下面提到的依赖性

libraryDependencies += "org.apache.kafka" % "kafka-clients" % "0.10.2.1"

Get the dependency

To see full example see

在这个例子中,首先你需要创建kafka producer&#34; test&#34;然后开始elasticsearch 运行程序后。您可以使用上面的url查看完整的sbt和代码。