데이터 카탈로그 액세스 - AWS Glue

데이터 카탈로그 액세스

AWS Glue Data Catalog(Data Catalog)를 사용하면 데이터를 검색하고 파악할 수 있습니다. 데이터 카탈로그는 스키마 정의, 데이터 유형, 위치 및 기타 메타데이터를 일관되게 유지 관리할 수 있는 방법을 제공합니다. 다음 방법을 사용하여 데이터 카탈로그에 액세스할 수 있습니다.

  • AWS Glue 콘솔 - 웹 기반 사용자 인터페이스인 AWS Glue 콘솔을 통해 데이터 카탈로그에 액세스하고 관리할 수 있습니다. 콘솔을 사용하면 데이터베이스, 테이블 및 관련 메타데이터를 찾고 검색할 수 있을 뿐만 아니라 메타데이터 정의를 생성, 업데이트 및 삭제할 수 있습니다.

  • AWS Glue 크롤러 - 크롤러는 데이터 소스를 자동으로 스캔하고 데이터 카탈로그를 메타데이터로 채우는 프로그램입니다. 크롤러를 생성하고 실행하여 Amazon S3, Amazon RDS, Amazon DynamoDB, Amazon CloudWatch와 MySQL, PostgreSQL 등 같은 JDBC 호환 관계형 데이터베이스뿐만 아니라 Snowflake, Google BigQuery 등과 같은 여러 비 AWS 소스에서 데이터를 검색하고 카탈로그화할 수 있습니다.

  • AWS Glue API - AWS Glue API를 사용하여 프로그래밍 방식으로 데이터 카탈로그에 액세스할 수 있습니다. 이러한 API를 사용하면 다른 애플리케이션과 서비스에서 프로그래밍 방식으로 데이터 카탈로그와 상호 작용하여 자동화 및 통합을 수행할 수 있습니다.

  • AWS Command Line Interface(AWS CLI) - 명령줄에서 AWS CLI를 사용하여 데이터 카탈로그에 액세스하고 관리할 수 있습니다. CLI는 메타데이터 정의를 생성, 업데이트 및 삭제하는 명령과 메타데이터 정보를 쿼리하고 검색하는 명령을 제공합니다.

  • 다른 AWS 서비스와의 통합 - 데이터 카탈로그는 다른 많은 AWS 서비스와 통합되므로 이를 통해 카탈로그에 저장된 메타데이터에 액세스하고 활용할 수 있습니다. 예를 들어 Amazon Athena를 사용하면 데이터 카탈로그의 메타데이터를 사용하여 데이터 소스를 쿼리할 수 있으며, AWS Lake Formation을 사용하면 데이터 카탈로그 리소스에 대한 데이터 액세스 및 거버넌스를 관리할 수 있습니다.

AWS Glue Iceberg REST 엔드포인트를 사용하여 Data Catalog에 연결

AWS Glue의 Iceberg REST 엔드포인트는 Apache Iceberg REST 사양에 명시된 API 작업을 지원합니다. Iceberg REST 클라이언트를 사용하여 분석 엔진에서 실행되는 애플리케이션을 Data Catalog에 호스팅되는 REST 카탈로그에 연결할 수 있습니다.

엔드포인트는 v2로 기본 설정된 v1 및 v2의 Apache Iceberg 테이블 사양을 모두 지원합니다. Iceberg 테이블 v1 사양을 사용하는 경우 API 직접 호출에서 v1을 지정해야 합니다. API 작업을 사용하여 Amazon S3 객체 스토리지와 Amazon S3 테이블 스토리지 모두에 저장된 Iceberg 테이블에 액세스할 수 있습니다.

구성 세부 정보

Endpoint : https://glue.us-east-1.amazonaws.com/iceberg

Iceberg 클라이언트를 사용하여 Spark와 같은 분석 엔진을 서비스 엔드포인트에 연결하는 경우 다음 애플리케이션 구성을 지정해야 합니다.

