
簡介
Apache Avro是一個數(shù)據(jù)序列化方法。
Avro提供:
- 豐富的數(shù)據(jù)結(jié)構(gòu)。
- 緊湊、高效的二進(jìn)制數(shù)據(jù)格式。
- 容器文件,用于存儲持久數(shù)據(jù)。
- 遠(yuǎn)程過程調(diào)用(RPC)。
- 易于集成到動態(tài)語言的特性。
- 無論是讀寫數(shù)據(jù)文件,還是使用或?qū)崿F(xiàn)RPC協(xié)議,都無需代碼生成。代碼生成是一個優(yōu)化選項且只對靜態(tài)類型語言的實現(xiàn)有意義。
Schema
Avro依賴于schema。當(dāng)讀取Avro數(shù)據(jù)時,總是能夠獲取到寫入該數(shù)據(jù)時用到的schema。這樣一來,每次寫入數(shù)據(jù)都無需多余的開銷,進(jìn)而加快序列化速度、減小序列的大小。在動態(tài)的、腳本式語言中使用Avro也會變得更加容易,因為數(shù)據(jù)配合它的schema可以進(jìn)行完整的自我描述。
當(dāng)Avro數(shù)據(jù)被存入一個文件時,它的schema也會隨之存入。隨后,文件可以被任何程序處理。如果讀取數(shù)據(jù)的程序期望另一個schema,這也容易解決,因為兩個schema同時可以獲取到。
當(dāng)把Avro用于RPC時,客戶端和服務(wù)器在連接握手時互換schema。(這一點還可以優(yōu)化,對于大部分調(diào)用而言,實際上不會傳輸schema)??蛻舳撕头?wù)器都擁有對方的全部的schema,因此,在通信中的命名域、缺失域、附加域等都可以很容易被處理。
Avro schema是使用JSON定義的。在已經(jīng)存在JSON庫的語言中實現(xiàn)起來會更加方便。
同類比較
Thrift、Protocol Buffers等也提供了和Avro類似的功能。Avro區(qū)別于它們的主要方面如下:
- 動態(tài)類型:Avro不要求代碼生成。數(shù)據(jù)總是和schema一起,無需代碼生成和靜態(tài)數(shù)據(jù)類型等就可以完整解析。這有助于在多種語言中構(gòu)建通用的數(shù)據(jù)處理方法。
- 無標(biāo)記數(shù)據(jù):由于讀取數(shù)據(jù)時總可以獲取到schema,因此,極少的類型信息會被編碼到數(shù)據(jù)中。這樣使得序列化之后的大小更小。
- 無手動分配的域標(biāo)識:當(dāng)一個schema發(fā)生變化,處理數(shù)據(jù)時新的和舊的schema都可以獲取到。所以,二者的差異使用域名即可解決。
參考鏈接
原始英文鏈接:http://avro.apache.org/docs/1.8.1/