본문 바로가기
카테고리 없음

pyiceberg와 Glue Catalog를 이용한 Apache Iceberg 사용

by 홍띠 2024. 6. 30.

필요 라이브러리 설치

pip 업그레이드

pip install --upgrade pip

pyiceberg와 필요 의존성 설치 - 아래 예제에서는 catalog로 glue를, 저장소로 s3를 사용할 예정이므로 glue, s3fs 를 설치

pip install "pyiceberg[glue,s3fs]"

카탈로그 설정

pyiceberg 사용사례가 검색했을때 많지 않았고, 그 중에서 GlueCatalog를 사용해서 카탈로그 관리를 하는 예시를 찾기가 어려웠다.

다른 카탈로그나 조금 다른 경우의 사용사례를 찾아봤을때 .pyiceber.yaml 파일을 이용하는 방식을 보고 적용해 보았는데, 내 경우에는 잘 작동하지 않는 듯 하다.

그래서 여러번의 시도를 한 끝에 아래의 방법으로 잘 동작하는 것을 알아냈다.

from pyiceberg.catalog.glue import GlueCatalog

catalog = GlueCatalog(
    "glue_test",
    **{
        "profile_name": "<aws-profile>",
        "region_name": "ap-northeast-2",
        "uri": "https://glue.ap-northeast-2.amazonaws.com",
        "warehouse": f"s3://<s3-path>",
    }
)
  • 위의 설정을 따르기 위해서는 AWS Credentials 설정이 로컬에 되어있어야 하고, profile_name을 지정하지 않으면 default 프로필의 credential값을 가져온다.
    AWS Credentials 설정을 이용하지 않으려면, 다른 boto3 클라이언트와 마찬가지로 Access Key를 하드코딩해서 입력하는 등 다른 방법의 로그인을 해도된다.
  • 데이터 저장소(warehouse)로 s3를 사용하고 AWS Credentials의 defalt 프로필을 사용하지 않는다면, 
    • pyiceberg 내부에서 pyarrow의 S3FileSystem을 사용하는데, pyarrow는 profile 설정을 지원하지 않는다.
      따라서, GlueCatalog에서 profile을 사용한다면 s3 credential은 따로 설정해야 한다.
    • 혹은, GlueCatalog에서  aws_access_key_id 등을 직접 설정했다면, 이 설정은 pyarrow 에서 공유되지 않으므로 s3.~ 형태로 한번 더 설정해주어야 한다.
    • 코드 실행주체에 default로 설정된 프로필을 사용한다면, 따로 profile을 설정하지 않아도 되기 때문에 s3에 대한 내용도 따로 설정하지 않아도 된다.
      from pyiceberg.catalog.glue import GlueCatalog
      
      catalog = GlueCatalog(
          "glue_test",
          **{
              # "profile_name": "<aws-profile>",
              "region_name": "ap-northeast-2",
              "uri": "https://glue.ap-northeast-2.amazonaws.com",
              "warehouse": f"s3:///<s3-path>",
              "s3.access-key-id": "xxxxx",
              "s3.secret-access-key": "xxxxxx",
              "s3.session-token": "xxxxxx"
          }
      )

예시데이터 가져오기

  • 뉴욕텍시데이터를 예시 데이터로 사용하기 위해 가져온다.
curl https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet -o ./warehouse/yellow_tripdata_2023-01.parquet
  • parquet파일 메타데이터 확인
import pyarrow.parquet as pq

parquet_file = pq.ParquetFile('./warehouse/yellow_tripdata_2023-01.parquet')
print(parquet_file.metadata)

# 각 열의 메타데이터 확인
print("\nColumn metadata:")
for i in range(parquet_file.metadata.num_row_groups):
    row_group = parquet_file.metadata.row_group(i)
    for j in range(row_group.num_columns):
        column = row_group.column(j)
        print(f'Column: {column.path_in_schema}, Data type: {column.physical_type}, Compression: {column.compression}, Num values: {column.num_values}')

 

  • pyarrow를 사용해서 parquet파일 읽기
import pyarrow.parquet as pq

df = pq.read_table("./warehouse/yellow_tripdata_2023-01.parquet")

 

카탈로그에 네임스페이스, 테이블 생성

iceberg에서 namespace는 glue에서 database에 해당한다.

아래 코드를 실행해서 카탈로그에 database, table 생성한다.

catalog.create_namespace("default")

identifier = ("default", "taxi_dataset")
table = catalog.create_table(
    identifier=identifier,
    schema=df.schema,
    # location="s3://test-bucket/iceberg-test"
)
  • Catalog에 database와 table이 추가된 것을 확인 할 수 있다.
  • warehouse로 지정한 s3경로에 메타데이터가 생성된 것을 확인 할 수 있다.
    만약, 기본으로 생성되는 경로가 아닌 다른 경로를 사용하고 싶다면 location 값으로 설정하면 된다.
    • 기본 경로: <warehouse_path>/<database>.db/<table name>/metadata/~~.metadata.json
    • 변경된 경로: <location>/metadata/~~.metadata.json