Avro介紹

1. 介紹

Avro 是 Hadoop 中的一個(gè)子項(xiàng)目,也是 Apache 中一個(gè)獨(dú)立的項(xiàng)目跪楞,Avro 是一個(gè)基于二進(jìn)制數(shù)據(jù)傳輸高性能的中間件偿衰。在 Hadoop 的其他項(xiàng)目中泉孩,例如 HBase 和 Hive 的 Client 端與服務(wù)端的數(shù)據(jù)傳輸也采用了這個(gè)工具。Avro 是一個(gè)數(shù)據(jù)序列化的系統(tǒng)州丹,它可以提供:

  • 1、豐富的數(shù)據(jù)結(jié)構(gòu)類型
  • 2杂彭、快速可壓縮的二進(jìn)制數(shù)據(jù)形式
  • 3墓毒、存儲(chǔ)持久數(shù)據(jù)的文件容器
  • 4、遠(yuǎn)程過程調(diào)用 RPC
  • 5亲怠、簡(jiǎn)單的動(dòng)態(tài)語言結(jié)合功能所计,Avro 和動(dòng)態(tài)語言結(jié)合后,讀寫數(shù)據(jù)文件和使用 RPC 協(xié)議都不需要生成代碼团秽,而代碼生成作為一種可選的優(yōu)化只值得在靜態(tài)類型語言中實(shí)現(xiàn)主胧。

