Avro et Kafka en utilisant SchemaBuilder

Alex P.:

Je suis passé par le tutoriel de baeldung . Ils mentionnent qu'il ya deux façons de créer un schéma.

  • En écrivant la représentation JSON et en ajoutant le plugin Maven pour produire la classe
  • En utilisant le SchemaBuilder, qu'ils mentionnent aussi est un meilleur choix.

Malheureusement, dans l'exemple git je ne vois que le chemin JSON.

Disons que j'ai ce schéma Avro:

{
  "type":"record",
  "name":"TestFile",
  "namespace":"com.example.kafka.data.ingestion.model",
  "fields":[
    {
      "name":"date",
      "type":"long"
    },
    {
      "name":"counter",
      "type":"int"
    },
    {
      "name":"mc",
      "type":"string"
    }
  ]
}

En ajoutant ce plugin dans mon fichier pom:

<plugin>
   <groupId>org.apache.avro</groupId>
   <artifactId>avro-maven-plugin</artifactId>
   <version>1.8.0</version>
   <executions>
      <execution>
         <id>schemas</id>
         <phase>generate-sources</phase>
         <goals>
            <goal>schema</goal>
            <goal>protocol</goal>
            <goal>idl-protocol</goal>
         </goals>
         <configuration>
            <sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory>
            <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
         </configuration>
      </execution>
   </executions>
</plugin>

et la construction avec generate-sources une TestFile.javaest créée à la destination que j'ai dit. Ensuite , pour envoyer à un sujet de kafka je peux faire ce qui suit:

TestFile test = TestFile.newBuilder()
                                            .setDate(102928374747)
                                            .setCounter(2)
                                            .setMc("Some string")
                                            .build();
kafkaTemplate.send(topicName, test);

L'équivalent de la création du schéma avec SchemaBuilderserait:

Schema testFileSchema = SchemaBuilder   .record("TestFile")
                                            .namespace("com.example.kafka.data.ingestion.model")
                                            .fields()
                                            .requiredLong("date")
                                            .requiredInt("counter")
                                            .requiredString("mc")
                                            .endRecord();

Mais comment puis - je générer maintenant POJO et envoyer mes TestFiledonnées à mon sujet kafka?

cricket_007:

Vous n'aurez pas accès à un TestFileobjet puisque le schéma est fait lors de l' exécution, pas pré-compilé. Si vous voulez garder cette POJO, vous aurez alors besoin d' un constructeur pourpublic TestFile(GenericRecord avroRecord)

Vous devrez créer un en GenericRecordutilisant cette Schemaobjet, même comme si vous étiez une chaîne analyse depuis ou un fichier.

Par exemple,

Schema schema = SchemaBuilder.record("TestFile")
            .namespace("com.example.kafka.data.ingestion.model")
            .fields()
            .requiredLong("date")
            .requiredInt("counter")
            .requiredString("mc")
            .endRecord();

GenericRecord entry1 = new GenericData.Record(schema);
entry1.put("date", 1L);
entry1.put("counter", 2);
entry1.put("mc", "3");

// producer.send(new ProducerRecord<>(topic, entry1);

Un exemple complet Kafka est disponible à partir Confluent

Si vous mettez ne comprend pas un champ obligatoire, il va lancer une erreur, et les valeurs des types ne sont pas vérifiées (je pourrais mettre "counter", "2", et il enverrait une valeur de chaîne (ce qui semble être un bug pour moi). en fait, GenericRecord == HashMap<String, Object>avec l'avantage supplémentaire des champs / nullables pre- scrit.

Et vous devrez configurer un sérialiseur Avro, tel que celui Confluent, ce qui nécessite la gestion de leur registre du schéma ou une version comme le montre Cloudera

Dans le cas contraire, vous devez convertir l'objet Avro en un byte[](comme indiqué dans votre linkand il suffit d' utiliser laByteArraySerializer

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=215432&siteId=1
conseillé
Classement