¿Por qué usar Avro con Kafka - cómo manejar POJOS? -- java campo con apache-kafka campo con avro campo con confluent-schema-registry camp Relacionados El problema

Why use Avro with Kafka - How to handle POJOs


9
vote

problema

Español

Tengo una aplicación de primavera que es mi productor de Kafka y me preguntaba por qué Avro es la mejor manera de ir. Leí sobre eso y todo lo que tiene para ofrecer, pero ¿por qué no puedo ser en serializar mi Pojo que me creé con Jackson por ejemplo y envíalo a Kafka?

Estoy diciendo esto porque la generación de POJO de AVRO no es tan directa. Además, requiere el plugin Maven y un archivo .AVSC.

Así que, por ejemplo, tengo un Pojo en mi productor de Kafka, creado a mí mismo llamado usuario:

  public class User {      private long    userId;      private String  name;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public long getUserId() {         return userId;     }      public void setUserId(long userId) {         this.userId = userId;     }  }   

Lo serializé y lo envíé a mi tema de usuario en Kafka. Luego tengo un consumidor que en sí mismo tiene un usuario de POJO y deserializar el mensaje. ¿Es una cuestión de espacio? ¿Tampoco es más rápido serializar y deserializar de esta manera? Sin mencionar que hay una sobrecarga de mantener un registro de esquema.

Original en ingles

I have a spring application that is my kafka producer and I was wondering why avro is the best way to go. I read about it and all it has to offer, but why can't I just serialize my POJO that I created myself with jackson for example and send it to kafka?

I'm saying this because the POJO generation from avro is not so straight forward. On top of it, it requires the maven plugin and an .avsc file.

So for example I have a POJO on my kafka producer created myself called User:

public class User {      private long    userId;      private String  name;      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public long getUserId() {         return userId;     }      public void setUserId(long userId) {         this.userId = userId;     }  } 

I serialize it and send it to my user topic in kafka. Then I have a consumer that itself has a POJO User and deserialize the message. Is it a matter of space? Is it also not faster to serialize and deserialize this way? Not to mention that there is an overhead of maintaining a schema-registry.

           
 
 

Lista de respuestas

8
 
vote
vote
La mejor respuesta
 

No necesita AVSC, Puede usar un archivo AVDL , que básicamente se ve igual que un POJO con solo los campos

  @namespace("com.example.mycode.avro") protocol ExampleProtocol {    record User {      long id;      string name;    } }   

que, cuando se usa el objetivo idl-protocol1 , creará este AVSC para usted, en lugar de escribirlo usted mismo.

  {   "type" : "record",   "name" : "User",   "namespace" : "com.example.mycode.avro",   "fields" : [ {     "name" : "id",     "type" : "long"   }, {     "name" : "name",     "type" : "string"   } ] }   

y también colocará un 9988777663 POJO User.java en su Classpath para usar en su código.


Si ya tuvo un POJO, no necesita usar archivos AVSC o AVDL. Hay bibliotecas para convertir a Pojos. Por ejemplo, usted < sólido> puede usar jackson , que no es solo para JSON, es probable que probablemente cree un .get("name")5 para Kafka, por ejemplo, o se encuentra si existe uno.

AVRO también tiene biblioteca incorporada basada en la reflexión .


Entonces a la pregunta: ¿Por qué Avro (para Kafka)?

Bueno, tener un esquema es un bueno . Piense en las tablas de RDBMS, puede explicar la tabla y verá todas las columnas. Mover a las bases de datos de documentos NOSQL, y pueden contener literalmente cualquier cosa, y este es el mundo JSON de Kafka.

Asumir que tiene consumidores en su clúster de Kafka que no tiene idea de lo que está en el tema, tienen que saber exactamente quién / qué se ha producido en un tema. Pueden probar el consumidor de la consola, y si fuera un texto plano como JSON, entonces tienen que descubrir algunos campos en los que están interesados, luego realizan operaciones .get("name")6666 ".get("name")66666666666666666. Ejecutar en un NPE cuando un campo no existe. Con AVRO, usted define claramente por defecto y campos anulables.

No se requiere para usar un registro de esquema, pero proporciona ese tipo de explain topic semántica para la analogía RDBMS. También le ahorra necesidad de enviar el esquema junto con cada mensaje, y el gasto del ancho de banda adicional en el tema de Kafka. Sin embargo, el registro no solo es útil para Kafka, ya que podría usarse para Spark, Flink, Hive, etc. Para todos los análisis de la ciencia de los datos que rodean la ingesta de datos de transmisión.


Suponiendo que usted quiso usar JSON, luego Intente usar MsgPack en lugar y es probable que vea un aumento en su Kafka Rendimiento y ahorre espacio en el disco en los corredores


También puede usar otros formatos como ProtoBuf o Thrift, como Uber ha comparado

 

