- 아파치 에이브로는 특정 언어에 종속되지 않는 ‘언어 중립적 데이터 직렬화 시스템’이다.
- 하둡 창시자인 더그 커팅이 하둡 Writable (직렬화 방식)의 주요 단점인 언어 이식성을 해결하기 위해 만들어진 프로젝트다.
- 에이브로는 읽고 쓰는 시점에 스키마가 항상 존재한다고 가정하고 있다. 이렇게 하면 인코드한 값은 필드 식별자로 태깅할 필요가 없어 매우 간결한 인코딩이 가능하다.
- Avro Spec : 모든 구현체가 정의해야 하는 바이너리 포맷에 대한 자세한 내용
- API : 언어마다 다르게 작성함.
- Schema Resolution (해석) : 잘 정의되어 있다면, 읽는 데 사용되는 스키마와 쓰는 데 사용되는 스키마가 같지 않아도 된다. → 이게 바로 스키마 변형 (evolution) 메커니즘.
- 예를 들어, 과거의 데이터를 읽을 때 사용한 스키마에 새로운 필드를 추가할 수 있고
- 새로운 사용자는 새로운 필드가 추가된 데이터를 쓸 수 있다.
- 반대로 기존 사용자는 새로운 데이터를 보게 되는데, 이때 새로운 필드는 적당히 무시하고 기존 데이터 작업처럼 처리할 수 있다.
- Object Container Format 제공
- Avro Data File
- 스키마가 저장된 메타데이터 섹션을 포함하고 있어, 자신을 설명하는 파일이 된다.
- 압축과 분할 기능을 제공하여 MR 데이터 입력 포맷에 있어 매우 중요한 기능을 제공하고 있다고 볼 수 있음.
12.1 avro 자료형과 스키마
Primitive Types (기본)
Complex Types
- 제네릭 매핑 (generic mapping) → 모든 프로그래밍 언어는 런타임 직전에 스키마를 결정할 수 없을 때 동적 매핑을 사용하는데 이걸 자바에선 제네릭 매핑이라고 함.
- 구체적 매핑(specific mapping) → 데이터를 읽거나 쓰기 전에 스키마의 사본이 있을 때 유용한 최적화 방식. → 에이브로 스키마의 데이터를 표현하는 코드임.
- 자바는 리플렉션을 이용해 에이브로 자료형을 기존 자바 자료형으로 매핑하는 리플렉트 매핑을 지원한다. 리플렉트 매핑은 제네릭이나 구체적 매핑에 비해 느리지만, 에이브로가 자동으로 스키마를 유추하기 때문에 자료형 쉽게 정의가 가능하다.
12.2 인메모리 직렬화와 역직렬화
avro는 직렬화와 역직렬화 API를 지원한다. 따라서 메시지 ㅇ시스템과 같이 구성 포맷이 미리 정의된 기존 시스템과 에이브로를 쉽게 통합할 수 있다.