🦆

DuckLakeとR2でpublicにデータを提供してみる

に公開

DuckLakeとR2でpublicにデータを提供してみる

概要

DuckLakeいいですよね。
ポータブルなデータカタログ&DWHとしてとても可能性を感じています。

そんなDuckLakeですが、もしパブリックな場所に配置して、誰でもアクセスできるオープンデータカタログとして機能したら、とても便利だと思いませんか?ATTACHするだけで簡単にデータを参照、取得できますからね。しかも提供側はstaticなファイルを配置するだけでサーバーいらずです。

DuckLakeのドキュメントにUsing a Remote Data Pathというガイドがあります。
今回はこれを参考に、ドメインと紐づけたR2バケットでワークするか検証してみます。

※公式ドキュメントの注意書きにあるとおり、v0.3時点での方法です。将来的にはもっと簡単な方法が提供されるとのことなので大変期待ですね。

DuckLakeでは現在、カタログ内の永続データパスを変更できません。これは既知の制限であり、将来的には解除される予定です。そのため、このガイドの将来のバージョンは非常に簡単なものになります。

準備・前提

duckdb

  • duckdb: v1.4.3 (Andium) d1dc88f950
  • ducklake: v0.3 (de813ff)
  • httpfs

R2

  • カスタムドメインを設定してパブリックアクセス可能な状態
  • CORSを適切に設定済み (フロントエンドやDuckDB Wasmからのアクセスも想定するなら)
  • ローカルからアクセスできるようにアクセスキーなどを設定済み

実行してみる

1. DuckLakeの初期構築

DuckLakeを初期構築します。
ポイントは、DATA_PATHを最終的に配布するURLを設定しておいてすぐにDETACHすることです。
この状態ではparquet fileの書き込みはできませんが、最終的に配信する際のURLをDuckLake構築の時点で設定しておきます。

INSTALL httpfs;
INSTALL ducklake;
LOAD ducklake;

ATTACH 'ducklake:open_dwh_test.ducklake' AS open_dwh_test (
    -- 最終的に配布する際のURLを記載
    DATA_PATH 'https://[YOUR_DOMAIN]/data/'
);
DETACH open_dwh_test;

2. データ追加

先ほど作成したDuckLakeにあらためてATTACHします。
この時に、OVERRIDE_DATA_PATHDATA_PATHを設定することで、一時的にデータを書き込み可能な状態にします。

LOAD ducklake;

-- R2への接続情報を作成
CREATE OR REPLACE SECRET r2_secret (
    TYPE r2,
    ACCOUNT_ID 'YOUR_ACCOUNT_ID',
    PROVIDER credential_chain,
    CHAIN 'env;config',  -- 環境変数から参照する場合
    REGION 'auto'
);

-- 既存のducklakeにdata_pathを上書きしてATTACHする
-- 最終的に配信予定のパブリックなR2バケットを設定
ATTACH 'open_dwh_test.ducklake' AS open_dwh_test (
    TYPE ducklake,
    OVERRIDE_DATA_PATH true,
    DATA_PATH 'r2://[YOUR-BUCKET]/data/'
);
USE open_dwh_test;

-- 適当なテーブル作成
CREATE OR REPLACE TABLE open_dwh_test.main.test_table AS
SELECT 1 AS id;

最後のCTASによって、実データはoverrideしたDATA_PATHのバケットに、メタデータはローカルのducklakeファイルに書き込まれます。

3. ducklakeファイルをR2に配置

作成したDuckLakeファイルをパブリックなR2バケットにアップロード。

aws s3 cp open_dwh_test.ducklake s3://[YOUR-BUCKET] \
  --endpoint-url https://[YOUR_ACCOUNT_ID].r2.cloudflarestorage.com \
  --region auto

外部からインターネットアクセスしてATTACHしてみる

公開したDuckLakeファイルにインターネット経由でアクセスしてATTACHすると、DuckLakeとして使える状態になります。

duckdb ducklake:https://[YOUR_DOMAIN]/open_dwh_test.ducklake -ui

実際の例

以下のURLに検証用に作成したものがあるのでアクセスしてみます。

ATTACH

# UIサーバー付きで起動
duckdb ducklake:https://data.oxon-data.work/fdl_experiment/dwh.ducklake -ui

確認

duckdbのUIで確認すると、本体のdwhとメタデータの__ducklake_metadata_dwhがATTACHされている。

ducklake_db

parquetファイル一覧を出力。

file_list

普通にDuckLake管理のテーブルに対してSELECTできる。

select_ducklake

まとめ

ローカルでDuckLakeを作成し、R2に配置してインターネット経由でアクセスするまでの流れを図示すると以下のようになります。

"Using a Remote Data Path"のガイドを参考に、R2バケットに配置したDuckLakeファイルをインターネット経由で参照できるようにしてみました。
ストレージさえあれば、メタデータとともにデータを配布できるので、公共データや個人が収集しているデータを超低コストかつ機械判読性高く提供できる可能性を秘めているのではないでしょうか。

※ Cloudflare R2はエグレス料金無料なので、今回のユースケースでは特に相性が良いですね。

DuckLakeの中身は、parquetファイルと標準SQLで管理されたDB(duckdb以外にもSQLiteやPostgresにも対応)なので、特定の技術にあまり依存しない、ポータブルなデータカタログとしてとても面白いと思います。

今後は、duckdb wasmと組み合わせることで、ストレージとクライアントサイドの処理だけで、データカタログ + 分析環境を提供できるようになるかもしれませんね。

追記

参考

Discussion