簡體   English   中英

Kafka Connect使用(json)消息中的字段將主題持久化到Elasticsearch索引

[英]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並沒有開箱即用的功能。 您有幾種選擇:

  1. Elasticsearch接收器連接器將根據其主題將消息路由到目標索引,因此您可以編寫一個自定義SMT來檢查消息並將其相應地路由到其他主題
  2. 使用流處理器對消息進行預處理,以使它們在被Elasticsearch接收器連接器消耗時已經在不同的主題上。 例如,Kafka Streams或KSQL。
    • KSQL您需要對每個類別進行硬編碼( CREATE STREAM product-boat AS SELECT * FROM messages WHERE category='boat'等)
    • Kafka Streams現在具有動態路由( KIP-303 ),這將是一種更靈活的方式
  3. 使用已編碼的邏輯手工編碼定制的Elasticsearch接收器連接器,以根據消息內容將消息路由到索引。 這感覺就像是IMO三種方法中最差的一種。

如果您使用的是Confluent Platform ,則可以根據消息中的字段值進行某種路由。

為此,您必須使用Confluent的ExtractTopic SMT。 有關SMT的更多詳細信息,請參見https://docs.confluent.io/current/connect/transforms/extracttopic.html#extracttopic

Kafka Sink連接器處理由SinkRecord表示的SinkRecord 每個SinkRecord包含幾個字段: topicpartitionvaluekey等等。這些字段由Kafka Connect設置,使用轉換可以更改這些值。 ExtractTopic SMT根據消息的valuekey來更改topicvalue

轉換配置將如下所示:

{
...
    "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM