아파치 아브로

아브로(Avro)는 아파치의 하둡 프로젝트에서 개발된 원격 프로시저 호출(RPC) 및 데이터 직렬화 프레임워크이다. 자료형과 프로토콜 정의를 위해 JSON을 사용하며 콤팩트 바이너리 포맷으로 데이터를 직렬화한다. 주 용도는 아파치 하둡에서 클라이언트→하둡 서비스에 대해 영구 데이터를 위한 직렬화 포맷과 하둡 노드 간 통신을 위한 와이어 포맷을 둘 다 제공하는 것이다.

스리프트나 프로토콜 버퍼와 비슷하지만 스키마 변경이 발생할 때(정적 자료형 언어를 위해 요구되지 않을 경우) 코드 생성 프로그램의 실행을 요구하지 않는다.

아파치 스파크 SQL은 데이터 소스로서 아브로에 접근할 수 있다.

 아브로 오브젝트 컨테이너 파일 
아브로 오브젝트 컨테이너 파일은 다음으로 구성된다:
 파일 헤더
 (파일 헤더에 이어서) 하나 이상의 파일 데이터 블록

파일 헤더는 다음으로 구성된다:
 4바이트, ASCII 'O', 'b', 'j', 그리고 1.
 파일 메타데이터 (스키마 정의 포함)
 16바이트, 이 파일을 위해 임의 생성된 동기화 마커.

데이터 블록의 경우 아브로는 2개의 직렬화 인코딩을 규정한다: 바이너리, JSON. 대부분의 응용 프로그램들은 크기가 더 작고 더 빠르다는 이유로 이진 인코딩을 사용한다. 디버깅 및 웹 기반 애플리케이션의 경우 JSON 인코딩이 적절할 수 있다.

 스키마 정의 
아브로 스키마는 JSON을 사용하여 정의된다. 스키마는 원시 자료형(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"]}
 ]
 }

 직렬화와 역직렬화 
아브로의 데이터는 상응하는 스키마와 함께 저장할 수 있으며, 즉 미리 스키마를 알지 않고도 직렬화된 항목을 읽을 수 있다는 이야기가 된다.

 파이썬의 직렬화, 역직렬화 코드 예제 
예제는 다음과 같다.

직렬화:
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 및 콤팩트 바이너리 표현 데이터의 스키마를 포함할 것이다:

$ 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를 갖추고 있다:
 C
 C++
 C#
 Go
 하스켈
 자바
 펄
 PHP
 파이썬
 루비
 스칼라

 아브로 IDL 
자료형 및 프로토콜 정의를 위해 JSON을 지원하는 것 외에도 아브로는 아브로 IDL(Avro IDL)이라는 이름의 인터페이스 정의 언어(IDL) 문법의 실험적인 지원을 포함하고 있다. 과거에는 GenAvro라는 이름이었던 이 포맷은 C/C++, 프로토콜 버퍼 등과 비슷한 문법을 갖춘 더 전통적인 IDL, 프로그래밍 언어에 친숙한 사용자들에 의해 쉽게 채용되도록 설계되어 있다.

 같이 보기 
 데이터 직렬화 포맷 비교
 아파치 스리프트
 프로토콜 버퍼
 CBOR

 각주 

 추가 문헌 
 

분류:프로세스 간 통신
분류:응용 계층 프로토콜
분류:원격 프로시저 호출
분류:데이터 직렬화 포맷
분류:아파치 소프트웨어 재단 프로젝트