You don't need AVSC, you can use an AVDL file, which basically looks the same as a POJO with only the fields

@namespace("com.example.mycode.avro") protocol ExampleProtocol {    record User {      long id;      string name;    } } 

Which, when using the idl-protocol goal of the Maven plugin, will create this AVSC for you, rather than you writing it yourself.

{   "type" : "record",   "name" : "User",   "namespace" : "com.example.mycode.avro",   "fields" : [ {     "name" : "id",     "type" : "long"   }, {     "name" : "name",     "type" : "string"   } ] } 

And it'll also place a SpecificData POJO User.java on your classpath for using in your code.


If you already had a POJO, you don't need to use AVSC or AVDL files. There are libraries to convert POJOs. For example, you can use Jackson, which is not only for JSON, you would just need to likely create a JacksonAvroSerializer for Kafka, for example, or find if one exists.

Avro also has built-in library based on reflection.


So to the question - why Avro (for Kafka)?

Well, having a schema is a good thing. Think about RDBMS tables, you can explain the table, and you see all the columns. Move to NoSQL document databases, and they can contain literally anything, and this is the JSON world of Kafka.

Let's assume you have consumers in your Kafka cluster that have no idea what is in the topic, they have to know exactly who/what has been produced into a topic. They can try the console consumer, and if it were a plaintext like JSON, then they have to figure out some fields they are interested in, then perform flaky HashMap-like .get("name") operations again and again, only to run into an NPE when a field doesn't exist. With Avro, you clearly define defaults and nullable fields.

You aren't required to use a Schema Registry, but it provides that type of explain topic semantics for the RDBMS analogy. It also saves you from needing to send the schema along with every message, and the expense of extra bandwidth on the Kafka topic. The registry is not only useful for Kafka, though, as it could be used for Spark, Flink, Hive, etc for all Data Science analysis surrounding streaming data ingest.


Assuming you did want to use JSON, then try using MsgPack instead and you'll likely see an increase in your Kafka throughput and save disk space on the brokers


You can also use other formats like Protobuf or Thrift, as Uber has compared

 
 
4
 
vote

Es una cuestión de velocidad y almacenamiento. Al serializar los datos, a menudo necesita transmitir el esquema real y, por lo tanto, esto causa un aumento del tamaño de carga útil.

                              Total Payload Size +-----------------+--------------------------------------------------+ |     Schema      |                 Serialised Data                  | +-----------------+--------------------------------------------------+   
El registro de esquema

Proporciona un repositorio centralizado para esquemas y metadatos para que todos los esquemas estén registrados en un sistema central. Este sistema centralizado permite a los productores solo incluir el ID del esquema en lugar del propio esquema completo (en formato de texto).

                        Total Payload Size +----+--------------------------------------------------+ | ID |                 Serialised Data                  | +----+--------------------------------------------------+   

Por lo tanto, la serialización se vuelve más rápida.

Además, el versionamiento del registro de esquema permite la aplicación de las políticas de datos que podrían ayudar a evitar que los esquemas más nuevos rompan la compatibilidad con las versiones existentes que podrían causar un tiempo de inactividad o cualquier otro problema importante en su tubería.


Algunos beneficios más del registro de esquema se explican a fondo en este artículo por confluencia .

 

It is a matter of speed and storage. When serializing data, you often need to transmit the actual schema and therefore, this cause an increase of payload size.

                            Total Payload Size +-----------------+--------------------------------------------------+ |     Schema      |                 Serialised Data                  | +-----------------+--------------------------------------------------+ 

Schema Registry provides a centralized repository for schemas and metadata so that all schemas are registered in a central system. This centralized system enables producers to only include the ID of the schema instead of the full schema itself (in text format).

                      Total Payload Size +----+--------------------------------------------------+ | ID |                 Serialised Data                  | +----+--------------------------------------------------+ 

Therefore, the serialisation becomes faster.

Furthermore, schema registry versioning enables the enforcement of data policies that might help to prevent newer schemas to break compatibility with existing versions that could potentially cause downtime or any other significant issues in your pipeline.


Some more benefits of Schema Registry are thoroughly explained in this article by Confluent.

 
 
   
   
1
 
vote

En primer lugar, Kafka no tiene idea del contenido de la llave / valor. Opera los bytes y su responsabilidad del cliente (productor / consumidor) al cuidado del pastel de DE / Serialización.

Las opciones más comunes hasta ahora parecen ser JSON, ProtoBUF y AVRO.

Lo que personalmente me gusta con Avro y por qué generalmente lo uso y recomiendo a los demás:

1) Es una serialización binaria compacta suficiente, con un esquema y tipos lógicos (que ayudan a distinguir solo un long de timestamp in long millis )

2) Los esquemas AVRO son muy descriptivos y perfectamente documentados

