代码之家  ›  专栏  ›  技术社区  ›  Joep van Genuchten

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

  •  0
  • Joep van Genuchten  · 技术社区  · 8 年前

    我们有以下设置:

    • logstash版本5.5
    • logstash avro编解码器版本3.2.1
    • 卡夫卡版本0.10.1

    例如,考虑以下模式:

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

    FHNvbWVzdHJpbmcaYW5vdGhlcnN0cmluZw==  
    

    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生成的avro输出是base64编码的。但是,无法找到发生这种情况的地方,以及如何使其与avro工具兼容

    1 回复  |  直到 8 年前
        1
  •  2
  •   Joep van Genuchten    8 年前

    如更新中所述,我们发现标准Logstash Avro编解码器在Avro输出中添加了非可选的base64编码。我们发现这是不可取的。因此,我们分叉了编解码器,并使这种编码可配置。我们对此进行了测试,并在我们的几个系统上实现了开箱即用。

    github上提供了fork: https://github.com/Rubyan/logstash-codec-avro

    output {
         stdout {
            codec => avro {
                schema_uri => "schema.avsc"
                base64_encoding => false
            }
        }
    }
    
    推荐文章