簡體   English   中英

Kafka 連接 API 和 Avro Object(SourceRecord 與 org.apache.avro.Schema)

[英]Kafka Connect API and Avro Object (SourceRecord vs org.apache.avro.Schema)

我在使用 kafka 源連接器(需要准備 SourceRecord 實例)將 Avro object(org.apache.avro.specific.SpecificRecord 的實例)發送到 kafka 主題時遇到問題。 在我的例子中,我假設基於模式,例如:

{
    "namespace": "com.model.avro.generated",
    "type": "record",
    "name": " MessageExVal",
    "version": "1",
    "fields": [
        {
            "name": "messageSource",
            "type": "string"
        },
        {
            "name": "messageSourceVersion",
            "type": [
                "string",
                "null"
            ]
        }
    ]
}

avro-maven-plugin for maven 的幫助下,我將生成項目中使用的類 model。 class MessageExVal的實例為我提供了“ org.apache.avro.Schema ”(通過方法getSchema() or getClassSchema() )。 從第二端 kafka connect api 需要我org.apache.kafka.connect.data.Schema才能創建由源連接器的poll()方法返回的SourceRecord的新實例。 在配置中我提供參數:

"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "http://localhost:8081",

在“輪詢”方法之后執行的fromConnectData()方法中的AvroConverter代碼中,我看到從org.apache.kafka.connect.data.Schemaorg.apache.avro.Schema的轉換將完成。 那么是否有任何選項可以傳遞 avro 模式而不首先將其轉換為“連接版本”,因為稍后它無論如何都會轉換回 avro? 您可以在下面找到我所指的代碼中帶有注釋點的 poll 方法的實現:

@Override
    public List<SourceRecord> poll() throws InterruptedException {
        List<SourceRecord> records = new LinkedList<SourceRecord>();
        MessageExVal myValue = MessageExVal.newBuilder()
                .setMessageType(“some value”)
                .setMessageSource(“some other value”)
                .build();
        SourceRecord sr = new SourceRecord(null, null,
                "test_topic",
                myValue.getSchema(), //incorrect - different types
                myValue);
        records.add(sr);
        return records;
    }

總結一下,我的問題是如何使用 kafka connect SourceConnector 將“myValue”放入主題? 我將非常感謝每一個提示:)

因為后來它無論如何都會轉換回avro?

數據以二進制形式存儲在主題中,因此您仍然需要支付反序列化成本

kafka connect api 需要我 org.apache.kafka.connect.data.Schema 才能創建 SourceRecord 的新實例

是的。 您可以使用toConnectData來獲取它,或者您可以從代碼的依賴項中刪除 Avro 並直接從 Connect 創建 Schema 和 Struct 實例。

轉換器負責序列化,Connect 中不需要 Avro

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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