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 .