본문 바로가기
WIKI 기술 지식 베이스

lakeFS와 Delta Lake 함께 사용하기

원문 보기 위키 갱신

Delta Lake는 데이터 레이크 테이블에 성능 개선과 트랜잭션 보장을 제공하도록 설계된 오픈소스 스토리지 프레임워크예요.

lakeFS는 포맷에 구애받지 않기 때문에, Delta 포맷으로 lakeFS 저장소 안에 데이터를 저장하고 두 기술의 장점을 모두 누릴 수 있어요. 구체적으로:

  • ACID 작업이 여러 Delta 테이블에 걸쳐 동작할 수 있어요.

  • CI/CD 훅이 Delta 테이블 내용, 스키마, 참조 무결성(referential integrity)까지 검증할 수 있어요.

  • lakeFS는 제로 카피 브랜칭을 지원해서 전체 격리 상태로 빠르게 실험할 수 있어요.

출처: 문서

본문

lakeFS 관점에서 본 Delta Lake 테이블

lakeFS는 객체 수준에서 동작하는 데이터 버저닝 도구예요. 즉, 기본적으로 lakeFS는 Delta 테이블 위치 안의 객체가 테이블인지, 테이블 메타데이터인지, 데이터인지 구분하지 않아요. Delta Lake 프로토콜에 따르면, 테이블에 대한 어떤 수정 — 데이터 추가든 테이블 메타데이터 변경이든 — 은 테이블의 트랜잭션 로그 안에 새 객체를 만들어요. 보통 테이블 디렉터리 루트를 기준으로 _delta_log 경로 아래에 있죠. 이 새 객체는 이전 버전보다 증가된 버전 번호를 가져요.

결과적으로 lakeFS 환경 안에서 Delta 테이블에 변경을 가하면, 그 변경은 테이블 위치 안의 객체 변경으로 나타나요. 예컨대 'category'와 'country'로 파티셔닝된 "my-table"이라는 테이블에 레코드를 삽입하는 것은, lakeFS에서는 테이블 접두사 안(즉, 테이블 데이터)과 테이블 트랜잭션 로그에 추가된 객체로 표현돼요.

비슷하게, 테이블 컬럼 이름 변경 같은 메타데이터 작업을 수행하면 스키마 변경을 나타내는 새 객체들이 테이블 트랜잭션 로그에 추가돼요.

Apache Spark에서 lakeFS와 Delta Lake 사용하기

참고

Delta Lake와 Spark가 네이티브로 통합되어 있어서, Spark 환경에서 Delta 테이블과 상호작용하는 게 가장 일반적이에요.

lakeFS 저장소 안의 Delta 테이블을 읽고 쓰도록 Spark 환경을 설정하려면, 다른 Spark 환경처럼 S3 Hadoop 설정에 올바른 자격 증명과 엔드포인트를 지정해야 해요.

설정이 끝나면 일반 Spark 경로 URI로 Delta 테이블과 상호작용할 수 있어요. lakeFS 저장소와 브랜치 이름을 포함하세요:

df.write.format("delta").save("s3a://<repo-name>/<branch-name>/path/to/delta-table")

정보

Databricks Analytics Platform을 사용한다면, Databricks 클러스터를 lakeFS와 함께 쓰도록 설정하는 연동 가이드를 참고하세요.

연동이 실제로 동작하는 모습은 lakeFS Samples 저장소의 이 노트북을 보세요.

Python에서 lakeFS와 Delta Lake 사용하기

delta-rs 라이브러리는 Python 바인딩을 제공해요. 즉, Spark 없이도 Python에서 바로 Delta Lake와 lakeFS를 사용할 수 있어요. 통합은 lakeFS S3 게이트웨이를 통해 이뤄져요.

