[英]Kafka connect elasticsearch sink extract and perform values from JSON
[英]Kafka connect ElasticSearch sink - using if-else blocks to extract and transform fields for different topics
我有一個像下面的kafka es接收器屬性文件
name=elasticsearch.sink.direct
connector.class=io.confluent.connect.elasticsearch.ElasticsearchSinkConnector
tasks.max=16
topics=data.my_setting
connection.url=http://dev-elastic-search01:9200
type.name=logs
topic.index.map=data.my_setting:direct_my_setting_index
batch.size=2048
max.buffered.records=32768
flush.timeout.ms=60000
max.retries=10
retry.backoff.ms=1000
schema.ignore=true
transforms=InsertKey,ExtractId
transforms.InsertKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.InsertKey.fields=MY_SETTING_ID
transforms.ExtractId.type=org.apache.kafka.connect.transforms.ExtractField$Key
transforms.ExtractId.field=MY_SETTING_ID
這非常適合單個主題(data.my_setting)。 我想對來自多個主題的數據使用相同的連接器。 我想知道是否有一種方法可以使用else語句是否以主題名稱或消息中的單個條件為條件,因此在不同主題中的消息將具有不同的鍵,我需要轉換它。然后對密鑰進行不同的轉換。 所有傳入的消息都是帶有模式和有效負載的json。
根據答案更新 :
在我的jdbc連接器中,添加密鑰,如下所示:
name=data.my_setting
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
poll.interval.ms=500
tasks.max=4
mode=timestamp
query=SELECT * FROM MY_TABLE with (nolock)
timestamp.column.name=LAST_MOD_DATE
topic.prefix=investment.ed.data.app_setting
transforms=ValueToKey
transforms.ValueToKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.ValueToKey.fields=MY_SETTING_ID
但是,當Elasticsearch接收器讀取此連接器產生的消息時,我仍然收到錯誤
org.apache.kafka.connect.errors.ConnectException: Exiting WorkerSinkTask due to unrecoverable exception.
Caused by: org.apache.kafka.connect.errors.DataException: STRUCT is not supported as the document id
有效負載如下所示:
{
"schema": {
"type": "struct",
"fields": [{
"type": "int32",
"optional": false,
"field": "MY_SETTING_ID"
}, {
"type": "string",
"optional": true,
"field": "MY_SETTING_NAME"
}
],
"optional": false
},
"payload": {
"MY_SETTING_ID": 9,
"MY_SETTING_NAME": "setting_name"
}
}
Connect獨立屬性文件如下所示:
bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
converter.schemas.enable=false
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false
offset.storage.file.filename=/apps/{env}/logs/infrastructure/offsets/connect.offsets
rest.port=8084
plugin.path=/usr/share/java
有沒有一種方法可以實現我的目標,那就是將來自多個主題(在我的情況下是db表)的消息發送給單個ES接收器,這些消息將具有自己的唯一ID(也將是ES中的文檔的ID) 。
我可以將avro用於此任務嗎? 有沒有辦法在架構注冊表中定義密鑰,還是會遇到相同的問題?
這是不可能的。 如果關鍵字段不同,則需要多個連接器。
要考慮的一種選擇是通過流處理器(例如,Kafka Streams,KSQL,Spark Streaming等)預處理您的Kafka主題,以標准化關鍵字段,以便您可以使用單個連接器。 這取決於您要構建的內容是值得進行還是過度使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.