아파치 아브로
![]() | |
개발자 | 아파치 소프트웨어 재단 |
---|---|
발표일 | 2009년 11월 2일[1] |
안정화 버전 | 1.11.3
/ 2023년 9월 23일[2] |
저장소 | |
종류 | 원격 프로시저 호출 프레임워크 |
라이선스 | 아파치 라이선스 2.0 |
상태 | 개발 중 |
웹사이트 | avro |
아브로(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, 프로그래밍 언어에 친숙한 사용자들에 의해 쉽게 채용되도록 설계되어 있다.
같이 보기
[편집]각주
[편집]- ↑ “Apache Avro: a New Format for Data Interchange”. 《blog.cloudera.com》. 2019년 3월 10일에 확인함.
- ↑ “Apache Avro Releases”. 《avro.apache.org》. 2023년 9월 23일에 확인함.
- ↑ “3 Reasons Why In-Hadoop Analytics are a Big Deal - Dataconomy”. 《dataconomy.com》. 2016년 4월 21일.
- ↑ “Apache Avro™ Specification: Object Container Files”. 《avro.apache.org》. 2016년 9월 27일에 확인함.
- ↑ “Apache Avro™ Specification: Encodings”. 《avro.apache.org》. 2016년 9월 27일에 확인함.
- ↑ “Apache Avro™ Getting Started (Python)”. 《avro.apache.org》. 2016년 6월 5일에 원본 문서에서 보존된 문서. 2016년 6월 16일에 확인함.
- ↑ “Apache Avro™ Getting Started (Python)”. 《avro.apache.org》. 2016년 6월 5일에 원본 문서에서 보존된 문서. 2016년 6월 16일에 확인함.
- ↑ “Apache Avro™ Specification: Data Serialization”. 《avro.apache.org》. 2016년 6월 16일에 확인함.
- ↑ phunt. “GitHub - phunt/avro-rpc-quickstart: Apache Avro RPC Quick Start. Avro is a subproject of Apache Hadoop.”. 《GitHub》. 2016년 4월 13일에 확인함.
- ↑ “Supported Languages - Apache Avro - Apache Software Foundation”. 2016년 4월 21일에 확인함.
- ↑ “Avro: 1.5.1 - ASF JIRA”. 2016년 4월 13일에 확인함.
- ↑ “[AVRO-533] .NET implementation of Avro - ASF JIRA”. 2016년 4월 13일에 확인함.
- ↑ “Supported Languages”. 2016년 4월 13일에 확인함.
- ↑ “Native Haskell implementation of Avro”. Thomas M. DuBuisson, Galois, Inc. 2016년 8월 8일에 확인함.
- ↑ “Apache Avro 1.8.0 IDL”. 2010년 9월 20일에 원본 문서에서 보존된 문서. 2016년 4월 13일에 확인함.
추가 문헌
[편집]- White, Tom (November 2010). 《Hadoop: The Definitive Guide》. ISBN 978-1-4493-8973-4.