web-dev-qa-db-ja.com

AVROのバイナリエンコーディングはデータを圧縮しますか?

私たちのプロジェクトの1つでは、アプリケーション間でデータを転送するためにAVROでKafkaを使用しています。データはAVROオブジェクトに追加され、オブジェクトはバイナリエンコードされてKafkaに書き込まれます。バイナリエンコードをそのまま使用します。一般に、他の形式と比較して最小限の表現として言及されています。

データは通常JSON文字列であり、ファイルに保存すると、最大10Mbのディスクを使用します。ただし、ファイルが圧縮されている場合(.Zip)、使用されるKBはわずかです。このようなデータをKafkaに保存することに関心があるため、Kafkaトピックに書き込む前に圧縮を試みます。

バイナリエンコードされたメッセージの長さ(つまり、バイト配列の長さ)が測定されるとき、それはデータ文字列の長さに比例します。したがって、バイナリエンコーディングはサイズを縮小していないと思います。

バイナリエンコーディングがデータを圧縮するかどうか誰かに教えてもらえますか?そうでない場合、どうすれば圧縮を適用できますか?

ありがとう!

12
Pal

バイナリエンコーディングがデータを圧縮する場合は?

はい、いいえ、それはあなたのデータに依存します。

avroバイナリエンコーディング によると、yesは、ファイル内のデータ数に関係なく、_.avro_ファイルごとにスキーマを1回だけ保存します。したがって、JSONのキー名を何度も保存せずにスペースを節約できます。そして、avroシリアル化は、intを格納し、longを利用してビット圧縮を行います 可変長ジグザグ コーディング(smallのみ)値)。それ以外の場合、avroはデータを「圧縮」しません。

いいえ極端な場合、avroシリアル化されたデータが生データよりも大きくなる可能性があります。例えば。 1つのRecordを含む1つの_.avro_ファイルで、1つの文字列フィールドのみ。スキーマのオーバーヘッドは、キー名を保存する必要がないため、保存を無効にする可能性があります。

そうでない場合、どうすれば圧縮を適用できますか?

avro codecs によると、avroには組み込みの圧縮コーデックとオプションのコーデックがあります。オブジェクトコンテナファイルの書き込み中に1行追加するだけです。

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

または

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

snappyを使用するには、依存関係に_snappy-Java_ライブラリを含める必要があります。

19
zhaown

Kafkaにデータを保存する場合は、Kafkaプロデューサー圧縮サポート:

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

圧縮はコンシューマー側に対して完全に透過的であり、消費されたすべてのメッセージは自動的に解凍されます。

3
Xuan Huy Pham