deltalake Python 모듈의 문서는 Delta Lake 테이블을 읽고, 쓰고, 쿼리하는 방법을 상세히 다뤄요. lakeFS와 함께 사용하려면 저장소와 브랜치를 기준으로 한 s3a 경로를 테이블에 지정하고(예: s3a://delta-lake-demo/main/my_table/), 다음 storage_options를 지정하세요:

storage_options = {
    "AWS_ENDPOINT": <your lakeFS endpoint>,
    "AWS_ACCESS_KEY_ID": <your lakeFS access key>,
    "AWS_SECRET_ACCESS_KEY": <your lakeFS secret key>,
    "AWS_REGION": "us-east-1",
    "AWS_S3_ALLOW_UNSAFE_RENAME": "true"
}

lakeFS가 HTTPS를 쓰지 않는다면(예컨대 그냥 로컬에서 실행하는 경우) 다음 옵션을 추가하세요

"AWS_STORAGE_ALLOW_HTTP": "true"

연동이 실제로 동작하는 모습은 lakeFS Samples 저장소의 이 노트북을 보세요.

lakeFS에서 Unity Catalog로 Delta Lake 테이블 내보내기

이 옵션은 lakeFS로 Delta Lake 테이블을 관리하면서 Databricks Unity Catalog를 통해 접근하는 사용자를 위한 거예요. lakeFS는 Unity Catalog 안에서 Delta 테이블에 읽기 전용 접근을 제공하는 Data Catalog Export 기능을 제공해요. 데이터 카탈로그 익스포터를 사용하면 Delta 테이블을 격리 상태에서 작업하고 Unity Catalog 안에서 쉽게 탐색할 수 있어요.

익스포트한 뒤에는 버저닝된 테이블 데이터를 다음과 같이 쿼리할 수 있어요:

SELECT * FROM my_catalog.main.my_delta_table

여기서 main은 Delta 테이블을 내보낸 lakeFS 브랜치의 이름이에요.

Delta 테이블을 Unity catalog로 익스포트하려면 Unity catalog 연동 가이드를 사용하세요.

제한

lakeFS에서 Delta Lake 테이블의 멀티 라이터(Multi-Writer) 지원

lakeFS는 현재 Delta Lake 테이블에 단일 라이터만 지원해요. Delta 테이블에 여러 라이터를 쓰려고 하면 두 가지 유형의 문제가 생길 수 있어요:

  • 머지 충돌: 여러 라이터가 서로 다른 브랜치에서 Delta 테이블을 수정한 뒤 이 브랜치들을 머지하려고 할 때 발생해요.

  • 동시 파일 덮어쓰기: 여러 라이터가 같은 브랜치에서 Delta 테이블을 동시에 수정할 때 발생해요.

참고

lakeFS는 자체 LogStore 구현이 아직 없고, 기본으로 쓰이는 Log store가 동시성을 통제하지 않아요.

이런 제한을 다루려면 멀티 라이터 지원 구현을 위한 모범 사례를 따라 보세요.

모범 사례

lakeFS 브랜치와 머지로 멀티 라이터 지원 구현하기

lakeFS에서 Delta Lake 테이블에 안전하게 멀티 라이팅하려면 다음 모범 사례를 따르길 권해요:

  • 변경 격리: 테이블 수정은 격리 상태에서 하세요. 각 변경 집합은 메인 브랜치에서 갈라져 나온 전용 lakeFS 브랜치와 연결되어야 해요.

  • 원자적 머지: 격리 상태에서 변경을 마친 뒤 메인 브랜치로 다시 머지해 보세요. 이 접근법은 변경 통합이 하나로 묶이게(cohesive) 보장해요.

워크플로는 다음과 같아요:

  • 테이블 변경이 있을 때마다 메인 브랜치에서 새 lakeFS 브랜치를 만들어요.

  • 격리 상태에서 수정을 진행해요.

  • 변경을 메인 브랜치로 다시 머지하려고 시도해요.

  • 충돌로 머지가 실패하면 과정을 반복해요.

아래 다이어그램은 브랜치와 머지로 동시성을 효과적으로 관리하는 방법을 시각적으로 보여 줘요.

가비지 컬렉션으로 Vacuum 따라가기

lakeFS 위에서 Delta Lake를 다루면서 테이블 디렉터리에서 사용하지 않는 파일을 지우려면, 먼저 Delta Lake Vacuum으로 파일을 소프트 삭제하고, 그다음 lakeFS Garbage Collection으로 스토리지에서 하드 삭제해야 해요.

팁

lakeFS는 Garbage Collection을 실행하기 전에 vacuum 실행이 한 변경을 되돌려서, 원치 않는 vacuum 실행에서 복구하게 해 줘요.

VPC 안에서 lakeFS 실행 시 (AWS)

lakeFS가 사설 네트워크 안에서 동작할 때 Databricks 클러스터가 접근할 수 있어야 해요. 두 VPC(lakeFS가 실행되는 VPC와 Databricks가 실행되는 VPC) 사이에 VPC peering을 설정해서 가능해요. Delta Lake 테이블에서 이것이 동작하게 하려면 멀티 클러스터 쓰기도 꺼야 해요:

spark.databricks.delta.multiClusterWrites.enabled false

멀티 클러스터 쓰기 사용 시 (AWS)

멀티 클러스터 쓰기를 사용하면 Databricks가 Delta의 S3-commit 액션을 재정의해요.

새 액션은 Databricks 자체 AWS 계정의 서버에서 lakeFS에 접촉하려고 시도하는데, 당연히 여러분의 사설 네트워크에 접근할 수 없어요. 그러니 멀티 클러스터 쓰기를 꼭 써야 한다면, Databricks의 AWS 계정에서 lakeFS로 접근을 허용해야 해요. 그렇게 하려고 한다면 Slack으로 문의해 보세요. 커뮤니티가 도움을 주려고 할 거예요.

더 읽을거리

lakeFS 블로그의 Guaranteeing Consistency in Your Delta Lake Tables With lakeFS 포스트에서 lakeFS 브랜치를 활용해 Delta 테이블의 데이터 품질을 보장하는 방법을 배워 보세요.

더 알아보기 (Learn more)

공식 문서: lakeFS Delta Lake 연동