아파치 아브로

위키백과, 우리 모두의 백과사전.

아파치 아브로
개발자아파치 소프트웨어 재단
발표일2009년 11월 2일(14년 전)(2009-11-02)[1]
안정화 버전
1.11.3 / 2023년 9월 23일(6개월 전)(2023-09-23)[2]
저장소
종류원격 프로시저 호출 프레임워크
라이선스아파치 라이선스 2.0
상태개발 중
웹사이트avro.apache.org

아브로(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, 프로그래밍 언어에 친숙한 사용자들에 의해 쉽게 채용되도록 설계되어 있다.

같이 보기[편집]

각주[편집]

  1. “Apache Avro: a New Format for Data Interchange”. 《blog.cloudera.com》. 2019년 3월 10일에 확인함. 
  2. “Apache Avro Releases”. 《avro.apache.org》. 2023년 9월 23일에 확인함. 
  3. “3 Reasons Why In-Hadoop Analytics are a Big Deal - Dataconomy”. 《dataconomy.com》. 2016년 4월 21일. 
  4. “Apache Avro™ Specification: Object Container Files”. 《avro.apache.org》. 2016년 9월 27일에 확인함. 
  5. “Apache Avro™ Specification: Encodings”. 《avro.apache.org》. 2016년 9월 27일에 확인함. 
  6. “Apache Avro™ Getting Started (Python)”. 《avro.apache.org》. 2016년 6월 5일에 원본 문서에서 보존된 문서. 2016년 6월 16일에 확인함. 
  7. “Apache Avro™ Getting Started (Python)”. 《avro.apache.org》. 2016년 6월 5일에 원본 문서에서 보존된 문서. 2016년 6월 16일에 확인함. 
  8. “Apache Avro™ Specification: Data Serialization”. 《avro.apache.org》. 2016년 6월 16일에 확인함. 
  9. phunt. “GitHub - phunt/avro-rpc-quickstart: Apache Avro RPC Quick Start. Avro is a subproject of Apache Hadoop.”. 《GitHub》. 2016년 4월 13일에 확인함. 
  10. “Supported Languages - Apache Avro - Apache Software Foundation”. 2016년 4월 21일에 확인함. 
  11. “Avro: 1.5.1 - ASF JIRA”. 2016년 4월 13일에 확인함. 
  12. “[AVRO-533] .NET implementation of Avro - ASF JIRA”. 2016년 4월 13일에 확인함. 
  13. “Supported Languages”. 2016년 4월 13일에 확인함. 
  14. “Native Haskell implementation of Avro”. Thomas M. DuBuisson, Galois, Inc. 2016년 8월 8일에 확인함. 
  15. “Apache Avro 1.8.0 IDL”. 2010년 9월 20일에 원본 문서에서 보존된 문서. 2016년 4월 13일에 확인함. 

추가 문헌[편집]