apache avro工具无法解码logstash avro输出

6rvt4ljy  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(544)

我对logstash和avro都是初学者。我们正在设置一个系统,logstash作为kafka队列的生产者。但是,我们遇到了这样一个问题:由logstash生成的avro序列化事件不能被apache提供的avro工具jar(1.8.2版)解码。此外,我们注意到logstash和avro工具的序列化输出不同。
我们有以下设置:
logstash版本5.5
logstash avro编解码器版本3.2.1
Kafka版本0.10.1
avro工具jar版本1.8.2
例如,考虑以下模式:

{
"name" : "avroTestSchema",
"type" : "record",
"fields" : [ {
  "name" : "testfield1",
  "type" : "string"
  },
  {
  "name" : "testfield2",
  "type" : "string"
  }
]
}

以及以下json字符串:

{"testfield1":"somestring","testfield2":"anotherstring"}

使用logstash序列化时。日志存储配置文件:

input {
  stdin {
    codec => json
  }
}

filter {
 mutate {
    remove_field => ["@timestamp", "@version"]
  }
}

output {
  kafka {
    bootstrap_servers => "localhost:9092"
    codec => avro {
      schema_uri => "/path/to/TestSchema.avsc"
    }
    topic_id => "avrotestout"
  }
  stdout {
    codec => rubydebug
  }
}

输出(使用cat):

FHNvbWVzdHJpbmcaYW5vdGhlcnN0cmluZw==

使用avro工具序列化时。命令:

java -jar avro-tools-1.8.2.jar jsontofrag --schema-file TestSchema.avsc message.json

输出

somestringanotherstring

命令:

java -jar avro-tools-1.8.2.jar fromjson --schema-file TestSchema.avsc message.json

输出:

Objavro.codenullavro.schema▒{"type":"record","name":"avroTestSchema","fields":[{"name":"testfield1","type":"string"},{"name":"testfield2","type":"string"}]}▒▒▒▒&70▒▒Hs▒U2somestringanotherstring▒▒▒▒&70▒▒Hs▒U

所以我们的问题是:如何配置logstash,使输出与apacheavro工具jar兼容?
更新:我们发现日志存储产生的avro输出是base64编码的。但是,我们无法找到发生这种情况的地方,以及如何使它与avro工具兼容

bt1cpqcv

bt1cpqcv1#

正如更新中提到的,我们发现标准logstash avro编解码器向avro输出添加了非可选的base64编码。我们发现这是不可取的。因此,我们分叉了编解码器,并使这种编码可配置。我们对此进行了测试,并在我们的几个系统上实现了开箱即用。
github上提供了fork:https://github.com/rubyan/logstash-codec-avro
要设置(或取消设置)base64编码,请将其添加到日志存储配置文件:

output {
     stdout {
        codec => avro {
            schema_uri => "schema.avsc"
            base64_encoding => false
        }
    }
}

相关问题