Apache Avro:一個新的數據交換格式


原文: http://blog.cloudera.com/blog/2009/11/avro-a-new-format-for-data-interchange/

注:由於個人英語能力有限,翻譯不准確,請指出。英語好,如有意願一起翻譯一些博客,請加qq 583368684

Apache Avro 最近加入了Hadoop項目的大家庭。Avro定義了一個數據格式,從設計上支持數據密集型應用,並且為多編程語言提供該格式支持。

背景

我們希望數據驅動的應用是動態。人們應該能夠快速組合來自不同數據源的數據集。我們希望促進數據的新穎和創新探索。理想情況下,不需要大量的准備工作,人們應該能夠容易地將銷售點交易。網站訪問和外部提供的人口統計數據相關聯。這是可能的,使用腳本或者交互式工具。

當前的數據格式往往不是很好用。XML 和 JSON都有很強的表達性,但是他們太大了並且處理比較慢。當處理PB級別的數據,大小和速度很重要。

谷歌用Protocol Buffers 來解決(也有一些類似的系統,如Thrift)。谷歌已經將Protocol Buffers 開源,但是它不是我們理想的解決方案。

通用數據

使用Protocol Buffers,可以定義數據結構,然后生成可以有效讀取和寫入他們的代碼。但是,如果希望腳本語言用Protocol Buffers快速實現一個實驗,首先必須:獲取數據結構定義;然后生成對應的代碼;最后得到數據前要獲取代碼。這可能不是那么糟糕,但是如果希望要一個通用的工具,能夠留言所有的數據集合,它將不得不獲取每個數據集的數據結構定義,然后生成代碼和獲取代碼為每個數據集。這把本來應該簡單的事情變復雜了。

Avro的數據格式總是以易於處理的形式存儲數據結構與數據。Avro可以在運行時使用這些定義以通用的方式向應用程序呈現數據,而不是需要代碼生成。

代碼生成在Avro中是可選的。它在一些編程語言有時使用特定的數據結構,對應於經常序列化的數據類型是非常好用的。但是在像Pig和Hive這樣的腳本系統中,代碼生成將是一種負擔,所以Avro不需要它。

存儲全部的數據結構定義和數據的另外一個優勢是允許數據被更快更簡潔的寫入。Protocol Buffere 為數據添加注解,因此即使定義和數據不完全匹配,數據仍有可能被處理。然而這些注釋使得數據更大和更慢的被處理。Avro不需要這些注釋,使得Avro數據比其他序列化系統更小和更快地處理。

Avro Schemas

Avro 用JSON來定義數據結構的schema.例如一個二位點可以被定義為Avro record:

{
    "type": "record", "name": "Point",
     "fields":
     [
          {"name": "x", "type": "int"},
          {"name": "y", "type": "int"},
     ]
}

每個實例被序列化為兩個整數,沒有額外的記錄和注釋。整數使用可變長度的zig-zag 編碼寫入。因此,小的負數和整數能夠被寫僅僅需要兩個字節,100個點僅僅需要200個字節。

除了Record和數字類型,Avro還支持數組、map、枚舉、可變和固定長度的二進制字節數據和字符串。它還能定義一個容器文件格式,為了能夠為MapReduce和其他計算框架提供支持。詳細內容,請查看Avro文檔。

兼容性

應用的發展,隨着他們的發展,數據結構可能發生變化。我們希望新版本的應用程序仍然能夠處理舊版本創建的數據,反之亦然。Avro與Protocol Buffers 相同的方式處理這個問題。當應用程序不需要不存在的字段時,Avro提供一個指定的默認值,Avro忽略不需要但存在的數據。這不能處理所有的向后兼容問題。但它能非常容易的處理最常見的問題。

Avro也定義遠程過程調用協議(RPC).雖然在RPC中使用的數據類型和數據集中的數據類型不同,但是使用通用序列化系統仍然有用。數據密集型應用程序需要基於分布式RPC框架。所以我需要能夠處理數據集文件,也希望能夠用RPC。因此在公共基礎上構建這些,使得能夠編寫處理數據的代碼,但不能使用分布式框架來做的幾率大大降低。

和Hadoop的集成

我們希望在Hadoop的MapReduce中容易使用Avro數據。這仍然是一個正在進行中的工作。問題MAPREDUCE-1126和MAPREDUCE-815跟蹤這個

注意,Avro數據結構可以指定他們的排序順序,因此可以在一中編程語言中創建復雜的數據,然后可以用另外一中語言排序。沒有反序列化的排序也是有可能的,因此相當快。

我們希望Avro將取代Hadoop現有的RPC.Hadoop目前需要其客戶端和服務器運行完全相同的版本。我們希望Avro允許一個,列表一個單一的Hadoop應用程序,可以和運行不同版本的HDFS和MapReduce集群通信。

最后我們希望Avro允許Hadoop應用程序更容易使用Java以外的語言編寫。例如,一旦基於Avro,我們希望用像Python/C/C++支持原生的MapReduce和HDFS.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM