如何使用Kafka主题中的特定消息

时间:2017-01-13 22:18:27

标签: apache-kafka logstash

我们正在使用Kafka和ELK构建应用程序。我们将消息存储到Kafka主题中。 Logstash然后从主题和索引中读取只有特定的'记录到Elasticsearch。就像一个字段具有一定的价值,然后将其编入索引,不要将其编入索引并让它保留在主题中。这是现在的设计。但是将来,我们需要处理来自未被索引到Elasticsearch的主题的那些消息。有没有办法我们以后可以只处理那些没有索引到ES的Kafka的消息?如果是这样,怎么样?我们需要将它们存储在不同的主题中吗?或者我们可以使用相同的主题和相同的使用者组,但在主题中存储时为它们分配不同的分区ID。

有人可以对此有所了解。

谢谢!

2 个答案:

答案 0 :(得分:1)

只要您将数据保存在Kafka(即主题保留期),您就可以根据需要阅读相同的主题。

因此,如果您要处理未在Elasticsearch中编制索引的数据,则可以简单地重新阅读该主题并应用反向过滤器以获取Elasticsearch中未结束的所有消息。为此,我建议使用不同的使用者组ID。

当然,您还可以在将主题加载到Elasticsearch中时将未加载到Elasticsearch中的消息编写到新主题中(即,在日期中一次性传入Elasticsearch和新主题)。但是比你存储一些数据两次。因此,您可以在以后处理非索引数据时进行空间/时间权衡:如果让我们说90%的数据在Elasticsearch中结束,则可能需要复制10%的数据并加快速度稍后处理此数据(您只需要读取小10倍的新主题)。如果只有10%的数据被索引,那么复制90%的数据似乎是浪费,只能节省10%的读取开销。

答案 1 :(得分:0)

您可以使用弹性搜索(在外部文件或弹性主题中)保存已读取和处理的偏移范围,而不是仅使用特定范围间隔在第二时刻处理数据。

读取由特定偏移分隔的Kafka队列子集的简单方法是使用带有KafkaRDD的spark应用程序:https://spark.apache.org/docs/1.3.0/api/java/org/apache/spark/streaming/kafka/KafkaRDD.html