데이터 엔지니어 · 데이터 사이언티스트를 위한 핵심 요약
lakeFS는 데이터 레이크를 위한 Git-like 버전 관리 시스템입니다. S3 호환 오브젝트 스토리지 위에 Git과 유사한 브랜칭, 머지, 타임 트래블 기능을 제공하여 데이터의 버전 관리를 가능하게 합니다. 데이터 엔지니어와 데이터 사이언티스트가 대규모 데이터셋을 안전하게 관리하고, ML 파이프라인의 재현성을 보장할 수 있습니다.
메인 데이터셋을 복사하지 않고 가벼운 브랜치 생성. 실험적 데이터 처리에 이상적.
브랜치 간 충돌 없는 자동/수동 머지. 데이터 무결성 유지.
커밋 히스토리 탐색 및 과거 버전 복원. 오류 발생 시 즉시 롤백.
전통적인 데이터 레이크(S3, ADLS 등)는 불변성(immutability)이 부족해 버전 관리가 어렵습니다. lakeFS는 이를 해결하며, ML/AI 워크플로우에서 필수적입니다.
| 기능 | lakeFS | Git LFS | DVC | Delta Lake |
|---|---|---|---|---|
| 브랜칭 | ✅ 가벼운 메타데이터 브랜치 | ❌ 파일 복사 필요 | ✅ (캐시 기반) | ❌ 테이블 단위 |
| 머지 | ✅ 자동/수동 충돌 해결 | ❌ 수동 | ✅ | ✅ (ACID) |
| 타임 트래블 | ✅ 무한 히스토리 | ✅ | ✅ | ✅ (버전 히스토리) |
| S3 호환 | ✅ 네이티브 | ❌ | ✅ | ✅ (Spark 기반) |
| 스토리지 비용 | 낮음 (메타데이터만) | 높음 | 중간 | 중간 |
lakeFS는 대규모 데이터 레이크에 최적화되어 있으며, 기존 S3 워크플로우와 완벽 호환됩니다.
lakeFS의 기본 단위는 Repository (repo)로, S3 버킷 위에 버전 관리를 씌운 것입니다. Branch는 포인터로 가벼우며, Commit으로 변경을 기록합니다.
Gravestone: 삭제된 객체를 실제로 지우지 않고 메타데이터로 관리 (저비용 복원).
Hook: 커밋 전/후 스크립트 실행 (CI/CD 통합).
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
pip install lakefs
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)
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"
LAKEFS_BLOCK_ADAPTER_S3_ENDPOINT 사용.
| 설정 키 | 기본값 | 설명 | 예제 |
|---|---|---|---|
| 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 예제는 공식 문서 참조.
spark.conf.set("spark.sql.catalog.lakefs", "org.apache.iceberg.spark.SparkCatalog") 후 lakefs:// URI 사용.lakectl fs diff로 변경 추적.lakectl fs ls -R --include-grave. lakectl garbage-collect 실행.
max_connections 증가.
cache.enabled=true.