我是新手来引发流媒体和弹性搜索,我试图使用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");
}
});
答案 0 :(得分:1)
据我所知,spark streaming用于实时流数据计算,如map
,reduce
,join
和window
。似乎没有必要使用这样一个强大的工具,在我们需要的只是为事件添加时间戳的情况下。
Logstash将记录事件发生时的时间戳,并且还有persistent queue和Dead Letter Queues以确保数据弹性。它具有对ES的推送数据的本机支持(毕竟它们属于一系列产品),这使得将数据推送到非常容易。
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "logstash-%{type}-%{+YYYY.MM.dd}"
}
}
希望这有用。
答案 1 :(得分:0)
如果您只是使用Spark Streaming来获取从Kafka到Elasticsearch的数据更简洁 - 并且不需要任何编码 - 将使用Kafka Connect。
有一个Elasticsearch Kafka Connect sink。根据您对时间戳的要求(例如,对于索引路由,或作为字段添加),您可以使用Single Message Transforms(其中包含here的示例)。