2014-11-03 5 views
10

In einem unserer Projekte verwenden wir Kafka mit AVRO, um Daten über Anwendungen hinweg zu übertragen. Daten werden zu einem AVRO-Objekt hinzugefügt, und das Objekt ist binär codiert, um nach Kafka zu schreiben. Wir verwenden die binäre Kodierung, wie sie im Allgemeinen als eine minimale Darstellung im Vergleich zu anderen Formaten erwähnt wird.Komprimiert binäre Codierung von AVRO Daten?

Die Daten sind in der Regel eine JSON-Zeichenkette, und wenn sie in einer Datei gespeichert werden, werden bis zu 10 MB Disk benötigt. Wenn die Datei jedoch komprimiert ist (.zip), verwendet sie nur wenige KB. Es geht uns darum, solche Daten in Kafka zu speichern, also vor dem Schreiben auf ein Kafka-Thema zu komprimieren.

Wenn die Länge der binärcodierten Nachricht (d. H. Länge des Byte-Arrays) gemessen wird, ist sie proportional zur Länge der Datenfolge. Ich nehme also an, dass die Binärcodierung keine Größe reduziert.

Könnte mir jemand sagen, ob Binärcodierung Daten komprimiert? Wenn nicht, wie kann ich Kompression anwenden?

Danke!

Antwort

15

Wenn Binärcodierung Daten komprimiert?

Ja und nein, es hängt von Ihren Daten ab.

Nach avro binary encoding, ja es speichert nur das Schema einmal für jede .avro Datei, egal wie viele Daten in der Datei, damit etwas Platz sparen w/o oft JSON Schlüsselnamen zu speichern. Und Avro-Serialisierung eine etwas Kompression mit Speichern von Int und lange Nutzung variable-lengthzig-zag Codierung (nur für kleine Werte). Im Übrigen "komprimiert" Avro keine Daten.

Nein für einige Extremfälle avro serialisierte Daten könnten größer sein als Rohdaten. Z.B. eine .avro Datei mit einer Record in der nur ein String-Feld. Der Schema-Overhead kann die Speicherung verhindern, ohne dass der Schlüsselname gespeichert werden muss.

Wenn nicht, wie kann ich Kompression anwenden?

Gemäß avro codecs hat avro einen eingebauten Komprimierungs-Codec und optional einen. Nur eine Zeile hinzufügen, während Objekt Container-Dateien zu schreiben:

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

oder

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

snappy Sie snappy-java Bibliothek in Ihre Abhängigkeiten enthalten verwenden müssen.

1

Wenn Sie Ihre Daten auf Kafka zu speichern, prüfen, mit Kafka Hersteller Komprimierung: mit Verbraucherseite

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

Die Kompression völlig transparent ist, alle verbrauchten Nachrichten automatisch unkomprimiert sind.