私たちのプロジェクトの1つでは、アプリケーション間でデータを転送するためにAVROでKafkaを使用しています。データはAVROオブジェクトに追加され、オブジェクトはバイナリエンコードされてKafkaに書き込まれます。バイナリエンコードをそのまま使用します。一般に、他の形式と比較して最小限の表現として言及されています。
データは通常JSON文字列であり、ファイルに保存すると、最大10Mbのディスクを使用します。ただし、ファイルが圧縮されている場合(.Zip)、使用されるKBはわずかです。このようなデータをKafkaに保存することに関心があるため、Kafkaトピックに書き込む前に圧縮を試みます。
バイナリエンコードされたメッセージの長さ(つまり、バイト配列の長さ)が測定されるとき、それはデータ文字列の長さに比例します。したがって、バイナリエンコーディングはサイズを縮小していないと思います。
バイナリエンコーディングがデータを圧縮するかどうか誰かに教えてもらえますか?そうでない場合、どうすれば圧縮を適用できますか?
ありがとう!
バイナリエンコーディングがデータを圧縮する場合は?
はい、いいえ、それはあなたのデータに依存します。
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
_ライブラリを含める必要があります。
Kafkaにデータを保存する場合は、Kafkaプロデューサー圧縮サポート:
ProducerConfig.set("compression.codec","snappy")
圧縮はコンシューマー側に対して完全に透過的であり、消費されたすべてのメッセージは自動的に解凍されます。