Avro 支持跨編程語言實(shí)現(xiàn)(C, C++, C#叭首,Java, Python, Ruby, PHP),Avro 提供著與諸如 Thrift 和 Protocol Buffers 等系統(tǒng)相似的功能讥裤,但是在一些基礎(chǔ)方面還是有區(qū)別的放棒,主要是:

  • 1、動(dòng)態(tài)類型:Avro 并不需要生成代碼己英,模式和數(shù)據(jù)存放在一起间螟,而模式使得整個(gè)數(shù)據(jù)的處理過程并不生成代碼、靜態(tài)數(shù)據(jù)類型等等损肛。這方便了數(shù)據(jù)處理系統(tǒng)和語言的構(gòu)造厢破。
  • 2、未標(biāo)記的數(shù)據(jù):由于讀取數(shù)據(jù)的時(shí)候模式是已知的治拿,那么需要和數(shù)據(jù)一起編碼的類型信息就很少了摩泪,這樣序列化的規(guī)模也就小了。
  • 3劫谅、不需要用戶指定字段號(hào):即使模式改變见坑,處理數(shù)據(jù)時(shí)新舊模式都是已知的,所以通過使用字段名稱可以解決差異問題捏检。

Avro 和動(dòng)態(tài)語言結(jié)合后荞驴,讀/寫數(shù)據(jù)文件和使用 RPC 協(xié)議都不需要生成代碼,而代碼生成作為一種可選的優(yōu)化只需要在靜態(tài)類型語言中實(shí)現(xiàn)贯城。

當(dāng)在 RPC 中使用 Avro 時(shí)熊楼,服務(wù)器和客戶端可以在握手連接時(shí)交換模式。服務(wù)器和客戶端有著彼此全部的模式能犯,因此相同命名字段鲫骗、缺失字段和多余字段等信息之間通信中需要解決的一致性問題就可以容易解決。

還有踩晶,Avro 模式是用 JSON(一種輕量級(jí)的數(shù)據(jù)交換模式)定義的执泰,這樣對(duì)于已經(jīng)擁有 JSON 庫的語言可以容易實(shí)現(xiàn)。

2. Schema

Schema 通過 JSON 對(duì)象表示合瓢。Schema 定義了簡(jiǎn)單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型坦胶,其中復(fù)雜數(shù)據(jù)類型包含不同屬性。通過各種數(shù)據(jù)類型用戶可以自定義豐富的數(shù)據(jù)結(jié)構(gòu)晴楔。

基本類型有:

類型 說明
null no value
boolean a binary value
int 32-bit signed integer
long 64-bit signed integer
float single precision (32-bit) IEEE 754 floating-point number
double double precision (64-bit) IEEE 754 floating-point number
bytes sequence of 8-bit unsigned bytes
string unicode character sequence

Avro定義了六種復(fù)雜數(shù)據(jù)類型:

  • Record:record 類型顿苇,任意類型的一個(gè)命名字段集合,JSON對(duì)象表示税弃。支持以下屬性:
    • name:名稱纪岁,必須
    • namespace
    • doc
    • aliases
    • fields:一個(gè) JSON 數(shù)組,必須
      • name
      • doc
      • type
      • default
      • order
      • aliases
  • Enum:enum 類型则果,支持以下屬性:
    • name:名稱幔翰,必須
    • namespace
    • doc
    • aliases
    • symbols:枚舉值漩氨,必須
  • Array:array 類型,未排序的對(duì)象集合遗增,對(duì)象的模式必須相同叫惊。支持以下屬性:
    • items
  • Map:map 類型,未排序的對(duì)象鍵/值對(duì)做修。鍵必須是字符串霍狰,值可以是任何類型,但必須模式相同饰及。支持以下屬性:
    • values
  • Fixed:fixed 類型蔗坯,一組固定數(shù)量的8位無符號(hào)字節(jié)。支持以下屬性:
    • name:名稱燎含,必須
    • namespace
    • size:每個(gè)值的 byte 長(zhǎng)度
    • aliases
  • Union:union 類型宾濒,模式的并集,可以用JSON數(shù)組表示屏箍,每個(gè)元素為一個(gè)模式绘梦。

每一種復(fù)雜數(shù)據(jù)類型都含有各自的一些屬性,其中部分屬性是必需的赴魁,部分是可選的谚咬。

舉例,一個(gè) linked-list of 64-bit 的值:

{
  "type": "record", 
  "name": "LongList",
  "aliases": ["LinkedLongs"],                      // old name for this
  "fields" : [
    {"name": "value", "type": "long"},             // each element has a long
    {"name": "next", "type": ["null", "LongList"]} // optional next element
  ]
}

一個(gè) enum 類型的:

{ "type": "enum",
  "name": "Suit",
  "symbols" : ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
}

array 類型:

{"type": "array", "items": "string"}

map 類型:

{"type": "map", "values": "long"}

fixed 類型:

{"type": "fixed", "size": 16, "name": "md5"}

這里需要說明Record類型中field屬性的默認(rèn)值尚粘,當(dāng)Record Schema實(shí)例數(shù)據(jù)中某個(gè)field屬性沒有提供實(shí)例數(shù)據(jù)時(shí),則由默認(rèn)值提供敲长,具體值見下表郎嫁。Union的field默認(rèn)值由Union定義中的第一個(gè)Schema決定。

avro type json type example
null null null
boolean boolean true
int,long integer 1
float,double number 1.1
bytes string “\u00FF”
string string “foo”
record object {“a”: 1}
enum string “FOO”
array array [1]
map object {“a”: 1}
fixed string “\u00ff”

3. 序列化/反序列化

Avro 指定兩種數(shù)據(jù)序列化編碼方式:binary encoding 和 Json encoding祈噪。使用二進(jìn)制編碼會(huì)高效序列化泽铛,并且序列化后得到的結(jié)果會(huì)比較小辑鲤;而 JSON 一般用于調(diào)試系統(tǒng)或是基于 WEB 的應(yīng)用盔腔。

TODO

4. Avro Tools

Avro Tools 不加參數(shù)時(shí):

$ java -jar /usr/lib/avro/avro-tools.jar
Version 1.7.6-cdh5.2.0 of Apache Avro
Copyright 2010 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

C JSON parsing provided by Jansson and
written by Petri Lehtinen. The original software is
available from http://www.digip.org/jansson/.
----------------
Available tools:
          cat  extracts samples from files
      compile  Generates Java code for the given schema.
       concat  Concatenates avro files without re-compressing.
   fragtojson  Renders a binary-encoded Avro datum as JSON.
     fromjson  Reads JSON records and writes an Avro data file.
     fromtext  Imports a text file into an avro data file.
      getmeta  Prints out the metadata of an Avro data file.
    getschema  Prints out schema of an Avro data file.
          idl  Generates a JSON schema from an Avro IDL file
 idl2schemata  Extract JSON schemata of the types from an Avro IDL file
       induce  Induce schema/protocol from Java class/interface via reflection.
   jsontofrag  Renders a JSON-encoded Avro datum as binary.
       random  Creates a file with randomly generated instances of a schema.
      recodec  Alters the codec of a data file.
  rpcprotocol  Output the protocol of a RPC service
   rpcreceive  Opens an RPC Server and listens for one message.
      rpcsend  Sends a single RPC message.
       tether  Run a tethered mapreduce job.
       tojson  Dumps an Avro data file as JSON, record per line or pretty.
       totext  Converts an Avro data file to a text file.
     totrevni  Converts an Avro data file to a Trevni file.
  trevni_meta  Dumps a Trevni file's metadata as JSON.
trevni_random  Create a Trevni file filled with random instances of a schema.
trevni_tojson  Dumps a Trevni file as JSON.

fromjson 命令語法如下:

$ java -jar /usr/lib/avro/avro-tools.jar fromjson
Expected 1 arg: input_file
Option                                  Description
------                                  -----------
--codec                                 Compression codec (default: null)
--level <Integer>                       Compression level (only applies to
                                          deflate and xz) (default: -1)
--schema                                Schema
--schema-file                           Schema File

將Avro數(shù)據(jù)加載到Spark 為例,將 json 數(shù)據(jù)轉(zhuǎn)換為 avro 數(shù)據(jù):

$ java -jar /usr/lib/avro/avro-tools.jar fromjson --schema-file twitter.avsc twitter.json > twitter.avro

設(shè)置壓縮格式:

$ java -jar /usr/lib/avro/avro-tools.jar fromjson --codec snappy --schema-file twitter.avsc twitter.json > twitter.snappy.avro

將 avro 轉(zhuǎn)換為 json:

$ java -jar /usr/lib/avro/avro-tools.jar tojson twitter.avro > twitter.json
$ java -jar /usr/lib/avro/avro-tools.jar tojson twitter.snappy.avro > twitter.json

獲取 avro 文件的 schema:

$ java -jar /usr/lib/avro/avro-tools.jar getschema twitter.avro > twitter.avsc
$ java -jar /usr/lib/avro/avro-tools.jar getschema twitter.snappy.avro > twitter.avsc

將 Avro 數(shù)據(jù)編譯為 Java:

$ java -jar /usr/lib/avro/avro-tools.jar compile schema twitter.avsc .

5. 文件結(jié)構(gòu)

原文地址:https://yq.aliyun.com/articles/25526

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末月褥,一起剝皮案震驚了整個(gè)濱河市弛随,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宁赤,老刑警劉巖舀透,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異决左,居然都是意外死亡愕够,警方通過查閱死者的電腦和手機(jī)走贪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惑芭,“玉大人坠狡,你說我怎么就攤上這事∷旄” “怎么了逃沿?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)漩勤。 經(jīng)常有香客問我感挥,道長(zhǎng),這世上最難降的妖魔是什么越败? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任触幼,我火速辦了婚禮,結(jié)果婚禮上究飞,老公的妹妹穿的比我還像新娘置谦。我一直安慰自己,他們只是感情好亿傅,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布媒峡。 她就那樣靜靜地躺著,像睡著了一般葵擎。 火紅的嫁衣襯著肌膚如雪谅阿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天酬滤,我揣著相機(jī)與錄音签餐,去河邊找鬼。 笑死盯串,一個(gè)胖子當(dāng)著我的面吹牛氯檐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播体捏,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼冠摄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了几缭?” 一聲冷哼從身側(cè)響起河泳,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎年栓,沒想到半個(gè)月后乔询,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡韵洋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年竿刁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黄锤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡食拜,死狀恐怖鸵熟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情负甸,我是刑警寧澤流强,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站呻待,受9級(jí)特大地震影響打月,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚕捉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一奏篙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迫淹,春花似錦秘通、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至应民,卻和暖如春话原,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诲锹。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工稿静, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辕狰。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像控漠,于是被迫代替她去往敵國(guó)和親蔓倍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349