Format Atlas

비교

Avro와 Protocol Buffers

Apache Avro는 데이터를 writer 스키마와 연결하고 reader 스키마에 따라 해석합니다. Protocol Buffers(Protobuf)는 `.proto` 정의와 필드 번호에서 코드를 생성하고 번호가 포함된 바이너리 wire 형식으로 메시지를 인코딩합니다.

어떤 형식을 선택해야 할까요?

스키마가 데이터와 함께 이동하고 여러 런타임에서 writer/reader 스키마 해석이 유용하면 Avro를 고려하세요. `.proto`에서 타입 코드를 생성해 RPC나 서비스 경계에서 메시지를 교환하는 시스템에는 Protobuf가 잘 맞습니다.

적합한 경우 Avro

정의된 스키마로 레코드 교환

  • 스키마 버전을 관리하는 이벤트와 데이터 파이프라인

적합한 경우 Protocol Buffers 스키마 파일

Protocol Buffers 메시지 구조 정의 · 여러 프로그래밍 언어에서 공유할 데이터 계약 작성

  • protoc로 언어별 코드 생성
  • RPC 및 서비스 간 통신 메시지 정의

기본 정보

항목AvroProtocol Buffers 스키마 파일
확장자.avro.proto
MIME 유형application/avrotext/plain
주요 용도정의된 스키마로 레코드 교환Protocol Buffers 메시지 구조 정의 · 여러 프로그래밍 언어에서 공유할 데이터 계약 작성
여는 방법Avro 지원 도구로 스키마, 필드, 형식 및 레코드를 확인하세요.텍스트 편집기나 Protocol Buffers 지원 IDE에서 엽니다. 문법과 import를 확인하려면 프로젝트에서 사용하는 버전과 설정으로 protoc 컴파일을 실행합니다.
내보내기 또는 변환JSON이나 Parquet으로 변환할 때 필드명, 형식, null, 논리 유형, 레코드 수 및 스키마 호환성을 확인하세요.다른 스키마 형식으로 옮길 때는 유형, 필드 번호, 기본값, 열거형 값, 호환성 의미를 먼저 대응시킨 뒤 코드를 생성하고 실제 데이터를 테스트합니다. 확장자를 .json이나 바이너리 형식으로 바꾸는 것만으로는 변환되지 않습니다.

용도별 선택

스키마 버전을 관리하는 이벤트와 데이터 파이프라인

정의된 스키마로 레코드 교환

Avro

protoc로 언어별 코드 생성

Protocol Buffers 메시지 구조 정의 · 여러 프로그래밍 언어에서 공유할 데이터 계약 작성

Protocol Buffers 스키마 파일

RPC 및 서비스 간 통신 메시지 정의

Protocol Buffers 메시지 구조 정의 · 여러 프로그래밍 언어에서 공유할 데이터 계약 작성

Protocol Buffers 스키마 파일

핵심 사항 1

Avro Object Container File은 writer 스키마와 데이터 블록을 함께 저장할 수 있습니다. Protobuf wire data에는 스키마 정의가 없으므로 `.proto` 파일이나 descriptor를 별도로 배포하고 관리해야 합니다.

차이 자세히 보기

핵심 사항 2

Avro는 writer와 reader 스키마 사이의 해석을 규정합니다. Protobuf는 필드 번호를 wire 식별자로 사용하며 삭제된 번호를 재사용하지 않는 등의 진화 규칙을 따릅니다.

차이 자세히 보기

차이 자세히 보기

파일에 writer 스키마를 넣고 reader가 스키마를 해석해야 하면 Avro를 사용하세요. 생성된 메시지 클래스와 안정적인 필드 번호 계약이 맞으면 Protobuf를 사용하세요. 둘 다 호환성 관리가 필요하며 실제 구버전/신버전 조합을 필요한 방향으로 테스트하세요.

  • Avro 컨테이너 파일에는 스키마와 데이터 블록을 넣을 수 있습니다. Protobuf 바이너리 메시지는 일치하는 스키마나 descriptor 없이는 자체 설명적이지 않습니다.
  • Avro는 규칙에 따라 스키마 차이를 해석합니다. Protobuf 호환성은 필드 번호, wire type, presence 의미, 안전한 진화 관행에 달립니다.
  • 두 wire 형식은 서로 바꿔 읽을 수 없습니다. union/oneof, optional과 presence, 기본값, enum, unknown field, logical type, 필드 번호와 타입 변경을 매핑하고 실제 구·신 클라이언트로 테스트하세요.

자주 묻는 질문

Avro와 Protobuf가 서로의 바이너리 파일을 직접 읽을 수 있나요?

아니요. 인코딩이 다릅니다. 변환하려면 필드와 타입을 명시적으로 매핑하고 기본값, presence, unknown field, 스키마 진화를 확인해야 합니다.

자세히 보기

참고 자료 및 사양