Skip to content

Instantly share code, notes, and snippets.

@voluntas
Last active September 13, 2024 11:45
Show Gist options
  • Save voluntas/eaf4c69a96e4e73c19e785f0bc3241fa to your computer and use it in GitHub Desktop.
Save voluntas/eaf4c69a96e4e73c19e785f0bc3241fa to your computer and use it in GitHub Desktop.
DuckDB 座談会 v2024-09 向け発表者用メモ

DuckDB 座談会 v2024-09 向け発表者用メモ

  • 著者: @voluntas

注意

  • S3 と書いたら S3 互換オブジェクトストレージを含みます

DuckDB に辿り着いた経緯

  • どうして DuckDB を使い始めたのか
    • 自社製品関連の統計情報を解析したい
    • BigQuery はサービスないので採用しなかった
    • TSDB を利用する事にした
      • InfluxDB と比較して Postgres も利用できる TimescaleDB を利用した
        • sqlc を使いたかった
      • TimescaleDB は日本リージョンにマネージドがある
      • コスト面では特に優位性はない
      • 別に早くない、ため込む場所としては便利
      • 継続的集計機能もあるが、使い方が難しい
    • ClickHouse を検討
      • データベースは運用したくない
      • クラウドサービスは一度導入すると変更が厳し
        • コスト面で優位性がない
        • 統計情報自体が価値を生むサービスではない
        • 統計情報はあくまでおまけ
    • 最初は自社の CLI ツールに組み込む予定で DuckDB を検討していた
      • 自社製品のログ解析ツールとして、ログを一時的に読み込ませる場所として SQLite を検討していた
        • SQLite に JSONL ログを追加する
      • DuckDB は解析が楽そう、さらに JSONL の tar.gz がそのまま読める
        • さらに複数ファイルも同時に読み込める!
    • DuckDB が想像以上に S3 とちゃんと連携できていることを知る
      • S3 -> DuckDB -> S3 ができる
      • Postgres -> DUckDB -> Postgres ができる
      • これはすごい、さらに S3 では * が利用できる

前提

  • 自社製品はクライアントから 15-60 秒間隔で、JSON で統計情報が送られてくる
    • JSONL としてログに出力する仕組みがある
    • 統計情報なので、一定間隔の情報が必要不可欠
  • リアルタイムでの解析はほぼ求められていない
    • もし求められたら、それこそ duckdb サーバー立てておいて、シングルスレッドでもいい
    • 単一障害点で問題無い
    • リアルタイムに問題を解析したから、問題を解決できることはない
  • 利用後に後で解析したいが多い
    • 5 分くらいの遅延は問題無い
  • 既に Postgres を利用したジョブキューモドキの仕組みがある
  • S3 へのログの保存は Fluent Bit を利用
    • Plugin S3 を利用する
    • Rewrite Tag 機能を使うことで S3 のパスをかなり自由にいじれる

やろうとしてること

DuckDB を利用した顧客向けの統計情報の解析

  • Fluent Bit を利用して S3 に JSONL ログを gzip 圧縮で保存
    • Fluent Bit の Rewrite Tag を利用する事で JSONL ログの中身毎に S3 のパスを変えられる
      • これを利用する事で全探索を避ける
  • 顧客の利用が終わったら自社製品はウェブフックを飛ばすのでそのウェブフックをトリガーに解析をする
    • Postgres に解析のジョブキューを突っ込む
      • この時、解析のジョブキューは SKIP LOCKED を利用している
    • ジョブワーカーは systemd/Timer を利用して 1 分毎にジョブを確認しにいく
  • ジョブワーカーで顧客が利用した ID で S3 の統計情報を集計して Parquet ファイルを生成する
    • Parquet だけじゃなくて TimescaleDB に保存してもよい
  • Parquet ファイルは公開用の S3 バケットを用意する
  • S3 のポリシーを利用して古くなったログは気軽に捨てられる
    • データベースを利用すると削除は大変

DuckDB を利用した統計情報の提供

  • 非同期可視化
    • そもそも必要なときにしかダッシュボードの可視化は見られない
    • であれば必要なときにリクエストしたタイミングで可視化情報を作ればいいのでは?
    • ログは S3 にため込んでおいて、そのログを解析して Parquet ファイルを作る
  • Parquet ファイルを S3 署名付き URL で https:// でアクセスできるようにして DuckDB-Wasm で読み込ませる
    • DuckDB-Wasm がサイズ的にちょっと重いのが気にはなってる
    • Parquet は 1 テーブルなので、毎回それを読み込む
    • キャッシュも使える
    • 変更されるデータではないので、キャッシュは長めに持たせる
  • 事前に解析用の SQL を用意しておくか、解析結果を表示させるだけかは悩ましい
    • 解析結果の表示だけなら JSON データを作っておいて、それを https:// でアクセスさせるだけでもいい
  • Parquet ファイル自体はサイズは小さめで提供する

DuckDB-Wasm を利用したブラウザでの統計情報解析

DuckDB-Wasm (OPFS) を利用したブラウザでの統計ため込みと解析

  • ブラウザから取得できる統計情報を DuckDB-Wasm に保存する
    • ローカルでの解析する仕組みを SQL で提供する
  • OPFS に対応しないと永続化ができないので難しい
    • これは解決したいなと考えている

ログ提供ファイルとしての Parquet ファイル

  • ミドルウェアソフトウェアのログを Parquet ファイルとして提供する

価格面の有利性

  • ClickHouse クラウドは月 500 ドル程度かかる
  • S3 は Akamai Connected Cloud の Object Storage を利用する
    • ストレージ費用は 1 TB で月 20 ドル
    • 転送量は 1 TB 無料枠があり、 1 TB で月 5 ドル
  • ジョブワーカーはメモリが必要であれば Linode の High Memory プランを利用
  • 解析結果を何日保存するかによるが、 1 ヶ月で 2.5 TB でも月 50 ドル程度で済む

Text to SQL の強み

sqlc での SQL の管理

  • DuckDB の SQL を書くのに sqlc を使いたい
  • ただ動的にスキーマーが決定するため、難しい
  • 課題が多いのでもう少し使い込んでから様子見
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment