Apache Avro

Avro 정의

Avro란 Apache에서 만든 데이터 직렬화 프레임워크로, Apache Hadoop 및 Apache Kafka와 같은 분산 시스템에서 데이터를 효율적으로 저장하고 전송하기 위해 설계되었다. Avro의 가장 큰 특징이자 장점은, 효율성, 호환성, 언어 지원 이다.

주요 특징

Avro는 다음과 같은 주요 특징을 가진다.

  1. 스키마 기반 : Avro의 가장 큰 특징을 스키마 기반의 직렬화 이다. 데이터는 먼저 스키마를 정의하고, 그 후 해당 스키마에 따라 직렬화 된다. 이를 통해 데이터의 구조를 명확하게 정의하고, 데이터를 읽고 쓸 때, 오류를 방지할 수 있다.
  2. JSON을 통한 스키마 정의: Avro의 스키마는 JSON 형식으로 작성된다. 이 스키마에는 필드의 이름, 타입, 필수 여부 들이 정의된다.
  3. 고속 직렬화 및 역직렬화: Avro는 바이너리 형식으로 데이터를 직렬화 하여 크기를 최적화하고 빠른 성능을 제공한다. 이를 통해 대규모 데이터 처리 시스템에서 높은 성능을 요구하는 경우 유리하다.
  4. 언어 독립성: Avro는 다양한 프로그래밍 언어에서 지원된다.
  5. 스키마 진화: Avro는 데이터 스키마가 변경되는 경우에도 호환성을 유지할 수 있는 기능을 제공한다. 즉, 데이터 형식이 변경되더라도, 이전 버전의 데이터를 함쎄 처리할 수 있다. 이를 스키마 진화 (Schema Evolution) 이라고 한다.
  6. 압축: Avro는 바이너리 형식이므로, 데이터 크기가 적고 디스크 공간을 절약하는 데 유리하다. 또한, 데이터 압축을 지원하여 저장 공간을 더욱 효율적으로 사용할 수 있다.
  7. RPC 지원: Avro는 원격 프로시저 호출 (RPC)도 지원하며, 이는 분산 시스템에서의 서비스 간 통신을 효율적으로 처리할 수 있게 한다.

 

Avro의 예시

스키마 정의 예시

{
“type”: “record”,
“name”: “User”,
“fields”: [
{
“name”:”name”,
“type”:”string”
},
{
“name”: “age”,
“type”: “int”
}
]
}

 

데이터 예시

{ “name”:”John”, “age”:30 }

 

스키마 레지스트리 (Schema Registry)

스키마 레지스트리는 Avro 스키마를 중앙에서 관리하는 시스템이다. 주로 Kafka와 같은 분산 시스템에서 사용되며, 프로듀서와 컨슈머가 데이터를 교환할 때 일관된 스키마를 사용할 수 있도록 보장한다. 대표적으로 Confluent Schema Registry를 사용한다.

 

Java 에서의 활용

자바에서는 다양한 형태로 Avro 라이브러리를 활용할 수 있는 방법을 제공한다.

 

Avro (org.apache.avro:avro)

Java에서, Avro 직렬화 및 역 직렬화 의 핵심 역할을 하는 라이브러리다. Avro 파일 포멧을 정의하고, Avro 스키마를 관리하는 데 필요한 모든 기능을 제공한다.

사용 예시

implementation ‘org.apache.avro:avro:$VERSION’

Spring boot – Dependency Manager를 사용하더라도 버전을 명시해야 함.
https://mvnrepository.com/artifact/org.apache.avro/avro

 

Avro Kafka Serializer (org.apache.kafka:kafka-avro-serializer)

Kafka에서 Avro 데이터 포멧을 직렬화 및 역 직렬화 하는 기능을 수행한다. Avro (org.apache.avro:avro)에 의존하고, 그 위에서 직렬화/역직렬화 기능을 제공한다. 하지만, Avro 라이브러리를 직접 포함하고 있지 않으므로, 사용 시 두 라이브러리를 모두 포함 해야 한다.

사용 예시

  1. 의존성 추가

implementation ‘io.confluent:kafka-avro-serializer’

  1. 저장소 추가

