![](/img/trans.png)
[英]Trying to index kafka topic in Elasticsearch with Kafka Connect
[英]Kafka Connect to persist topic to Elasticsearch index using field from (json) message
我試圖僅使用來自Kafka的Connect API的SMT在Elasticsearch中為消息編制索引。
到目前為止,我僅使用主題和時間戳路由器功能就很幸運。 但是,現在我想根據消息中的某個字段創建單獨的索引。
假設消息的格式如下:
{"productId": 1, "category": "boat", "price": 135000}
{"productId": 1, "category": "helicopter", "price": 300000}
{"productId": 1, "category": "car", "price": 25000}
是否可以基於產品類別將它們索引到以下索引?
還是我必須為每個類別創建單獨的主題(知道它可能會變成成百上千個)?
我是否正在監督可以執行此操作的轉換,或者這根本不可能,是否需要構建自定義組件?
Kafka Connect並沒有開箱即用的功能。 您有幾種選擇:
CREATE STREAM product-boat AS SELECT * FROM messages WHERE category='boat'
等) 如果您使用的是Confluent Platform
,則可以根據消息中的字段值進行某種路由。
為此,您必須使用Confluent的ExtractTopic
SMT。 有關SMT的更多詳細信息,請參見https://docs.confluent.io/current/connect/transforms/extracttopic.html#extracttopic
Kafka Sink連接器處理由SinkRecord
表示的SinkRecord
。 每個SinkRecord
包含幾個字段: topic
, partition
, value
, key
等等。這些字段由Kafka Connect設置,使用轉換可以更改這些值。 ExtractTopic
SMT根據消息的value
或key
來更改topic
的value
。
轉換配置將如下所示:
{
...
"transforms": "ExtractTopic",
"transforms.ExtractTopic.type": "io.confluent.connect.transforms.ExtractTopic$Value",
"transforms.ExtractTopic.field": "name", <-- name of field, that value will be used as index name
...
}
一種限制是,您必須提前創建索引。
我如何假設您正在使用Elasticsearch Sink Connector 。 Elasticsearch連接器具有創建索引的能力,但是它在打開索引時就可以創建索引-為特定分區創建寫程序的方法( ElasticsearchSinkTask::open
)。 那時候在您的用例中,由於所有消息的值都不可用,因此無法創建所有索引。
也許這不是最純粹的方法,因為ExtractTopic
應該用於Source連接器,但是在您這種情況下,它可能會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.