아파치 아브로
아브로(Avro)는 아파치의 하둡 프로젝트에서 개발된 원격 프로시저 호출(RPC) 및 데이터 직렬화 프레임워크이다. 자료형과 프로토콜 정의를 위해 JSON을 사용하며 콤팩트 바이너리 포맷으로 데이터를 직렬화한다. 주 용도는 아파치 하둡에서 클라이언트→하둡 서비스에 대해 영구 데이터를 위한 직렬화 포맷과 하둡 노드 간 통신을 위한 와이어 포맷을 둘 다 제공하는 것이다. 스리프트나 프로토콜 버퍼와 비슷하지만 스키마 변경이 발생할 때(정적 자료형 언어를 위해 요구되지 않을 경우) 코드 생성 프로그램의 실행을 요구하지 않는다. 아파치 스파크 SQL은 데이터 소스로서 아브로에 접근할 수 있다.[3] 아브로 오브젝트 컨테이너 파일아브로 오브젝트 컨테이너 파일[4]은 다음으로 구성된다:
파일 헤더는 다음으로 구성된다:
데이터 블록의 경우 아브로는 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, 프로그래밍 언어에 친숙한 사용자들에 의해 쉽게 채용되도록 설계되어 있다. 같이 보기각주
추가 문헌
|
Portal di Ensiklopedia Dunia