{{위키데이터 속성 추적}}
{{소프트웨어 정보
| name                   = 아파치 아브로
| logo                   = Apache Avro Logo 2023.svg
| screenshot             =
| caption                =
| collapsible            =
| developer              = [[아파치 소프트웨어 재단]]
| status                 = 개발 중
| released = {{시작 날짜와 나이|2009|11|02|df=yes}}<ref>{{웹 인용|url=https://blog.cloudera.com/blog/2009/11/avro-a-new-format-for-data-interchange/|title=Apache Avro: a New Format for Data Interchange|website=blog.cloudera.com|access-date=2019-03-10}}</ref>
| latest release version = 1.11.3
| latest release date = {{시작 날짜와 나이|2023|9|23}}<ref>{{웹 인용|url=https://avro.apache.org/releases.html|title=Apache Avro Releases|website=avro.apache.org|access-date=2023-09-23}}</ref>
| latest preview version =
| latest preview date    =
| operating_system       =
| programming language   =
| genre                  = [[원격 프로시저 호출]] 프레임워크
| license                = [[아파치 라이선스]] 2.0
| website                = {{url|//avro.apache.org/}}
}}
'''아브로'''(Avro)는 아파치의 하둡 프로젝트에서 개발된 [[원격 프로시저 호출]](RPC) 및 데이터 [[직렬화]] 프레임워크이다. 자료형과 [[통신 프로토콜|프로토콜]] 정의를 위해 [[JSON]]을 사용하며 콤팩트 바이너리 포맷으로 데이터를 직렬화한다. 주 용도는 [[아파치 하둡]]에서 클라이언트→하둡 [[서비스 (시스템 아키텍처)|서비스]]에 대해 영구 데이터를 위한 직렬화 포맷과 하둡 노드 간 통신을 위한 와이어 포맷을 둘 다 제공하는 것이다.

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

[[아파치 스파크|아파치 스파크 SQL]]은 데이터 소스로서 아브로에 접근할 수 있다.<ref>{{웹 인용|url=http://dataconomy.com/3-reasons-hadoop-analytics-big-deal/|title=3 Reasons Why In-Hadoop Analytics are a Big Deal - Dataconomy|author=|date=April 21, 2016|website=dataconomy.com}}</ref>

== 아브로 오브젝트 컨테이너 파일 ==
아브로 오브젝트 컨테이너 파일<ref>{{웹 인용|url=https://avro.apache.org/docs/current/spec.html#Object+Container+Files|title=Apache Avro™ Specification: Object Container Files|website=avro.apache.org|access-date=2016-09-27}}</ref>은 다음으로 구성된다:
* 파일 헤더
* (파일 헤더에 이어서) 하나 이상의 파일 데이터 블록

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

데이터 블록의 경우 아브로는 2개의 직렬화 인코딩을 규정한다:<ref>{{웹 인용|url=https://avro.apache.org/docs/current/spec.html#Encodings|title=Apache Avro™ Specification: Encodings|website=avro.apache.org|access-date=2016-09-27}}</ref> 바이너리, JSON. 대부분의 응용 프로그램들은 크기가 더 작고 더 빠르다는 이유로 이진 인코딩을 사용한다. 디버깅 및 웹 기반 애플리케이션의 경우 JSON 인코딩이 적절할 수 있다.

== 스키마 정의 ==
아브로 스키마는 JSON을 사용하여 정의된다.<ref>{{웹 인용|url=https://avro.apache.org/docs/current/gettingstartedpython.html#Defining+a+schema|title=Apache Avro™ Getting Started (Python)|website=avro.apache.org|access-date=2016-06-16|archive-date=2016-06-05|archive-url=https://web.archive.org/web/20160605204052/http://avro.apache.org/docs/current/gettingstartedpython.html#Defining+a+schema|url-status=}}</ref> 스키마는 원시 자료형(null, boolean, int, long, float, double, bytes, string)과 복소수 자료형(record, enum, array, map, union, and fixed)으로 구성된다.

단순 스키마 예제:
<syntaxhighlight lang="json">
 {
   "namespace": "example.avro",
   "type": "record",
   "name": "User",
   "fields": [
      {"name": "name", "type": "string"},
      {"name": "favorite_number",  "type": ["int", "null"]},
      {"name": "favorite_color", "type": ["string", "null"]}
   ]
 }
</syntaxhighlight>

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

=== 파이썬의 직렬화, 역직렬화 코드 예제 ===
예제는 다음과 같다.<ref>{{웹 인용|url=https://avro.apache.org/docs/current/gettingstartedpython.html|title=Apache Avro™ Getting Started (Python)|website=avro.apache.org|access-date=2016-06-16|archive-date=2016-06-05|archive-url=https://web.archive.org/web/20160605204052/http://avro.apache.org/docs/current/gettingstartedpython.html|url-status=}}</ref>

직렬화:
<syntaxhighlight lang="python">
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()
</syntaxhighlight>

"users.avro" 파일은 JSON 및 콤팩트 바이너리 표현 데이터의 스키마를 포함할 것이다<ref>{{웹 인용|url=https://avro.apache.org/docs/current/spec.html#Data+Serialization|title=Apache Avro™ Specification: Data Serialization|website=avro.apache.org|access-date=2016-06-16}}</ref>:

<syntaxhighlight lang="console">
$ 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
</syntaxhighlight>

역직렬화:

<syntaxhighlight lang="python">
reader = DataFileReader(open("users.avro", "r"), DatumReader())  # no need to know the schema to read
for user in reader:
    print user
reader.close()
</syntaxhighlight>

위의 출력은 다음과 같다:

<syntaxhighlight lang="python">
{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'}
</syntaxhighlight>

== API 사용 언어 ==
이론적으로 모든 언어가 아브로를 사용할 수 있으나 다음의 언어가 API를 갖추고 있다:<ref>{{웹 인용|url=https://github.com/phunt/avro-rpc-quickstart|title=GitHub - phunt/avro-rpc-quickstart: Apache Avro RPC Quick Start. Avro is a subproject of Apache Hadoop.|author=phunt|work=GitHub|accessdate=April 13, 2016}}</ref><ref>{{웹 인용| title = Supported Languages - Apache Avro - Apache Software Foundation| accessdate = 2016-04-21| url = https://cwiki.apache.org/confluence/display/AVRO/Supported+Languages}}</ref>
* [[C (프로그래밍 언어)|C]]
* [[C++]]
* [[C＃|C#]]<ref>{{웹 인용|url=https://issues.apache.org/jira/browse/AVRO/fixforversion/12316197|title=Avro: 1.5.1 - ASF JIRA|publisher=|accessdate=April 13, 2016}}</ref><ref>{{웹 인용|url=https://issues.apache.org/jira/browse/AVRO-533|title=[AVRO-533] .NET implementation of Avro - ASF JIRA|publisher=|accessdate=April 13, 2016}}</ref><ref>{{웹 인용|url=https://cwiki.apache.org/confluence/display/AVRO/Supported+Languages|title=Supported Languages|publisher=|accessdate=April 13, 2016}}</ref>
* [[Go (프로그래밍 언어)|Go]]
* [[하스켈]]<ref>{{웹 인용|url=https://github.com/GaloisInc/avro|title=Native Haskell implementation of Avro|publisher=Thomas M. DuBuisson, Galois, Inc.|accessdate=August 8, 2016}}</ref>
* [[자바 (프로그래밍 언어)|자바]]
* [[펄]]
* [[PHP]]
* [[파이썬]]
* [[루비 (프로그래밍 언어)|루비]]
* [[스칼라 (프로그래밍 언어)|스칼라]]

== 아브로 IDL ==
자료형 및 프로토콜 정의를 위해 JSON을 지원하는 것 외에도 아브로는 아브로 IDL(Avro IDL)이라는 이름의 [[인터페이스 정의 언어]](IDL) 문법의 실험적인<ref>{{웹 인용|url=http://avro.apache.org/docs/current/idl.html|title=Apache Avro 1.8.0 IDL|publisher=|accessdate=April 13, 2016|archive-date=2010-09-20|archive-url=https://web.archive.org/web/20100920001652/http://avro.apache.org/docs/current/idl.html|url-status=}}</ref> 지원을 포함하고 있다. 과거에는 GenAvro라는 이름이었던 이 포맷은 C/C++, [[프로토콜 버퍼]] 등과 비슷한 문법을 갖춘 더 전통적인 IDL, 프로그래밍 언어에 친숙한 사용자들에 의해 쉽게 채용되도록 설계되어 있다.

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

== 각주 ==
{{각주}}

== 추가 문헌 ==
* {{서적 인용
 | url = 
 | title = Hadoop: The Definitive Guide
 | isbn = 978-1-4493-8973-4
 |date=November 2010
 | first = Tom | last = White
}}

{{아파치}}
{{데이터 교환}}

{{기본정렬:아브로}}

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