2013-01-10 65 views
5

我剛接觸到這個Apache Avro(序列化框架)。我知道什麼是序列化,但爲什麼有單獨的框架LIK的Avro,節儉,協議緩衝器和數據序列化框架

  1. 爲什麼不能我們使用Java序列化的API,而不是這些獨立的框架,還有在Java serializatio API的任何瑕疵。

  2. 以下短語 「在模式更改時不需要運行代碼生成程序」在avro或任何其他序列化框架中有何含義。

請幫我理解所有這些!

回答

3

爲什麼不能我們使用Java序列化的API,而不是這些獨立的框架,還有在Java API serializatio的任何瑕疵。

我假設你可以使用Java序列化,除非你知道否則。

的主要原因不使用它是

    你知道有性能問題
  • 您需要跨語言交換數據。 Java序列化僅適用於Java。

不需要運行的代碼生成程序時的模式改變

我猜測,這意味着它可以讀取與舊的或新型號序列化數據,而無需重新生成和編譯代碼。即它容忍模型的變化。

順便說一句:因爲我使用的數據模型通常是a)非常簡單b)需要最高性能,我不使用框架編寫自己的序列化(或者編寫我自己的框架)如果您的模型非常簡單並不會經常改變。

總之,除非你知道你不能,否則首先嚐試Java序列化。

比較我在不同的Serialization Methods

+1

當你說過時,我支持你:先嚐試Java序列化。如果它拳頭,那麼太棒了!你不必做任何事情。然而,花幾分鐘的時間去思考哪些用途會對序列化產生影響。你需要它快嗎?要有一個小輸出?要簡單嗎?你需要輸出是自描述性的?你需要能夠推動信息的增量而不是序列化一個完整的對象?你真的需要二進制嗎?等等...... – Claudio

3

與Java序列化的問題所做的是,它不是不可知你的代碼。這意味着與你的課堂結構緊密相連。其他序列化框架爲您提供了一些靈活性/控制功能,可以繞過這種情況。儘管java標準機制有一種方法可以通過writeObject readObject方法來控制序列化,但其他fwks已經以更優雅的方式解決了這個問題。

其次,你不能用其他語言平臺來交換java序列化的輸出。

最後但並非最不重要的。 Java序列化不會產生更緊湊的結果,如果您執行諸如網絡傳輸數據之類的操作,可能會導致性能下降。其他協議(如Oracle的POF或協議緩衝區)更適合產生較小的輸出。

2. 關於你提到的第二個問題,我想這是什麼意思是,你並不需要運行的情況下生成代碼的任何預編譯作業您的序列化的類結構發生變化。我個人討厭強制某種編譯時代碼生成的框架。我討厭甚至不得不查看生成的代碼的麻煩,但那只是我和我的ocd。

+1

+1即使帶寬不是問題,Java序列化的性能也可能非常差。 –

+0

完全同意,檢查這個基準,它可能是有用的http://www.eishay.com/2009/03/more-on-benchmarking-java-serialization.html – Claudio

+0

是的,我做了一個包括ByteBuffer與回收的對象。 http://vanillajava.blogspot.co.uk/2011/10/serialization-using-bytebuffer-and.html –

1

Avro做得很好的兩個原則:Hadoop的MapReduce和通信協議結構。我將它用於MapReduce,我將大量數據實例放入單個文件,並符合特定模式;每條記錄都非常有效地存儲,標記描繪每條記錄。 Hadoop也使用它在Map和Reduce任務之間傳遞數據。比存儲字段名稱和數據更好。這些文件很容易分成多個部分在分佈式計算環境中進行處理。由於架構嵌入到文件中,因此讀者不必知道數據是什麼樣的。 Avro不受任何語言限制,並且有幾種語言API用於讀取Avro數據。如果你想寫出一個複雜的對象,那麼Java的序列化OR Avro就可以工作。如果你想要更多的力量和效率,並且使用數百萬個人實例,Avro是一個不錯的選擇。我相信你可以用Java API來做到這一點,但爲什麼這麼努力。

有機制通過模式解析規則發展模式。還有一些工具可以將你的java對象轉換爲模式。

最好的地方開始在這裏:http://avro.apache.org/docs/current/spec.html它可能需要幾個讀取才能獲得要點。嘗試使用Avro軟件包附帶的一些工具後再次閱讀。 Avro需要一段時間才能獲得成功。 JSON僅用作不用於存儲數據的數據規範語言。您可以使用API​​或使用JSON文件生成模式。很多的靈活性和足夠的繩索容易陷入困境 - 非常值得。