catalog_name = "mydatacatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    ... \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.type", "rest") \
    .config(f"spark.sql.catalog.{catalog_name}.uri", "https://glue.{aws_region}.amazonaws.com/iceberg") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", "{aws_account_id}") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.sigv4-enabled", "true") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-name", "glue") \
    .config(f"spark.sql.catalog.{catalog_name}.rest.signing-region", "{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
     

AWS Glue Iceberg REST 확장 엔드포인트를 사용하여 Data Catalog에 연결

AWS Glue Iceberg REST 확장 엔드포인트는 Apache Iceberg REST 사양에 없는 추가 API를 제공하고 서버 측 스캔 계획 기능을 제공합니다. 이러한 추가 API는 Amazon Redshift 관리형 스토리지에 저장된 테이블에 액세스할 때 사용됩니다. 엔드포인트는 애플리케이션에서 Apache Iceberg AWS Glue Data Catalog Extensions Library를 사용하여 액세스할 수 있습니다.

Endpoint : https://glue.us-east-1.amazonaws.com/extensions
catalog_name = "myredshiftcatalog"
aws_account_id = "123456789012"
aws_region = "us-east-1"
spark = SparkSession.builder \
    .config("spark.sql.defaultCatalog", catalog_name) \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config(f"spark.sql.catalog.{catalog_name}.client.region", "{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.id", "{aws_account_id}:redshiftnamespacecatalog/redshiftdb") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.endpoint", "https://glue.us-east-1.amazonaws.com/extensions") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.extensions.debug-enabled", "true") \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .getOrCreate()
    

AWS Glue 서비스 엔드포인트에 대한 액세스 인증 및 권한 부여

AWS Glue Data Catalog 엔드포인트에 대한 API 요청은 AWS Signature Version 4(SigV4)를 사용하여 인증됩니다. AWS SigV4에 대한 자세한 내용은 API 요청용 AWS Signature Version 4 섹션을 참조하세요.

AWS Glue 서비스 엔드포인트 및 AWS Glue 메타데이터에 액세스할 때 애플리케이션은 IAM 작업이 필요한 glue:getCatalog IAM 역할을 수임합니다.

REST 작업 REST 경로 AWS Glue IAM 작업 CloudTrail EventName Lake Formation 권한
GetConfig GET /config GetCatalog 불필요
ListNamespaces GET /namespaces GetDatabases GetDatabases ALL, DESCRIBE, SELECT
CreateNamespace POST /namespaces CreateDatabase CreateDatabase ALL, CREATE_DATABASE
LoadNamespaceMetadata GET /namespaces/{ns} GetDatabase GetDatabase ALL, DESCRIBE, SELECT
UpdateProperties POST /namespaces/{ns}/properties UpdateDatabase UpdateDatabase ALL, ALTER
DeleteNamespace DELETE /namespace/{ns} DeleteDatabase DeleteDatabase ALL, DROP
ListTables GET /namespaces/{ns}/tables GetTables GetTables ALL, SELECT, DESCRIBE
CreateTable POST /namespaces/{ns}/tables CreateTable CreateTable ALL, CREATE_TABLE
LoadTable GET /namespaces/{ns}/tables/{tbl} GetTable GetTable ALL, SELECT, DESCRIBE
TableExists HEAD /namespaces/{ns}/tables/{tbl} GetTable GetTable ALL, SELECT, DESCRIBE
UpdateTable POST /namespaces/{ns}/tables/{tbl} UpdateTable UpdateTable ALL, ALTER
DeleteTable DELETE /namespaces/{ns}/tables/{tbl} DeleteTable DeleteTable ALL, DROP

IAM, AWS Lake Formation 또는 Lake Formation 하이브리드 모드 권한을 사용하여 기본 Data Catalog 및 해당 객체에 대한 액세스를 관리할 수 있습니다.

AWS Glue Data Catalog의 페더레이션 카탈로그에는 Lake Formation에 등록된 데이터 위치가 있습니다. Lake Formation은 Data Catalog와 통합되며 카탈로그 객체에 대한 사용자 액세스를 관리할 수 있는 데이터베이스 스타일 권한을 제공합니다. Lake Formation에서 데이터를 생성, 삽입 또는 삭제하는 데 사용되는 IAM 사용자 또는 역할에 대한 권한을 설정해야 합니다. 이 권한은 기존 AWS Glue 테이블과 동일합니다.

  • CREATE_CATALOG – 카탈로그를 생성하는 데 필요합니다.

  • CREATE_DATABASE – 데이터베이스를 생성하는 데 필요합니다.

  • CREATE_TABLE – 테이블을 생성하는 데 필요합니다.

  • DELETE - 테이블에서 데이터를 삭제하는 데 필요합니다.

  • DESCRIBE - 메타데이터를 읽는 데 필요합니다.

  • DROP - 테이블 또는 데이터베이스를 삭제하는 데 필요합니다.

  • INSERT: 위탁자가 테이블에 데이터를 삽입해야 할 때 필요합니다.

  • SELECT: 위탁자가 테이블에서 데이터를 선택해야 할 때 필요합니다.

자세한 내용은 AWS Lake Formation 개발자 가이드에서 Lake Formation 권한 참조를 참조하세요.

독립 실행형 Spark 애플리케이션에서 Data Catalog에 연결

독립 실행형 애플리케이션에서 Apache Iceberg 커넥터를 사용하여 Data Catalog에 연결할 수 있습니다.

  1. Spark 애플리케이션에 대한 IAM 역할을 생성합니다.

  2. AWS Glue Iceberg 커넥터를 사용하여 Iceberg Rest 엔드포인트에 연결합니다.

    # configure your application. Refer to https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html for best practices on configuring environment variables. export AWS_ACCESS_KEY_ID=$(aws configure get appUser.aws_access_key_id) export AWS_SECRET_ACCESS_KEY=$(aws configure get appUser.aws_secret_access_key) export AWS_SESSION_TOKEN=$(aws configure get appUser.aws_secret_token) export AWS_REGION=us-east-1 export REGION=us-east-1 export AWS_ACCOUNT_ID = {specify your aws account id here} ~/spark-3.5.3-bin-hadoop3/bin/spark-shell \ --packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.6.0 \ --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \ --conf "spark.sql.defaultCatalog=spark_catalog" \ --conf "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog" \ --conf "spark.sql.catalog.spark_catalog.type=rest" \ --conf "spark.sql.catalog.spark_catalog.uri=https://glue.us-east-1.amazonaws.com/iceberg" \ --conf "spark.sql.catalog.spark_catalog.warehouse = {AWS_ACCOUNT_ID}" \ --conf "spark.sql.catalog.spark_catalog.rest.sigv4-enabled=true" \ --conf "spark.sql.catalog.spark_catalog.rest.signing-name=glue" \ --conf "spark.sql.catalog.spark_catalog.rest.signing-region=us-east-1" \ --conf "spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO" \ --conf "spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialProvider"
  3. Data Catalog의 데이터를 쿼리합니다.

    spark.sql("create database myicebergdb").show()
    spark.sql("""CREATE TABLE myicebergdb.mytbl (name string) USING iceberg location 's3://bucket_name/mytbl'""")
    spark.sql("insert into myicebergdb.mytbl values('demo') ").show()
           

Amazon Redshift와 Apache Iceberg 간의 데이터 매핑

Redshift와 Iceberg는 다양한 데이터 유형을 지원합니다. 다음 호환성 매트릭스는 이러한 두 데이터 시스템 간에 데이터를 매핑할 때 지원되는 항목과 제한 사항을 간략하게 설명합니다. 각 데이터 시스템에서 지원되는 데이터 유형에 대한 자세한 내용은 Amazon Redshift 데이터 유형Apache Iceberg 테이블 사양을 참조하세요.

Redshift 데이터 유형 에일리어스 Iceberg 데이터 유형
SMALLINT INT2 int
INTEGER INT, INT4 int
BIGINT INT8 long
DECIMAL NUMERIC decimal
REAL FLOAT4 float
REAL FLOAT4 float
DOUBLE PRECISION FLOAT8, FLOAT double
CHAR CHARACTER, NCHAR 문자열
VARCHAR CHARACTER VARYING, NVARCHAR 문자열
BPCHAR 문자열
TEXT 문자열
날짜 date
TIME TIME WITHOUT TIMEZONE 시간
TIME TIME WITH TIMEZONE 지원되지 않음
TIMESTAMP TIMESTAMP WITHOUT TIMEZONE TIMESTAMP
TIMESTAMPZ TIMESTAMP WITH TIMEZONE TIMESTAMPZ
INTERVAL YEAR TO MONTH 지원되지 않음
INTERVAL DAY TO SECOND 지원되지 않음
BOOLEAN BOOL bool
HLLSKETCH 지원되지 않음
SUPER 지원되지 않음
VARBYTE VARBINARY, BINARY VARYING 이진수
GEOMETRY 지원되지 않음
GEOGRAPHY 지원되지 않음

AWS Glue Iceberg REST 카탈로그 API 사용 시 고려 사항 및 제한 사항

다음은 Apache Iceberg REST 카탈로그 데이터 정의 언어(DDL) 작업 동작을 사용할 때 고려해야 할 사항과 제한 사항입니다.

고려 사항
  • DeleteTable API 동작 - DeleteTable API는 제거 옵션을 지원합니다. 제거를 true로 설정하면 테이블 데이터가 삭제되고, 그렇지 않으면 데이터가 삭제되지 않습니다. Amazon S3의 테이블의 경우 이 작업을 실행해도 테이블 데이터가 삭제되지 않습니다. 테이블이 Amazon S3 및 purge = TRUE,에 저장되어 있는 경우 이 작업이 실패합니다.

    Amazon Redshift 관리형 스토리지에 저장된 테이블의 경우 이 작업은 Amazon Redshift의 DROP TABLE 동작과 마찬가지로 테이블 데이터를 삭제합니다. 테이블이 Amazon Redshift 및 purge = FALSE에 저장되어 있는 경우 이 작업이 실패합니다.

  • CreateTable API 동작 - CreateTable API 작업은 state-create = TRUE 옵션을 지원하지 않습니다.

  • RenameTable API 동작 - RenameTable 작업은 Amazon Redshift의 테이블에서는 지원되지만 Amazon S3에서는 지원되지 않습니다.

  • Amazon Redshift의 네임스페이스 및 테이블에 대한 DDL 작업 - Amazon Redshift의 네임스페이스 및 테이블에 대한 생성, 업데이트, 삭제 작업은 Amazon Redshift 관리형 작업 그룹을 언제 사용할 수 있는지 여부, 그리고 서로 충돌하는 DDL 및 DML 트랜잭션이 진행 중이고 작업이 잠금을 기다린 다음 변경 사항을 커밋해야 하는지 여부에 따라 달라지기 때문에 비동기 작업입니다.

    생성, 업데이트 또는 삭제 작업 중에 엔드포인트는 다음 페이로드와 함께 202 응답을 반환합니다.

    {
      "transaction-context": "operation/resource", 
      "transaction-id": "data-api-request-id:crypto-hash-signature(operation, resource, data-api-uuid)"
    }        

    예를 들어 엔드포인트는 UpdateTable 작업에 대해 다음과 같은 응답을 제공합니다.

    {
      "transaction-context": "UpdateTable/arn:aws:glue:us-east-1:123456789012:table/123456789012/cat1/db1/tbl1", 
      "transaction-id": "b0033764-20df-4679-905d-71f20a0cdbe7:ca8a95d54158793204f1f39b4971d2a7"
    }        

    이 트랜잭션의 진행 상황을 추적하려면 CheckTransactionStatus API를 다음 형태로 사용할 수 있습니다.

    POST /transactions/status
    
    Request:
    {
      "transaction-context": "UpdateTable/arn:aws:glue:us-east-1:123456789012:table/123456789012/cat1/db1/tbl1", 
      "transaction-id": "transaction-id": "b0033764-20df-4679-905d-71f20a0cdbe7:ca8a95d54158793204f1f39b4971d2a7"
    }
    
    Response:
    {
       "status": "IN_PRORESS|SUCCEEDED|FAILED|CANCELED",
      "error": "message" // if failed
    }
            
제한 사항
  • Apache Iceberg REST 사양의 보기 API는 AWS Glue Iceberg REST 카탈로그에서 지원되지 않습니다.