2014-11-03 105 views
10

在我們的一個項目中,我們使用Kafka和AVRO在應用程序之間傳輸數據。數據被添加到AVRO對象,並且對象被二進制編碼以寫入Kafka。我們使用二進制編碼,因爲它與其他格式相比通常被稱爲最小表示。AVRO壓縮數據的二進制編碼?

的數據通常是一個JSON字符串,當它被保存在一個文件,它使用到磁盤上的10 MB。但是,當文件被壓縮(.zip)時,它只使用幾個KB。我們關心的是將這些數據存儲在Kafka中,所以在寫入Kafka話題之前試圖壓縮。

當被測量的二進制編碼消息(即字節數組的長度)的長度,它正比於數據串的長度。所以我認爲二進制編碼不會縮小任何尺寸。

有人可以告訴我,如果二進制編碼壓縮數據?如果不是,我該如何應用壓縮?

謝謝!

回答

15

如果二進制編碼壓縮的數據?

是,也不是,這取決於你的數據。

avro binary encoding它僅適用於每一個.avro文件存儲架構一次,不管有多少DATAS在該文件中,從而節省一些空間W/O存儲JSON的鍵名多次。並avro序列化做一點壓縮與存儲int和長期利用variable-lengthzig-zag編碼(只爲值)。其餘的,avro不會「壓縮」數據。

在某些極端情況下,avro序列化的數據可能比原始數據大。例如。一個.avro文件與一個Record其中只有一個字符串字段。模式開銷可以使存儲不需要存儲密鑰名稱。

如果沒有,我怎麼能應用壓縮?

根據avro codecs,avro有內置的壓縮​​編解碼器和可選的壓縮編解碼器。只需添加一條線,而寫對象容器文件:

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

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

要使用snappy你需要包括snappy-java庫到您的依賴。

1

如果您打算存儲在卡夫卡的數據,可以考慮使用卡夫卡生產壓縮支持:

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

壓縮與消費端完全透明,所有消費的消息被自動解壓縮。