아파치 아브로

//avro.apache.org/ **아브로**(Avro)는 아파치의 하둡 프로젝트에서 개발된 원격 프로시저 호출(RPC) 및 데이터 직렬화 프레임워크이다. 자료형과 프로토콜 정의를 위해 JSON을 사용하며 콤팩트 바이너리 포맷으로 데이터를 직렬화한다. 주 용도는 아파치 하둡에서 클라이언트→하둡 서비스에 대해 영구 데이터를 위한 직렬화 포맷과 하둡 노드 간 통신을 위한 와이어 포맷을 둘 다 제공하는 것이다. 스리프트나 프로토콜 버퍼와 비슷하지만 스키마 변경이 발생할 때(정적 자료형 언어를 위해 요구되지 않을 경우) 코드 생성 프로그램의 실행을 요구하지 않는다. 아파치 스파크 SQL은 데이터 소스로서 아브로에 접근할 수 있다.website=dataconomy.com
# 아브로 오브젝트 컨테이너 파일
아브로 오브젝트 컨테이너 파일url-status=은 다음으로 구성된다: * 파일 헤더 * (파일 헤더에 이어서) 하나 이상의 파일 데이터 블록 파일 헤더는 다음으로 구성된다: * 4바이트, ASCII 'O', 'b', 'j', 그리고 1. * 파일 메타데이터 (스키마 정의 포함) * 16바이트, 이 파일을 위해 임의 생성된 동기화 마커. 데이터 블록의 경우 아브로는 2개의 직렬화 인코딩을 규정한다:url-status= 바이너리, JSON. 대부분의 응용 프로그램들은 크기가 더 작고 더 빠르다는 이유로 이진 인코딩을 사용한다. 디버깅 및 웹 기반 애플리케이션의 경우 JSON 인코딩이 적절할 수 있다.
# 스키마 정의
아브로 스키마는 JSON을 사용하여 정의된다.url-status= 스키마는 원시 자료형(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"]} ] }
# 직렬화와 역직렬화
아브로의 데이터는 상응하는 스키마와 함께 저장할 수 있으며, 즉 미리 스키마를 알지 않고도 직렬화된 항목을 읽을 수 있다는 이야기가 된다.
## 파이썬의 직렬화, 역직렬화 코드 예제
예제는 다음과 같다.url-status= 직렬화: 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 및 콤팩트 바이너리 표현 데이터의 스키마를 포함할 것이다url-status=: $ 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를 갖추고 있다:accessdate=April 13, 2016url = https://cwiki.apache.org/confluence/display/AVRO/Supported+Languages * C * C++ * C#accessdate=April 13, 2016accessdate=April 13, 2016accessdate=April 13, 2016 * Go * 하스켈accessdate=August 8, 2016 * 자바 * 펄 * PHP * 파이썬 * 루비 * 스칼라
# 아브로 IDL
자료형 및 프로토콜 정의를 위해 JSON을 지원하는 것 외에도 아브로는 아브로 IDL(Avro IDL)이라는 이름의 인터페이스 정의 언어(IDL) 문법의 실험적인url-status= 지원을 포함하고 있다. 과거에는 GenAvro라는 이름이었던 이 포맷은 C/C++, 프로토콜 버퍼 등과 비슷한 문법을 갖춘 더 전통적인 IDL, 프로그래밍 언어에 친숙한 사용자들에 의해 쉽게 채용되도록 설계되어 있다.
# 추가 문헌
* last = White 아파치 데이터 교환 위키데이터 속성 추적 기본정렬:아브로 분류:프로세스 간 통신 분류:응용 계층 프로토콜 분류:원격 프로시저 호출 분류:데이터 직렬화 포맷 분류:아파치 소프트웨어 재단 프로젝트