无法读取Kafka - Avro Schema消息

时间:2016-06-08 13:57:29

标签: logstash apache-kafka avro

解决这个问题的方法???我无法阅读KAFKA-AVRO架构消息。我试图将消息从logstash发送到KAFKA到HDFS。

以下是技术堆栈:

  1. Logstash 2.3 - 当前生产版本
  2. Confluent 3.0。
  3. 插件: 一个。 Logstash-kafka-Output插件 湾Logstash编解码器,Avro公司。
  4. zookeeper:3.4.6
  5. KAFKA:0.10.0.0
  6. Logstash配置文件如下所示:

    data[, 29] = sapply(data[,29], nchar)
    

    schema.avsc文件如下所示:

    input {
    stdin{}
    }
    
    filter {
    mutate {
    remove_field => ["@timestamp","@version"]
      }
    }
    
    output {
      kafka {
    topic_id => 'logstash_logs14'
    
    codec => avro  { 
    schema_uri => "/opt/logstash/bin/schema.avsc"
        }
      }
    }
    

    执行以下命令:

    1. 在自己的终端中启动Zookeeper

      ./ bin / zookeeper-server-start ./etc/kafka/zookeeper.properties

    2. 2在自己的终端中启动Kafka

      {
          "type":"record",
          "name":"myrecord",
          "fields":[
              {"name":"message","type":"string"},
              {"name":"host","type":"string"}
              ]
      }
      

      3在自己的终端中启动模式注册表

      ./bin/kafka-server-start ./etc/kafka/server.properties
      

      4从logstash目录运行以下命令

      ./bin/schema-registry-start ./etc/schema-registry/schema-registry.properties
      

      5运行上述命令后,键入要发送给kafka的日志消息  例如:“Hello World”

      6从Kafka消费主题

      bin/logstash -f ./bin/logstash.conf
      

      请让我知道如何解决这个问题

      谢谢, 众议员

2 个答案:

答案 0 :(得分:1)

你是如何写作/出版给卡夫卡的?您正在看到SerializationException,因为数据不是使用schema-registry(或KafkaAvroSerializer)编写的,但在使用schema-registry时,kafka-avro-console-consumer在内部使用schema-registry(或KafkaAvroDeserializer),它希望数据为以某种格式(特别是<magic byte><schemaId><data>)。如果您使用kafka-avro-console-producer编写avro数据,那么您不应该获得此异常,或者您可以在生产者属性中设置KafkaAvroSerializer以获取密钥和&amp;值序列化器并设置schema-registry-url。

Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
      io.confluent.kafka.serializers.KafkaAvroSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
      io.confluent.kafka.serializers.KafkaAvroSerializer.class);
props.put("schema.registry.url", "http://localhost:8081");

答案 1 :(得分:0)

回答也许为时已晚,但现在面临同样的问题。

Logstrash在此处使用默认的序列化器, “ org.apache.kafka.common.serialization.StringSerializer”

因此,如果您想从事件总线中读取Avro消息,则必须使用Logstash输出上的KafkaAvroSerializers对其进行序列化 “ io.confluent.kafka.serializers.KafkaAvroSerializer”

然后从使用者部分使用匹配的反序列化器。 问题是,logstash根本无法识别IO.CONFLUENT,因此您必须做一些棘手的事情才能将其添加为dep和jars