如何将时间戳附加到rdd并推送到elasticsearch

时间:2017-10-26 03:33:10

标签: java elasticsearch time apache-kafka spark-streaming

我是新手来引发流媒体和弹性搜索,我试图使用spark从kafka主题读取数据并将数据存储为rdd。在rdd中我想附加时间戳,只要新数据出现然后推送到elasticsearch。

lines.foreachRDD(rdd -> {
        if(!rdd.isEmpty()){
        // rdd.collect().forEach(System.out::println);
        String timeStamp = new 
        SimpleDateFormat("yyyy::MM::dd::HH::mm::ss").format(new Date());
        List<String> myList = new ArrayList<String>(Arrays.asList(timeStamp.split("\\s+")));
        List<String> f = rdd.collect();


        Map<List<String>, ?> rddMaps = ImmutableMap.of(f, 1);
        Map<List<String>, ?> myListrdd = ImmutableMap.of(myList, 1);

        JavaRDD<Map<List<String>, ?>> javaRDD = sc.parallelize(ImmutableList.of(rddMaps));

        JavaEsSpark.saveToEs(javaRDD, "sample/docs");
        }
    });

2 个答案:

答案 0 :(得分:1)

火花?

据我所知,spark streaming用于实时流数据计算,如mapreducejoinwindow。似乎没有必要使用这样一个强大的工具,在我们需要的只是为事件添加时间戳的情况下。

Logstash?

如果是这种情况,Logstash可能更适合我们的情况。 kafka and ES

Logstash将记录事件发生时的时间戳,并且还有persistent queueDead Letter Queues以确保数据弹性。它具有对ES的推送数据的本机支持(毕竟它们属于一系列产品),这使得将数据推送到非常容易。

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "logstash-%{type}-%{+YYYY.MM.dd}"
  }
}

更多

  • 有关Logstash的更多信息,here是介绍。
  • here是一个示例logstash配置文件。

希望这有用。

参考

答案 1 :(得分:0)

如果您只是使用Spark Streaming来获取从Kafka到Elasticsearch的数据更简洁 - 并且不需要任何编码 - 将使用Kafka Connect。

有一个Elasticsearch Kafka Connect sink。根据您对时间戳的要求(例如,对于索引路由,或作为字段添加),您可以使用Single Message Transforms(其中包含here的示例)。