Avro概述
為了透過網路傳輸資料或將其持久儲存,您需要序列化資料。在Java和Hadoop提供的序列化API之前,我們有一個特殊的實用程式,稱為Avro,這是一種基於模式的序列化技術。
本教程將教您如何使用Avro序列化和反序列化資料。Avro為各種程式語言提供庫。在本教程中,我們將使用Java庫演示示例。
什麼是Avro?
Apache Avro是一個與語言無關的資料序列化系統。它由Hadoop之父Doug Cutting開發。由於Hadoop的可寫類缺乏語言可移植性,Avro變得非常有用,因為它處理可以被多種語言處理的資料格式。Avro是Hadoop中序列化資料的首選工具。
Avro具有基於模式的系統。與它的讀寫操作關聯的是一個與語言無關的模式。Avro序列化具有內建模式的資料。Avro將資料序列化為緊湊的二進位制格式,任何應用程式都可以對其進行反序列化。
Avro使用JSON格式宣告資料結構。目前,它支援Java、C、C++、C#、Python和Ruby等語言。
Avro模式
Avro嚴重依賴其模式。它允許在沒有預先了解模式的情況下寫入任何資料。它序列化速度快,生成的序列化資料大小較小。模式與Avro資料一起儲存在一個檔案中,以便進一步處理。
在RPC中,客戶端和伺服器在連線過程中交換模式。這種交換有助於相同名稱的欄位、缺失的欄位、額外的欄位等之間的通訊。
Avro模式使用JSON定義,簡化了在具有JSON庫的語言中的實現。
與Avro類似,Hadoop中還有其他序列化機制,例如Sequence Files、Protocol Buffers和Thrift。
與Thrift和Protocol Buffers的比較
Thrift和Protocol Buffers是與Avro最具競爭力的庫。Avro與這些框架的不同之處在於:
Avro根據需要支援動態型別和靜態型別。Protocol Buffers和Thrift使用介面定義語言(IDL)來指定模式及其型別。這些IDL用於生成用於序列化和反序列化的程式碼。
Avro內置於Hadoop生態系統中。Thrift和Protocol Buffers並非內置於Hadoop生態系統中。
與Thrift和Protocol Buffer不同,Avro的模式定義使用JSON,而不是任何專有的IDL。
屬性 | Avro | Thrift & Protocol Buffer |
---|---|---|
動態模式 | 是 | 否 |
內置於Hadoop | 是 | 否 |
JSON模式 | 是 | 否 |
無需編譯 | 是 | 否 |
無需宣告ID | 是 | 否 |
前沿技術 | 是 | 否 |
Avro的功能
以下是Avro的一些突出功能:
Avro是一個與語言無關的資料序列化系統。
它可以被多種語言處理(目前為C、C++、C#、Java、Python和Ruby)。
Avro建立二進位制結構化格式,既可壓縮又可分割。因此,它可以有效地用作Hadoop MapReduce作業的輸入。
Avro提供豐富的資料結構。例如,您可以建立一個包含陣列、列舉型別和子記錄的記錄。這些資料型別可以在任何語言中建立,可以在Hadoop中處理,結果可以饋送到第三種語言。
Avro模式使用JSON定義,方便在已具有JSON庫的語言中實現。
Avro建立一個名為Avro資料檔案的自描述檔案,其中它將資料及其模式儲存在元資料部分。
Avro也用於遠端過程呼叫(RPC)。在RPC期間,客戶端和伺服器在連線握手過程中交換模式。
Avro的一般工作原理
要使用Avro,您需要遵循以下工作流程:
步驟1 - 建立模式。在這裡,您需要根據您的資料設計Avro模式。
步驟2 - 將模式讀入您的程式。這可以透過兩種方式完成:
透過生成與模式對應的類 - 使用Avro編譯模式。這將生成與模式對應的類檔案
透過使用解析器庫 - 您可以使用解析器庫直接讀取模式。
步驟3 - 使用Avro提供的序列化API進行資料序列化,該API位於org.apache.avro.specific包中。
步驟4 - 使用Avro提供的反序列化API進行資料反序列化,該API位於org.apache.avro.specific包中。