lakeFS 실무 스터디 가이드

데이터 엔지니어 · 데이터 사이언티스트를 위한 핵심 요약

data-versioning git-for-data

1. lakeFS란?

lakeFS는 데이터 레이크를 위한 Git-like 버전 관리 시스템입니다. S3 호환 오브젝트 스토리지 위에 Git과 유사한 브랜칭, 머지, 타임 트래블 기능을 제공하여 데이터의 버전 관리를 가능하게 합니다. 데이터 엔지니어와 데이터 사이언티스트가 대규모 데이터셋을 안전하게 관리하고, ML 파이프라인의 재현성을 보장할 수 있습니다.

브랜칭 (Branching)

메인 데이터셋을 복사하지 않고 가벼운 브랜치 생성. 실험적 데이터 처리에 이상적.

머지 (Merging)

브랜치 간 충돌 없는 자동/수동 머지. 데이터 무결성 유지.

타임 트래블 (Time Travel)

커밋 히스토리 탐색 및 과거 버전 복원. 오류 발생 시 즉시 롤백.

핵심 가치: 데이터 레이크에서 Git처럼 동작. 저장소 비용 절감 (메타데이터만 관리).

2. 왜 써야 하는가?

전통적인 데이터 레이크(S3, ADLS 등)는 불변성(immutability)이 부족해 버전 관리가 어렵습니다. lakeFS는 이를 해결하며, ML/AI 워크플로우에서 필수적입니다.

기능 lakeFS Git LFS DVC Delta Lake
브랜칭 ✅ 가벼운 메타데이터 브랜치 ❌ 파일 복사 필요 ✅ (캐시 기반) ❌ 테이블 단위
머지 ✅ 자동/수동 충돌 해결 ❌ 수동 ✅ ✅ (ACID)
타임 트래블 ✅ 무한 히스토리 ✅ ✅ ✅ (버전 히스토리)
S3 호환 ✅ 네이티브 ❌ ✅ ✅ (Spark 기반)
스토리지 비용 낮음 (메타데이터만) 높음 중간 중간

lakeFS는 대규모 데이터 레이크에 최적화되어 있으며, 기존 S3 워크플로우와 완벽 호환됩니다.

3. 핵심 개념

lakeFS의 기본 단위는 Repository (repo)로, S3 버킷 위에 버전 관리를 씌운 것입니다. Branch는 포인터로 가벼우며, Commit으로 변경을 기록합니다.

아키텍처 다이어그램

+----------------+ +----------------+ +-----------------+ | Clients | | lakeFS Server | | Metadata DB | | (CLI, Python, |<--->| (Gateway + UI) |<--->| (PostgreSQL) | | Spark, Pandas) | | | +-----------------+ +----------------+ +----------------+ | v +-----------------+ | Object Storage | | (S3, GCS, ADLS) | +-----------------+

Gravestone: 삭제된 객체를 실제로 지우지 않고 메타데이터로 관리 (저비용 복원).

Hook: 커밋 전/후 스크립트 실행 (CI/CD 통합).

주의: lakeFS는 메타데이터를 PostgreSQL에 저장하므로 DB 안정성 확보 필수.

4. 퀵스타트

1. 설치 (Docker)

docker run --rm -p 8000:8000 \
  -e LAKEFS_BLOCK_ADAPTER_TYPE=s3 \
  -e LAKEFS_BLOCK_ADAPTER_S3_FORCE_PATH_STYLE=true \
  -e LAKEFS_METADATA_BACKEND_TYPE=local \
  treeverse/lakefs:latest server --config /home/lakefs/config.toml

2. Python 클라이언트 설치

pip install lakefs

3. 설정 및 첫 예제

from lakefs import LakeFSClient

client = LakeFSClient("http://localhost:8000")
client.auth.set_basic_credentials("AKIA...", "secret...")  # Admin creds from logs

# Repo 생성
client.repo.create("s3://example-bucket/my-repo", "main")

# Branch 생성
client.branch.create("s3://example-bucket/my-repo", "feature-branch", "main")

# 업로드 (main 브랜치)
with open("data.csv", "rb") as f:
    client.objects.upload("s3://example-bucket/my-repo/main/data.csv", f)

# Commit
client.commit.create("s3://example-bucket/my-repo/main", "Add data.csv", "Author")

# 타임 트래블 (리스트)
commits = client.commits.list("s3://example-bucket/my-repo/main")
print(commits)

CLI 예제 (lakectl)

lakectl repo create lakefs://example/my-repo --storage-namespace s3a://example-bucket/my-repo
lakectl branch create lakefs://example/my-repo feature --source lakefs://example/my-repo/main
lakectl fs upload lakefs://example/my-repo/main/data.csv data.csv
lakectl commit create lakefs://example/my-repo/main --message "Initial commit"
팁: S3 엔드포인트 설정 시 LAKEFS_BLOCK_ADAPTER_S3_ENDPOINT 사용.

5. 핵심 설정 레퍼런스

설정 키 기본값 설명 예제
database.type local 메타데이터 DB postgres
blockstore.s3.region us-east-1 S3 리전 ap-northeast-2
auth.encrypt.secret_key - 암호화 키 (필수) openssl rand -base64 32
hooks.enabled false 훅 활성화 true
garage.cleaner.interval 24h Gravestone 청소 주기 1h

전체 config.toml 예제는 공식 문서 참조.

6. 실무 팁 & 트러블슈팅

팁

트러블슈팅

문제: "Object not found" 에러
해결: Gravestone 확인 lakectl fs ls -R --include-grave. lakectl garbage-collect 실행.
문제: DB 연결 실패
해결: PostgreSQL WAL 설정 확인, max_connections 증가.
문제: 브랜치 생성 느림
해결: 메타데이터 캐시 활성화 cache.enabled=true.

7. 참고 자료