아브로
(Avro)는 아파치의 하둡 프로젝트에서 開發된
遠隔 프로시저 呼出
(RPC) 및 데이터
直列火
프레임워크이다. 資料型과
프로토콜
正義를 위해
JSON
을 使用하며 콤팩트 바이너里 포맷으로 데이터를 直列化한다. 主 用途는
아파치 하둡
에서 클라이언트→하둡
서비스
에 對해 永久 데이터를 위한 直列火 포맷과 하둡 노드 間 通信을 위한 와이어 포맷을 둘 다 提供하는 것이다.
스리프트
나
프로토콜 버퍼
와 비슷하지만
스키마
變更이 發生할 때(
政敵 資料型
言語를 위해 要求되지 않을 境遇) 코드 生成 프로그램의 實行을 要求하지 않는다.
아파치 스파크 SQL
은 데이터 소스로서 아브로에 接近할 수 있다.
[3]
아브로 오브젝트 컨테이너 파일
[
編輯
]
아브로 오브젝트 컨테이너 파일
[4]
은 다음으로 構成된다:
- 파일 헤더
- (파일 헤더에 이어서) 하나 以上의 파일 데이터 블록
파일 헤더는 다음으로 構成된다:
- 4바이트, ASCII 'O', 'b', 'j', 그리고 1.
- 파일 메타데이터 (스키마 正義 包含)
- 16바이트, 이 파일을 위해 任意 生成된 同期化 마커.
데이터 블록의 境遇 아브로는 2個의 直列火 인코딩을 規定한다:
[5]
바이너里, JSON. 大部分의 應用 프로그램들은 크기가 더 작고 더 빠르다는 理由로 李瑱 인코딩을 使用한다. 디버깅 및 웹 基盤 애플리케이션의 境遇 JSON 인코딩이 適切할 수 있다.
스키마 正義
[
編輯
]
아브로 스키마는 JSON을 使用하여 定義된다.
[6]
스키마는 遠視 資料型(null, boolean, int, long, float, double, bytes, string)과 複素數 資料型(record, enum, array, map, union, and fixed)으로 構成된다.
單純 스키마 예제:
{
"namespace"
:
"example.avro"
,
"type"
:
"record"
,
"name"
:
"User"
,
"fields"
:
[
{
"name"
:
"name"
,
"type"
:
"string"
},
{
"name"
:
"favorite_number"
,
"type"
:
[
"int"
,
"null"
]},
{
"name"
:
"favorite_color"
,
"type"
:
[
"string"
,
"null"
]}
]
}
直列化와 役職劣化
[
編輯
]
아브로의 데이터는 相應하는 스키마와 함께 貯藏할 수 있으며, 卽 미리 스키마를 알지 않고도 直列化된 項目을 읽을 수 있다는 이야기가 된다.
파이썬의 直列火, 役職劣化 코드 예제
[
編輯
]
예제는 다음과 같다.
[7]
直列火:
import
avro.schema
from
avro.datafile
import
DataFileReader
,
DataFileWriter
from
avro.io
import
DatumReader
,
DatumWriter
schema
=
avro
.
schema
.
parse
(
open
(
"user.avsc"
)
.
read
())
# need to know the schema to write
writer
=
DataFileWriter
(
open
(
"users.avro"
,
"w"
),
DatumWriter
(),
schema
)
writer
.
append
({
"name"
:
"Alyssa"
,
"favorite_number"
:
256
})
writer
.
append
({
"name"
:
"Ben"
,
"favorite_number"
:
7
,
"favorite_color"
:
"red"
})
writer
.
close
()
"users.avro" 파일은 JSON 및 콤팩트 바이너里 表現 데이터의 스키마를 包含할 것이다
[8]
:
$
od
-c
users.avro
0000000 O b j 001 004 026 a v r o . s c h e m
0000020 a 272 003 { " t y p e " : " r e c
0000040 o r d " , " n a m e s p a c e
0000060 " : " e x a m p l e . a v r o
0000100 " , " n a m e " : " U s e r
0000120 " , " f i e l d s " : [ { "
0000140 t y p e " : " s t r i n g " ,
0000160 " n a m e " : " n a m e " }
0000200 , { " t y p e " : [ " i n t
0000220 " , " n u l l " ] , " n a m
0000240 e " : " f a v o r i t e _ n u
0000260 m b e r " } , { " t y p e " :
0000300 [ " s t r i n g " , " n u l
0000320 l " ] , " n a m e " : " f a
0000340 v o r i t e _ c o l o r " } ] }
0000360 024 a v r o . c o d e c \b n u l l
0000400 \0 211 266 / 030 334 ? ** P 314 341 267 234 310 5 213
0000420 6 004 , \f A l y s s a \0 200 004 002 006 B
0000440 e n \0 016 \0 006 r e d 211 266 / 030 334 ? **
0000460 P 314 341 267 234 310 5 213 6
0000471
役職劣化:
reader
=
DataFileReader
(
open
(
"users.avro"
,
"r"
),
DatumReader
())
# no need to know the schema to read
for
user
in
reader
:
print
user
reader
.
close
()
위의 出力은 다음과 같다:
{
u
'favorite_color'
:
None
,
u
'favorite_number'
:
256
,
u
'name'
:
u
'Alyssa'
}
{
u
'favorite_color'
:
u
'red'
,
u
'favorite_number'
:
7
,
u
'name'
:
u
'Ben'
}
API 使用 言語
[
編輯
]
理論的으로 모든 言語가 아브로를 使用할 수 있으나 다음의 言語가 API를 갖추고 있다:
[9]
[10]
아브로 IDL
[
編輯
]
資料型 및 프로토콜 正義를 위해 JSON을 支援하는 것 外에도 아브로는 아브로 IDL(Avro IDL)이라는 이름의
인터페이스 정의 言語
(IDL) 文法의 實驗的인
[15]
支援을 包含하고 있다. 過去에는 GenAvro라는 이름이었던 이 포맷은 C/C++,
프로토콜 버퍼
等과 비슷한 文法을 갖춘 더 傳統的인 IDL, 프로그래밍 言語에 親熟한 使用者들에 依해 쉽게 採用되도록 設計되어 있다.
같이 보기
[
編輯
]
各州
[
編輯
]
追加 文獻
[
編輯
]