各個序列化框架(Java序 列化、Avro 序列化、Kyro)

Java 序列化

Java  提供了一種對象序列化的機制,該機制中,一個對象可以被表示爲一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。

將序列化對象寫入文件之後,可以從文件中讀取出來,並且對它進行反序列化,也就是說,對象的類型信息、對象的數據,還有對象中的數據類型可以用來在內存中新建對象。

整個過程都是 Java 虛擬機(JVM)獨立的,也就是說,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象。

java 通過實現 Serializable 接口實現序列化。

  • 只支持 Java 語言的序列化
  • 序列化和反序列化性能低
  • 序列化產出的數據很大(尤其在數據量大時體現比較明顯)

Kyro

Kryo 是一個快速高效的 Java 二進制對象圖序列化框架。該項目的目標是傳輸快、數據量小和易於使用的API。在任何需要持久化對象的時候,不管是文件、數據庫還是網絡,這個項目都很有用。

官文介紹,Kryo序列化機制比Java序列化機制性能提高10倍左右

Kryo 還可以執行自動的深度和深度複製/克隆。這是直接從對象複製到對象,而不是從對象複製到字節再複製到對象。

如何在 Spark 中使用 Kryo 序列化:Spark 中的 Kryo 磁盤序列化

Avro

Avro 是一個數據序列化系統,提供了

  • 豐富的數據結構
  • 一種緊湊、快速的二進制數據格式
  • 用於存儲持久數據的容器文件。
  • 遠程過程調用(RPC)。
  • 與動態語言的簡單集成。讀取或寫入數據文件不需要代碼生成,也不需要使用或實現RPC協議。代碼生成作爲一種可選的優化,只值得爲靜態類型語言實現。

Schemas

Avro 依賴於模式。當讀取 Avro 數據時,寫入數據時使用的模式始終存在。這使得每個數據的寫入沒有每個值的開銷,使得序列化既快又小。這也促進了動態腳本語言的使用,因爲數據及其模式是完全自描述的。

當 Avro 數據存儲在一個文件中時,它的模式也隨之存儲,這樣以後任何程序都可以處理這些文件。如果讀取數據的程序需要不同的模式,那麼可以很容易地解決這個問題,因爲兩個模式都存在。

在 RPC 中使用 Avro 時,客戶機和服務器在連接握手中交換模式。(這可以進行優化,因此對於大多數調用,實際上不傳輸模式。)由於客戶機和服務器都具有對方的完整模式,所以相同命名字段、缺少字段、額外字段等之間的通信都可以很容易地解決。

Avro 模式是用 JSON 定義的。這有助於在已經擁有 JSON 庫的語言中實現。

與其他系統的比較

Avro 提供了與系統類似的功能,如 Thrift、Protocol Buffers 等。Avro 在以下幾個基本方面與這些系統不同。

  • 動態類型:Avro 不需要生成這些代碼。數據總是伴隨着一個模式,該模式允許對數據進行完全處理,而不需要代碼生成、靜態數據類型等。這有助於構建通用的數據處理系統和語言。
  • 未標識數據:由於在讀取數據時存在模式,因此需要用數據編碼的類型信息要少得多,從而導致序列化的大小更小。
  • 沒有手動分配的字段ID:當模式更改時,處理數據時總是同時存在舊模式和新模式,因此可以使用字段名象徵性地解決差異。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章