2014-11-03 13 views
10

In uno dei nostri progetti utilizziamo Kafka con AVRO per trasferire i dati tra le applicazioni. I dati vengono aggiunti a un oggetto AVRO e l'oggetto è codificato in binario per scrivere su Kafka. Usiamo la codifica binaria in quanto viene generalmente indicata come una rappresentazione minima rispetto ad altri formati.La codifica binaria di AVRO comprime i dati?

I dati sono in genere una stringa JSON e quando viene salvata in un file, utilizza fino a 10 Mb di disco. Tuttavia, quando il file è compresso (.zip), utilizza solo pochi KB. Siamo preoccupati di memorizzare tali dati in Kafka, quindi proviamo a comprimerli prima di scrivere su un argomento di Kafka.

Quando viene misurata la lunghezza del messaggio codificato in binario (vale a dire la lunghezza della matrice di byte), è proporzionale alla lunghezza della stringa di dati. Quindi presumo che la codifica binaria non stia riducendo alcuna dimensione.

Qualcuno potrebbe dirmi se la codifica binaria comprime i dati? In caso contrario, come posso applicare la compressione?

Grazie!

risposta

15

Se la codifica binaria comprime i dati?

Sì e no, dipende dai dati.

Secondo avro binary encoding, per esso memorizza solo lo schema una volta per ogni file .avro, indipendentemente da quanti dati in quel file, e quindi risparmiare spazio w/o la memorizzazione di nome della chiave molte volte JSON. E la serializzazione avro fa un po 'di compressione con la memorizzazione int e long leveraging variable-lengthzig-zag codifica (solo per valori piccoli). Per il resto, avro non "comprime" i dati.

No perché in alcuni casi estremi i dati serializzati potrebbero essere più grandi dei dati grezzi. Per esempio. un file .avro con uno Record in cui solo un campo stringa. Il sovraccarico dello schema può vanificare il salvataggio da non è necessario memorizzare il nome della chiave.

In caso contrario, come posso applicare la compressione?

Secondo avro codecs, avro ha codec di compressione incorporato e quelli opzionali. Basta aggiungere una riga, mentre la scrittura di file oggetto contenitore:

DataFileWriter.setCodec(CodecFactory.deflateCodec(6)); // using deflate

o

DataFileWriter.setCodec(CodecFactory.snappyCodec()); // using snappy codec

Per utilizzare snappy è necessario includere snappy-java libreria nelle vostre dipendenze.

1

Se si prevede di memorizzare i dati su Kafka, è possibile utilizzare il supporto di compressione produttore Kafka:

ProducerConfig.set("compression.codec","snappy") 

La compressione è totalmente trasparente con il lato del consumatore, tutti consumati messaggi sono automaticamente non compresso.