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不須要它。oop

存儲所有的數據結構定義和數據的另一個優點是容許數據被更快更簡潔的寫入。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.

相關文章
相關標籤/搜索