repositories {
maven { url ‘https://packages.confluent.io/maven’ }
}

 

Spring boot – Dependency Manager를 사용하더라도 버전을 명시해야 함.
https://mvnrepository.com/artifact/io.confluent/kafka-avro-serializer/7.7.2

 

Avro Maven Plugin (com.commercehub.gracle.plugin.avro)

Avro 스키마를 Java 클래스로 변환하는 기능을 제공한다. 설정 구문을 통하여, Schema가 생성되는 위치나, 클래스가 생성되는 위치를 설정해 줘야 한다.

avro {
source(‘src/main/avro’) // Avro 스키마 파일 경로
outputDir = file(‘build/generated-avro-java’) // 생성될 Java 클래스 위치
fieldVisibility = ‘PUBLIC’ // 필드 접근성 설정
}

 

Java 클래스를 Avro Schema로 변환

Java 클래스를 Avro Schema로 변경하는 방법은 다음과 같다.

Java 코드에서 Avro Schema 생성

Avro 라이브러리를 통해 코드 상에서 Avro Schema를 생성할 수 있다. 생성은 다음과 같은 코드로 가능하다.

Schema schema = SpecificData.get().getSchema(MyAvroClass.class);
System.out.println(schema.toString(true));

 

Avro Schema Generation 도구

Avro Schema Generation 도구를 통해 생성도 가능하다. 외부 jar 파일로 제공되며, 해당 파일을 다운로드 하여, 아래와 같은 명령을 통해 생성 가능하다.

C#> java –jar avro-tools-1.10.2.jar complie schema <path-to-java-class> <output-directory>

 

Gradle – Avro 플러그인

Avro 플러그인을 사용하여 Java 클래스를 Avro 스키마로 변환하는 방법도 가능하다.

플러그인 추가

plugins {
id ‘com.commercehub.gradle.plugin.avro’ version ‘0.21.0’
}

 

의존성 추가

depeldencies {
implementation ‘org.apache.avro:avro’
}

 

생성 설정

avro {
enableGenerateSchema = true
source(‘src/main/java’) // 대상 클래스
outputDir = file(‘build/avro-schemas’) // 생성된 스키마 파일 위치
}

 

Avro Schema를 Java 클래스로 변환

역으로, Avro Schema를 Java 클래스로 변환하려면 다음과 같이 진행하면 된다.

Gradle – Avro 플러그인

Avro 플러그인을 사용하여 Java 클래스를 Avro 스키마로 변환하는 방법도 가능하다.

플러그인 추가

plugins {
id ‘com.commercehub.gradle.plugin.avro’ version ‘0.21.0’
}

 

의존성 추가

depeldencies {
implementation ‘org.apache.avro:avro’
}

 

생성 설정

avro {
source(‘src/main/avro’) // 스키마 파일이 위치하는 디렉토리 설정
outputDir = file(‘build/generated-avro-java’) // 생성된 스키마 파일 위치
enableGenerateSchema = true // java 클래스로부터 Avro 스키마 자동 생성 활성화
}

 

웹 저장소 등 외부에 존재할 경우

이때는, 스키마 다운로드를 위한 undercouch 플러그인을 추가하여 관리해 줄 수 있다.

플러그인 추가

plugins {
id ‘com.commercehub.gradle.plugin.avro’ version ‘0.21.0’
id ‘de.undercouch.download’ version ‘4.1.2’ // 파일 다운로드를 위한 플러그인
}

 

다운로드 태스크 추가

task downloadSchema(type: Download) {
src ‘https://example.com/your-schema.avsc’
desc file(‘src/main/avro/your-schema.avsc’
}

task downloadSchemaOtuehr(type: Download) {
src ‘https://example.com/your-schema-other.avsc’
desc file(‘src/main/avro/your-schema-other.avsc’

빌드 의존성 설정

task generateAvroClasses {
dependsOn downloadSchema, downloadSchemaOther, ‘generateAvro’
}

 

Avro 관련 플러그인 비교

Avro는 QueryDSL과 같이 특정 정보를 이용하여 클래스를 자동 생성해 주는 플러그인을 제공해 준다. 다만, 여러가지 단체에서 다양한 형태로 플러그인을 제공하고 있어, 이를 비교해 보고, 어떤 것을 사용하는 것이 효과적인가를 확인해 본다.

 

com.commercehub.gradle.plugin.avro

Gradle 환경에서 Avro 스키마 파일을 처리하여 Java 클래스를 생성하는 플러그인이다. 상당히 오래된 플러그인으로, 현재 2021년 0.99.99 버전으로 업데이트된 이후, 더 이상 업데이트가 되고 있지 않다.

주요 특징

  1. Gradle 환경에서 Avro 스키마 파일을 컴파일하여 Java 클래스를 생성한다.
  2. Avro maven 플러그인을 기반으로 하고 있으며, Avro 스키마를 Java 클래스로 변환하는데 최적화된 플러그인이다.

 

com.github.davidmc24.gradle.plugin.avro – Gradle 추천

Gradle 환경에서 Avro 스키마를 Java 클래스로 변환하는 작업을 담당한다. 현재도 지속적으로 업데이트 되고 있다. (2023년 10월 업데이트가 마지막임)

기능적으로는 위에서 기술한 com.commercehub.gradle.plugin.avro와 유사하다.

주요 특징

  1. Gradle에서 Avro 스키마 파일을 처리하는데 특화된 플러그인이다.
  2. Avro 스키마를 컴파일 하여 Java SpecificRecord 클래스를 생성한다.
  3. Gradle 빌드 시스템과 통합되어 빌드 시 자동으로 Avro 파일을 처리할 수 있도록 도와준다.

설치 예시

plugins {
id “com.github.davidmc24.gradle.plugin.avro” version “1.3.0”
}

avro {
source(“src/main/avro”)
outputDir = file(“build/generated-main-avro-java”)
}

버전 확인은 아래 링크에서 확인
https://mvnrepository.com/artifact/com.github.davidmc24.gradle.plugin/gradle-avro-plugin

org.apache.avro.avro-maven-plugin – Maven 추천

Maven을 사용하는 프로젝트에서 Avro 스키마 파일을 처리하여 Java 클래스를 생성하는 데 사용된다. Maven 기반의 프로젝트에서는 Maven 플러그인을 사용하여 빌드 시 Avro 스키마 파일을 Java 클래스로 변환한다.

주요 특징

  1. Maven을 사용하여 Avro 스키마 파일을 Java로 변환한다.
  2. Avro의 Maven 플러그인으로, Maven 빌드 도구와 통합되어 Avro 파일을 처리할 수 있다.
  3. schema.registry와의 통합 및 Avro 스키마 버전 관리를 지원할 수 있다.

설치 예시

<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>1.10.2</version>
<executions>
<execution>
<goals>
<goal>generate></goal>
</goals>
</execution>
</excutions>
</plugin>

 

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다