lakeFS와 DuckDB 함께 사용하기
DuckDB는 인프로세스 SQL OLAP 데이터베이스 관리 시스템이에요. DuckDB에서 lakeFS의 데이터에 접근할 수 있고, lakeFS 웹 인터페이스 안에서도 DuckDB를 사용할 수 있어요.
출처: 문서
본문
Iceberg REST Catalog
DuckDB에서 lakeFS에 접근하는 권장 방법은 lakeFS Enterprise에 내장된 Iceberg REST Catalog를 쓰는 거예요. 이 모드에서 lakeFS는 완전히 데이터 경로 밖에 있어요: 데이터는 DuckDB가 하부 오브젝트 스토어에 직접 읽고 쓰고, lakeFS는 테이블 메타데이터를 버저닝해요.
LOAD iceberg;
LOAD httpfs;
CREATE SECRET lakefs_credentials (
TYPE ICEBERG,
CLIENT_ID '«redacted:AKIA…»',
CLIENT_SECRET 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
OAUTH2_SERVER_URI 'https://lakefs.example.com/iceberg/api/v1/oauth/tokens'
);
ATTACH '' AS main_branch (
TYPE iceberg,
SECRET lakefs_credentials,
ENDPOINT 'https://lakefs.example.com/iceberg/relative_to/my-repo.main/api'
);
USE main_branch.inventory;
SELECT * FROM books;
팁
Iceberg REST Catalog에 대해 더 알아보려면 Iceberg 연동 문서를 참고하세요.
고급: 대안적 접근 방법
위의 Iceberg REST Catalog가 DuckDB에서 lakeFS에 접근하는 권장 방법이에요. 아래 방법들은 S3 게이트웨이를 통한 비-Iceberg 포맷 접근, lakefs-spec을 통한 Python 접근, lakeFS 웹 UI에 내장된 DuckDB 쿼리 편집기를 다뤄요.
S3 게이트웨이로 DuckDB 사용하기
S3 게이트웨이를 사용하면 DuckDB가 지원하는 어떤 포맷이든(Iceberg 테이블만이 아니라) lakeFS로 데이터를 읽고 쓸 수 있어요. 유연하지만, 이 접근법은 lakeFS가 데이터 경로에 개입해야 해요. 모든 데이터 작업이 lakeFS 서버를 통해 프록시되어야 하기 때문에 Iceberg REST Catalog 접근법보다 덜 효율적일 수 있어요.
설정
DuckDB에서 lakeFS의 데이터를 쿼리하는 것은 DuckDB에서 S3 데이터를 쿼리하는 것과 비슷해요. lakeFS가 제공하는 S3 게이트웨이에 연결하는 httpfs 확장을 사용해요.
아직 로드하지 않았다면 HTTPFS 확장을 설치하고 로드해요:
INSTALL httpfs;
LOAD httpfs;
그다음 연결을 설정하는 다음 명령을 실행해요.
-- "s3_region" is the S3 region on which your bucket resides. If local storage, or not S3, then just set it to "us-east-1".
SET s3_region='us-east-1';
-- the host (and port, if necessary) of your lakeFS server
SET s3_endpoint='lakefs.example.com';
-- the access credentials for your lakeFS user
SET s3_access_key_id='«redacted:AKIA…»';
-- the access credentials for your lakeFS user
SET s3_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';
SET s3_url_style='path';
-- Uncomment in case the endpoint listen on non-secure, for example running lakeFS locally.
-- SET s3_use_ssl=false;
데이터 쿼리하기
설정이 끝나면 다음 URI 패턴으로 lakeFS S3 게이트웨이를 통해 데이터를 쿼리할 수 있어요:
s3://<REPOSITORY NAME>/<REFERENCE ID>/<PATH TO DATA>
S3 게이트웨이가 DuckDB가 요구하는 모든 S3 기능을 구현하기 때문에, Hive-파티셔닝된 데이터 지원을 포함해 glob과 패턴으로 쿼리할 수 있어요.
예시:
SELECT *
FROM parquet_scan('s3://example-repo/main/data/population/by-region/*.parquet', HIVE_PARTITIONING=1)
ORDER BY name;
데이터 쓰기
브랜치에 쓰는 데는 특별한 설정이 필요 없어요. 위 설정과 dev 브랜치에 대한 쓰기 권한이 있다고 가정하면, 쓰기 작업은 다른 DuckDB 쓰기와 똑같이 보여요:
CREATE TABLE sampled_population AS SELECT *
FROM parquet_scan('s3://example-repo/main/data/population/by-region/*.parquet', HIVE_PARTITIONING=1)
USING SAMPLE reservoir(50000 ROWS) REPEATABLE (100);
COPY sampled_population TO 's3://example-repo/main/data/population/sample.parquet'; -- actual write happens here
lakefs-spec으로 Python에서 DuckDB 사용하기
Python 사용자는 lakefs-spec 패키지를 활용해 DuckDB를 사용할 수 있어요.
참고
이 라이브러리는 서드파티 패키지로 lakeFS 개발자가 유지보수하지 않아요. 이슈와 버그 리포트는 lakefs-spec 저장소에 직접 등록하세요.
lakefs-spec을 사용하면 pre-signed URL로 lakeFS를 쿼리할 수 있어요. 데이터 파일이 하부 오브젝트 스토어에서 직접 읽히는 효율적이고 안전한 I/O가 가능해지죠.
import duckdb
from fsspec import filesystem
duckdb.register_filesystem(filesystem('lakefs'))
duckdb.sql("SELECT * FROM 'lakefs://example-repo/main/data/population/sample.parquet'")
lakeFS 웹 UI에서 DuckDB 사용하기
lakeFS 웹 UI는 Object viewer 페이지에 DuckDB를 포함하고 있어요.
이 기능으로 lakefs 경로를 사용해 lakeFS의 객체를 직접 쿼리할 수 있어요:
lakefs://<repository>/<branch>/object/path/foo.parquet
DuckDB 쿼리 편집기는 DuckDB WASM으로 제공돼요. 다음 타입의 어떤 객체든 렌더링하고 쿼리할 수 있게 해 줘요:
-
Parquet
-
CSV
-
TSV
더 알아보기 (Learn more)
공식 문서: lakeFS DuckDB 연동