로컬 개발 환경용 Databricks 에뮬레이터 MiniLake 공개
원제 MiniLake Is a Local Databricks API Emulator with SQL, Delta Lake and Spark
100 포인트댓글 25

Key Point
개발자는 실제 Databricks 코드를 작성·테스트하지만 로컬에서 가짜 API로 거치고 싶을 때가 많은데, 이제 진정한 Delta 파일과 Spark 작업을 로컬 머신에서 돌릴 수 있게 되었다.
핵심 요약
- Databricks API를 로컬 머신에서 에뮬레이션하는 오픈소스 도구 MiniLake를 출시했다. SQL은 DuckDB에서, Delta 테이블은 실제 파일로, 작업은 컨테이너의 spark-submit으로 실행된다.
- databricks-sdk, Databricks CLI, Terraform, MCP 에이전트를 localhost:8000으로 가리켜 사용할 수 있으며 어떤 토큰도 인증된다. pip install이나 docker run으로 설치하고 초기화된 SQL 워크스페이스 UI에 접근할 수 있다.
- Unity Catalog은 CRUD 지원 카탈로그·스키마·테이블·볼륨을 제공하며 각 카탈로그는 자체 DuckDB 데이터베이스 파일이므로 세 부분 주소 지정이 기본으로 작동한다.
- SQL은 DuckDB에서 실행되며 INLINE·EXTERNAL_LINKS 배치 모드, JSON_ARRAY·ARROW_STREAM·CSV 포맷, 열 타입을 담은 결과 매니페스트를 지원한다.
- Delta 테이블은 진정한 Parquet+_delta_log/이며 INSERT·UPDATE·DELETE는 실제 Spark 작업을 거치고 읽기는 DuckDB의 delta_scan()을 통한다.
- spark_python_task는 sibling 컨테이너에서 spark-submit을 실행하고 실제 stdout을 반환하며 DAG 스케줄링은 depends_on과 run_if를 준수하고 독립 분기는 병렬 실행된다.
- Terraform databricks 프로바이더를 localhost로 가리켜 apply·plan·destroy를 실행하면 진정한 카탈로그를 생성하며 매 테스트마다 검증된다. bundle deploy와 bundle run도 엔드투엔드 동작한다.
- Databricks REST API를 완벽히 따르므로 호스트만 변경하면 기존 모든 클라이언트가 동일한 호출·응답 형태·타입 에러로 작동한다. 코드 수정이 없다.
- STRING·LONG·DECIMAL·ARRAY·MAP·STRUCT 등 선언된 열 타입이 DuckDB와 SDK의 ColumnInfo로 왕복되며 실제 파일과 불일치하면 가정이 아닌 실제 문제로 드러난다.
- MINILAKE_PERSIST=1로 설정하면 종료 시 상태를 스냅샷하고 시작 시 복구한다. 클러스터는 상태 머신으로 CRUD와 시간 기반 생명주기 전이를 지원하지만 Spark 컴퓨트는 없다.
- CI 용도로 설계되었으며 POST /_minilake/reset 한 번으로 컨테이너 재시작 없이 매 테스트마다 깨끗한 워크스페이스를 얻는다. /health, /ready, /services 제어 평면도 있다.
- LLM 에이전트용 MCP 서버를 제공하며 setup_fixture·seed_table·describe_catalog_tree·run_python_script 등 다중 호출 시퀀스를 단일 도구로 축약한다. DuckDB SQL 방언을 설명하는 리소스가 있어 에이전트가 Spark SQL을 쓰지 않도록 한다.
- 구현되지 않은 기능은 침묵하지 않고 501 NOT_IMPLEMENTED를 반환한다. 다중 테넌트나 공유 서버가 아닌 단일 개발자 로컬 실행만 지원하며 인증과 접근 제어는 없다.
- DuckDB는 단일 쓰기 소유자이므로 동시 부하는 락에서 직렬화되며 배포 대상이 아니다. MANAGED 테이블은 Spark에 보이지 않으므로 Spark가 데이터를 봐야 할 때는 EXTERNAL Delta를 쓴다.
- MIT 라이선스 오픈소스이며 공개 깃허브 dmux/minilake에서 개발되고 기여를 환영한다. 데이터 엔지니어가 데이터 엔지니어를 위해 만들었으며 파이프라인과 CI 작업이 필요한 범위를 담는다.