3) El soporte amplio entre la mayoría de los idiomas de programación de uso ampliamente utilizado es una necesidad!

4) Confluentes (y otros) Proporcionar un repositorio para los esquemas, un llamado "Registro de esquemas", para tener un almacenamiento centralizado para sus esquemas. En AVRO, el mensaje contiene solo la ID de versión de esquema, no el esquema en sí.

5) Si está utilizando Java, puede tener grandes beneficios de usar la generación de clase Base de Pojo desde el esquema.

Seguro que puede tener partes de estas con otras opciones. Debe intentar comparar todas las opciones que suite su uso en uso.

P.s. Mi consejo de opinión muy personal es: si no es un String , vaya a AVRO. Se aplica tanto para llaves y valores.

 

First of all - Kafka has no idea about the key/value content. It operates bytes and it's client (producer/consumer) responsibility to cake care of de/serialization.

The most common options so far seem to be JSON, protobuf and Avro.

What I personally like with Avro and why I usually use it and recommend to others:

1) It's a enough compact binary serialization, with a schema and logical types (which help distinguish just a regular long from timestamp in long millis)

2) the Avro schemas are very descriptive and perfectly documented

3) wide support among most of widely-used programming languages is a must!

4) Confluent (and others) provide a repository for schemas, a so-called "schema registry", to have a centralized storage for your schemas. In Avro, the message contains just the schema version ID, not the schema itself.

5) If you are using Java, you can have great benefits from using the POJO base class generation from the schema.

Sure you can have parts of these with other options. You should try and compare all the options that suite your use-case.

P.S. My very personal opinionated advice is: if it's not a String, go for Avro. Applies both for keys and values.

 
 

Relacionados problema

0  org.apache.kafka.connect.errors.dataexception: JSON no válido para el valor predeterminado de registro: NULL  ( Org apache kafka connect errors dataexception invalid json for record default v ) 
Tengo un tema de Kafka Avro generado con Kafkaavroserializer. Mis propiedades independientes son las siguientes. Estoy usando Confluente 4.0.0 para ejecutar...

0  Cómo encontrar qué Schema Registry POD / NODE es actualmente el maestro  ( How to find which schema registry pod node is currently the master ) 
He desplegado 3 vainas de registro de esquema en un clúster K8S. Estoy tratando de encontrar qué Schema Registry Pod está actuando actualmente como maestro. ...

0  Migrar Kafka Schema-Registro a New Kafka-Cluster  ( Migrate kafka schema registry to new kafka cluster ) 
Estamos realizando la migración de nuestro clúster de Kafka (creando el nuevo y migrando todos los temas, consumidores, productores allí). Tenemos un registro...

0  ¿Cómo funciona la evolución del esquema en el conector JDBC KAFKA?  ( How does schema evolution in jdbc kafka connector work ) 
He configurado la compatibilidad de mi firma de esquema confluente a Backward_Transitive. Estoy usando un conector JDBC confluente para tirar de cambios incre...

0  Fregadero de Kafka: Error de parada debido al error (org.apache.kafka.connect.cli.connectstandalone: ​​130)  ( Kafka sink error stopping due to error org apache kafka connect cli connectsta ) 
Estoy tratando de transmitir datos de un archivo de flujo a otro archivo. Funcionó anteriormente y, de repente, proporcionó el error como 1,2,3,...n6 . Han r...

1  No se puede escribir datos AVRO a Kafka con Python  ( Unable to write avro data to kafka using python ) 
Estoy usando kafka kafka_2.11-0.11.0.2 y confluencia versión 3.3.0 para el registro de esquema. He definido un esquema AVRO de la siguiente manera: { "na...

0  Kafka Connect - JDBC AVRO Conecte cómo define el registro de esquema personalizado  ( Kafka connect jdbc avro connect how define custom schema registry ) 
Estuve siguiendo Tutorial en Kafka Connect , y me pregunto si existe la posibilidad de definir un registro de esquema personalizado para un tema que los dato...

19  Integración de la transmisión estructurada de chispa con el registro de esquema confluente  ( Integrating spark structured streaming with the confluent schema registry ) 
Estoy usando una fuente de Kafka en la transmisión estructurada de chispa para recibir los registros de AVRO codificados confluentes. Tengo la intención de us...

1  Confluentes Kafka descansa campos opcionales  ( Confluent kafka rest optional fields ) 
Al publicar la carga útil AVRO al servicio Kafka-Rest, si uno de los campos en Value_Schema se definen con un valor predeterminado, y en los registros omiten ...

1  Configure la aplicación Kafka Streams para usar el registro de esquema confluente  ( Configure kafka streams application to use confluent schema registry ) 
Tengo una aplicación de Kafka Streams Java que procesa un tema Avro Kafka, hace algunos cambios en los datos y hundir el resultado procesado en AVRO en otro t...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos