제퍼넷 로고

AWS Glue Schema Registry를 사용하여 Amazon MSK 및 Amazon Kinesis Data Streams에서 JSON 스키마 발전

시간

데이터는 엄청난 속도로 생산, 스트리밍 및 소비되고 있으며 그 속도는 앞으로 기하급수적으로 증가할 것으로 예상됩니다. 특히 JSON은 스트리밍 기술 및 워크로드에서 가장 널리 사용되는 데이터 형식입니다. 애플리케이션, 웹 사이트 및 머신이 Apache Kafka 및 Amazon Kinesis 데이터 스트림, 데이터 생산자와 데이터 소비자를 분리하는 고가용성 전송 계층 역할을 하므로 팀이 JSON 스키마를 조정하고 발전시키는 것이 점점 더 어려워질 수 있습니다. 필드를 추가 또는 제거하거나 하나 이상의 기존 필드에서 데이터 유형을 변경하면 신중한 데이터 처리 없이 데이터 품질 문제와 다운스트림 애플리케이션 오류가 발생할 수 있습니다. 팀은 이러한 스키마 변경으로부터 보호하기 위해 사용자 지정 도구, 복잡한 코드, 지루한 프로세스 또는 신뢰할 수 없는 문서에 의존합니다. 이는 변경 관리 프로세스를 오류가 발생하기 쉬운 상태로 만들 수 있는 사람의 감독에 대한 의존도가 높습니다. 일반적인 솔루션은 데이터 생산자와 소비자가 조정된 방식으로 스키마 변경의 유효성 검사를 수행할 수 있도록 하는 스키마 레지스트리입니다. 이를 통해 비즈니스 요구 사항이 시간이 지남에 따라 변화함에 따라 위험 없이 발전할 수 있습니다.

XNUMXD덴탈의 AWS Glue 스키마 레지스트리, 서버리스 기능 AWS 접착제, 이제 JSON 스키마에 대해 스트리밍 데이터를 검증하고 안정적으로 발전시킬 수 있습니다. 스키마 레지스트리는 데이터 품질과 개발자 생산성을 크게 향상시킬 수 있는 무료 기능입니다. 이를 통해 방어적인 코딩 및 팀 간 조정을 제거하고 다운스트림 애플리케이션 오류를 줄이며 여러 AWS 서비스에 통합된 레지스트리를 사용할 수 있습니다. 각 스키마는 호환성 모드의 가드레일 내에서 버전을 지정할 수 있어 개발자가 JSON 스키마를 안정적으로 발전시킬 수 있는 유연성을 제공합니다. 또한 Schema Registry는 데이터를 압축 형식으로 직렬화할 수 있으므로 데이터 전송 및 저장 비용을 절약할 수 있습니다.

이 게시물은 JSON 스키마용 스키마 레지스트리를 사용하는 방법을 보여주고 이를 Kinesis Data Streams 및 Apache Kafka와 함께 사용하는 방법의 예를 제공합니다. Apache Kafka 용 Amazon Managed Streaming (아마존 MSK).

솔루션 개요

이 게시물에서는 저장, 검증 및 발전을 위한 솔루션을 안내합니다. JSON 스키마 AWS Glue 스키마 레지스트리에서. 스키마는 다음에서 사용됩니다. 아파치 카프카 생성 및 소비하는 동안 Kinesis Data Streams 애플리케이션 JSON 객체. 또한 새 필드를 사용하여 새 버전의 스키마가 생성될 때 어떤 일이 발생하는지 보여줍니다.

다음 다이어그램은 솔루션 워크플로를 보여줍니다.

이 솔루션을 구현하는 단계는 다음과 같습니다.

  1. 새 레지스트리를 만들고 다음을 사용하여 스키마를 등록합니다. AWS 클라우드 포메이션 주형.
  2. 이전 버전과 호환되는 AWS Glue 콘솔을 사용하여 스키마의 새 버전을 생성합니다.
  3. 다음을 수행하는 생산자 애플리케이션을 빌드합니다.
    1. 스키마 버전 중 하나를 준수하는 JSON 객체를 생성합니다.
    2. JSON 객체를 바이트 배열로 직렬화합니다.
    3. 스키마 레지스트리에서 해당 스키마 버전 ID를 가져와서 동일한 바이트 배열로 인코딩합니다.
    4. Kinesis 데이터 스트림 또는 Apache Kafka 주제를 통해 인코딩된 바이트 배열을 보냅니다.
  4. 다음을 수행하는 소비자 애플리케이션을 빌드합니다.
    1. Kinesis 데이터 스트림 또는 Apache Kafka 주제를 통해 인코딩된 바이트 배열을 수신합니다.
    2. 스키마 버전 ID를 디코딩하고 스키마 레지스트리에서 해당 스키마를 가져옵니다.
    3. 바이트 배열을 원래 JSON 개체로 역직렬화합니다.
    4. 필요에 따라 JSON 객체를 사용합니다.

사용된 스키마에 대한 설명

이 게시물에서는 다음 스키마로 시작합니다. 스키마는 세 가지 주요 데이터를 포함하는 일기 예보 개체입니다. location, temperaturetimestamp. 세 가지 모두 필수 필드이지만 스키마는 추가 필드를 허용합니다( additionalProperties 플래그)와 같은 windSpeed or precipitation 제작자가 그들을 포함하려는 경우. 그만큼 location field는 두 개의 문자열 필드가 있는 객체입니다. citystate. 둘 다 필수 필드이며 스키마는 이 개체 내에서 추가 필드를 허용하지 않습니다.

{ "$id": "https://example.com/weather-report.schema.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "WeatherReport", "type": "object", "properties": { "location": { "type": "object", "properties": { "city": { "type": "string", "description": "Name of the city where the weather is being reported." }, "state": { "type": "string", "description": "Name of the state where the weather is being reported." } }, "additionalProperties": false, "required": [ "city", "state" ] }, "temperature": { "type": "integer", "description": "Temperature in Farenheit." }, "timestamp": { "description": "Timestamp in epoch format at which the weather was noted.", "type": "integer" } }, "additionalProperties": true, "required": [ "location", "temperature", "timestamp" ]
}

위의 스키마를 사용하면 유효한 JSON 객체는 다음과 같습니다.

{ "location": { "city": "Phoenix", "state": "Arizona" }, "temperature": 115, "windSpeed": 50, "timestamp": 1627335205
}

AWS CloudFormation으로 배포

빠른 시작을 위해 제공된 CloudFormation 스택을 배포할 수 있습니다. CloudFormation 템플릿은 계정에 다음 리소스를 생성합니다.

  • 레지스트리 – 레지스트리는 스키마의 컨테이너입니다. 레지스트리를 사용하면 스키마를 구성하고 애플리케이션에 대한 액세스 제어를 관리할 수 있습니다. 레지스트리에는 레지스트리 내의 스키마 작업에 대한 다양한 액세스 권한을 구성하고 설정할 수 있는 Amazon 리소스 이름(ARN)이 있습니다.
  • 개요 – 스키마는 데이터 레코드의 구조와 형식을 정의합니다. 스키마는 신뢰할 수 있는 데이터 게시, 소비 또는 저장을 위한 버전 지정 사양입니다. 각 스키마에는 여러 버전이 있을 수 있습니다. 버전 관리는 스키마에 적용되는 호환성 규칙에 의해 관리됩니다. 새 스키마 버전 등록 요청은 성공하기 전에 스키마 레지스트리에서 이 규칙에 대해 검사합니다.

AWS CloudFormation을 사용하지 않고 이러한 리소스를 수동으로 생성하려면 다음을 참조하십시오. 레지스트리 생성스키마 생성.

사전 조건

전제 조건으로 다음 단계를 완료해야 합니다.

  1. AWS 계정을 생성합니다. 이 게시물에서는 필요한 AWS 리소스를 us-east-1 or us-west-2 지역. 아직 가입하지 않았다면 다음 작업을 완료하세요.
    1. 계정을 만드십시오. 지침은 다음을 참조하십시오. AWS에 가입하십시오.
    2. 를 생성 AWS 자격 증명 및 액세스 관리 (IAM) 사용자. 지침은 다음을 참조하십시오. AWS 계정에서 IAM 사용자 생성.
  2. 왼쪽 메뉴에서 발사 스택 CloudFormation 스택을 시작하려면:

새로 등록된 스키마 검토

검토하자 레지스트리 그리고 개요 AWS Glue 콘솔에서.

  1. AWS Glue 콘솔에 로그인하고 적절한 리전을 선택합니다.
  2. $XNUMX Million 미만 데이터 카탈로그선택한다. 스키마 레지스트리.
  3. 선택 GsrBlogRegistry 스키마 레지스트리.
  4. 선택 GsrBlogSchema 개요.
  5. 왼쪽 메뉴에서 버전 1.

JSON 스키마 버전 세부 정보와 해당 정의를 볼 수 있습니다. 참고로 호환성 모드 선택된 것은 하위 호환성. 우리는 다음 섹션에서 그 목적을 봅니다.

새로운 이전 버전과 호환되는 버전을 만들어 스키마를 발전시키십시오.

이 섹션에서는 지금까지 생성된 것을 취하고 새 스키마 버전 추가 무결성을 그대로 유지하면서 스키마를 발전시킬 수 있는 방법을 보여줍니다.

새 스키마 버전을 추가하려면 이전 섹션에서 계속하여 다음 단계를 완료하십시오.

  1. 스키마 버전 세부정보 페이지에서 선택 새 버전 등록.
  2. 내부 properties ~ 내의 개체 location 객체(뒤에 state 필드), 새로 추가 country 필드는 다음과 같습니다.
    "country": { "type": "string", "description": "Name of the country where the weather is being reported." }

스키마에 대해 선택한 호환성 모드는 이전 버전과의 호환성이므로 이 새 필드를 필수 필드로 만들지 않는 것이 중요합니다. 그렇게 하면 스키마 레지스트리가 이 새 버전에 실패합니다.

  1. 왼쪽 메뉴에서 버전 등록.

이제 생산자가 원할 경우 위치 개체 내에 선택적 국가 필드를 포함할 수 있는 새 버전의 스키마가 있습니다.

AWS Glue 스키마 레지스트리 사용

이 섹션에서는 Kinesis Data Streams 또는 Apache Kafka와 함께 스키마 레지스트리를 사용하는 단계를 안내합니다.

사전 조건

전제 조건으로 다음 단계를 완료해야 합니다.

  1. AWS 자격 증명 구성 로컬 컴퓨터에서.
  2. 설치 메이븐 로컬 컴퓨터에서.
  3. 에서 응용 프로그램 코드를 다운로드하십시오. GitHub의 레포.
  4. 패키지 빌드:
    mvn clean package

Kinesis Data Streams와 함께 스키마 레지스트리 사용

Kinesis 생산자 코드를 실행하여 스키마 레지스트리에서 할당한 스키마 ID와 연결된 JSON 메시지를 생성합니다.

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kinesis.RunKinesisProducer" -Dexec.args="<<KINESIS_DATA_STREAM_NAME>>"

이 명령은 다음 출력을 반환합니다.

Putting 1 record into <<KINESIS_DATA_STREAM_NAME>>
Sent message 0
Putting 1 record into <<KINESIS_DATA_STREAM_NAME>>
Sent message 1
Putting 1 record into <<KINESIS_DATA_STREAM_NAME>>
Sent message 2
Successfully produced 3 messages to a stream called <<KINESIS_DATA_STREAM_NAME>>

Kinesis 소비자 코드를 실행하여 스키마 ID가 있는 JSON 메시지를 수신하고, 스키마 레지스트리에서 스키마를 가져온 후 다음을 확인합니다.

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kinesis.RunKinesisConsumer" -Dexec.args="<<KINESIS_DATA_STREAM_NAME>>"

이 명령은 수신 및 디코딩된 JSON 레코드와 함께 다음 출력을 반환합니다.

Number of Records received: 1
[JsonDataWithSchema(schema={"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":true,"title":"WeatherReport","type":"object","properties":{"temperature":{"description":"Temperature in Farenheit.","type":"integer"},"location":{"additionalProperties":false,"type":"object","properties":{"city":{"description":"Name of the city where the weather is being reported.","type":"string"},"state":{"description":"Name of the state where the weather is being reported.","type":"string"}},"required":["city","state"]},"timestamp":{"description":"Timestamp in epoch format at which the weather was noted.","type":"integer"}},"required":["location","temperature","timestamp"],"$id":"https://example.com/weather-report.schema.json"}, payload={"temperature":89,"location":{"city":"Orlando","state":"Florida"},"timestamp":1627335205})]

Apache Kafka와 함께 스키마 레지스트리 사용

다운로드한 GitHub 리포지토리 폴더의 루트에서 Kafka 클러스터에 대한 연결 매개변수를 사용하여 구성 파일을 생성합니다.

# Kafka
bootstrap.servers=localhost:9092

Kafka 생산자 코드를 실행하여 스키마 레지스트리에서 할당한 스키마 ID와 연결된 JSON 메시지를 생성합니다.

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kafka.RunKafkaProducer" -Dexec.args="<<CONFIG_FILE_NAME>><< TOPIC_NAME>>"

이 명령은 다음 출력을 반환합니다.

Sent message 0
Sent message 1
Sent message 2
Successfully produced 3 messages to a topic called <<TOPIC_NAME>>

Kafka 소비자 코드를 실행하여 스키마 ID가 있는 JSON 메시지를 사용하고 스키마 레지스트리에서 스키마를 가져온 다음 유효성을 검사합니다.

mvn exec:java -Dexec.mainClass="com.amazonaws.services.gsr.samples.json.kafka.RunKafkaConsumer" -Dexec.args="<<CONFIG_FILE_NAME>> <<TOPIC_NAME>>"

이 명령은 수신 및 디코딩된 JSON 레코드와 함께 다음 출력을 반환합니다.

Received message: key = message-0, value = JsonDataWithSchema(schema={"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":true,"title":"WeatherReport","type":"object","properties":{"temperature":{"description":"Temperature in Farenheit.","type":"integer"},"location":{"additionalProperties":false,"type":"object","properties":{"city":{"description":"Name of the city where the weather is being reported.","type":"string"},"state":{"description":"Name of the state where the weather is being reported.","type":"string"}},"required":["city","state"]},"timestamp":{"description":"Timestamp in epoch format at which the weather was noted.","type":"integer"}},"required":["location","temperature","timestamp"],"$id":"https://example.com/weather-report.schema.json"}, payload={"temperature":115,"location":{"city":"Phoenix","state":"Arizona"},"windSpeed":50,"timestamp":1627335205})

정리

이제 마지막 단계인 리소스를 정리합니다. 이 연습의 일부로 생성한 모든 리소스를 제거하려면 CloudFormation 스택을 삭제하십시오.

스키마 레지스트리 기능

Schema Registry가 제공해야 하는 기능에 대해 논의해 보겠습니다.

  • 스키마 검색 – 생산자가 스키마 변경을 등록하면 메타데이터를 키-값 쌍으로 적용하여 관리자 또는 개발자에게 검색 가능한 정보를 제공할 수 있습니다. 이 메타데이터는 데이터의 원본 소스(source=MSK_west), 연락할 팀 이름(owner=DataEngineering) 또는 AWS 태그(environment=Production). 잠재적으로 생성 클라이언트의 데이터 필드를 암호화하고 메타데이터를 사용하여 암호 해독에 사용할 공개 키 지문을 잠재 소비자 클라이언트에 지정할 수 있습니다.
  • 스키마 호환성 – 각 스키마의 버전 관리는 호환성 모드에 의해 관리됩니다. 지정된 호환성 모드를 위반하는 스키마의 새 버전을 등록하도록 요청하면 요청이 실패하고 예외가 발생합니다. 호환성 검사를 통해 다운스트림 애플리케이션을 구축하는 개발자는 애플리케이션 구축을 위한 제한된 시나리오 세트를 가질 수 있으므로 문제 없이 변경 사항을 준비하는 데 도움이 됩니다. 일반적으로 사용되는 모드는 FORWARD, BACKWARD 및 FULL입니다. 모드 정의에 대한 자세한 내용은 다음을 참조하십시오. 스키마 버전 관리 및 호환성.
  • 스키마 유효성 검사 – 스키마 레지스트리 직렬 변환기는 생성된 데이터가 할당된 스키마와 호환되는지 확인하기 위해 작동합니다. 그렇지 않은 경우 데이터 생산자는 직렬 변환기로부터 예외를 수신합니다. 이렇게 하면 개발 주기 초기에 잠재적인 주요 변경 사항을 찾을 수 있으며 사람의 실수로 인한 의도하지 않은 스키마 변경을 방지할 수도 있습니다.
  • 스키마 자동 등록 – 그렇게 하도록 구성된 경우 데이터 생산자는 데이터 스트림에서 흐름에 따라 스키마 변경 사항을 자동 등록할 수 있습니다. 이는 데이터 소스가 데이터베이스의 CDC(변경 데이터 캡처 프로세스)에 의해 생성되는 사용 사례에 특히 유용합니다.
  • IAM 지원 – 통합 IAM 지원으로 인해 승인된 생산자만 특정 스키마를 변경할 수 있습니다. 또한 스키마를 읽을 수 있는 권한이 있는 소비자만 그렇게 할 수 있습니다. 스키마 변경은 일반적으로 신중하고 신중하게 수행되므로 IAM을 사용하여 이러한 변경을 수행하는 사람을 제어하는 ​​것이 중요합니다. 또한 스키마 정의 자체에 민감한 정보가 포함될 수 있는 상황에서는 스키마에 대한 액세스 제어가 중요합니다. 이전 예에서, IAM 역할 통해 추론된다. Java 용 AWS SDK, 그래서 그들은에서 상속됩니다 아마존 엘라스틱 컴퓨트 클라우드 (Amazon EC2) Amazon EC2를 사용하는 경우 애플리케이션이 실행되는 인스턴스의 역할. 또한 컨테이너 또는 컨테이너와 같이 이 코드를 포함할 수 있는 다른 AWS 서비스에 IAM 역할을 적용할 수 있습니다. AWS 람다 기능.
  • 보조 디시리얼라이저 – 이미 다른 스키마 레지스트리에 스키마를 등록한 경우 스키마 조회를 수행할 때 보조 역직렬 변환기를 지정하는 옵션이 있습니다. 이를 통해 다시 시작할 필요 없이 다른 스키마 레지스트리에서 마이그레이션할 수 있습니다. 스키마 레지스트리에 알려지지 않은 스키마 ID는 보조 디시리얼라이저에 연결된 레지스트리에서 조회됩니다.
  • 압축 – 스키마 레지스트리를 사용하면 더 이상 각 메시지와 함께 스키마를 보내고 받을 필요가 없어 데이터 페이로드를 줄일 수 있습니다. 스키마 레지스트리 라이브러리는 메시지의 페이로드를 압축하여 데이터 요구 사항을 더욱 줄일 수 있는 zlib 압축 옵션도 제공합니다. 이는 사용 사례에 따라 다르지만 압축하면 메시지 크기를 크게 줄일 수 있습니다.
  • 여러 데이터 형식 – 스키마 레지스트리는 현재 지원 AVRO(v1.10.2) 데이터 형식, 스키마에 대한 JSON 스키마 형식(Draft-04, Draft-06 및 Draft-07 사양) 및 Java 언어 지원이 포함된 JSON 데이터 형식(다른 데이터 형식 및 언어 포함).

결론

이 게시물에서는 AWS Glue Schema Registry를 사용하여 비즈니스 요구 사항이 변경됨에 따라 데이터 스트림에 대한 JSON 스키마를 등록, 검증 및 발전시키는 이점에 대해 논의했습니다. 또한 스키마 레지스트리를 사용하는 방법에 대한 예도 제공했습니다.

전단지에 포함된 링크에 대해 더 알아보기 AWS Glue 스키마 레지스트리와 통합.


저자에 관하여

아디티야 찰라 Amazon Web Services의 수석 솔루션 아키텍트입니다. Aditya는 AWS 여정을 통해 고객을 돕는 것을 좋아합니다. 회사가 있을 때 여정이 항상 더 좋다는 것을 알고 있기 때문입니다. 그는 여행, 역사, 놀라운 엔지니어링, 매일 새로운 것을 배우는 것을 좋아합니다.

spot_img

최신 인텔리전스

spot_img