/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2023/04/25 読んだ記事まとめ(dbt + Duckdb による Spark の置き換えについて)

先日 dbt + Duckdb についての Medium の投稿を読んで面白かったので Twitter に投稿したのですが、かなりの反響がありました。dbt と Duckdb というキーワードがキャッチーだからかな、と思ったのですが、改めてここでもブログの内容を少し要約してみます。

Use dbt and Duckdb instead of Spark in data pipelines

medium.com

この記事は Data Minded 社というベルギーにあるエンジニアからの投稿で、データエンジニアリングやデータサイエンスのコンサルティングサービスを提供している会社のようです。dbt + Duckdb が Spark を置き換えるという内容で、タイトルからして目を惹きます。Duckdb は以前にも "Big Data Is Dead" という記事も投稿されていますが、そこでも似たような主張がされています:

bynatures.hatenadiary.jp

dbt と Spark を一概に比較するのも難しい気がしますが、記事ではざっくりと「データ変換するツール」として捉えた場合の dbt のメリットを紹介しています:

Spark に対する dbt の優位性

Broader target audience

SQL を中心に据えることで、多くの人が dbt を使うことができます。

Simple execution

Spark のパラメータは複雑で、Sparkの仕組みを理解して利用する必要がある。dbt ではこの部分を DWH に切り離しているため、多くのユーザは低レベルのクエリ実行機構を意識する必要がない。ただ一方でこういったクラウドDWHはコストが高くなる場合もある。

Most companies don’t have big data

これは、上で紹介した "Big Data Is Dead" と同じ主張です。Spark は大規模なデータを処理できますが、あなたのデータは本当に Spark を使ってまで処理する必要があるのか?というアンチテーゼを提唱しています。

dbt + Duckdb を組み合わせるメリット

dbt には dbt-duckdb というプラグインがあり、Duckdb をシングルノードで動く DWH として使うことができます。dbt と Duckdb を組み合わせるメリットが3つ紹介されています:

No need to rely on your DWH for all processing

クラウド DWH をすべてのデータ変換処理で使うとコストが高くなりがちです。ローカルでの dbt テストや、パイプライン中のデータ変換に Duckdb を組み合わせることも可能です。

Integrate seamlessly with external storage

Duckdb は処理結果を外部システムに書き込んだり、主要なデータフォーマット(CVS, Parquetなど)に書き出すこともできます。この機能により、インプット/アウトプット形式は変更せず、既存のSparkジョブを置き換えることが可能です。

No need to change your data platform

Spark を利用したデータ変換処理ではコモディティハードウェアを利用してデータ変換処理を行い、結果をデータレイクもしくはDWHに書き出します。大きなデータアーキテクチャには手を加えずに この処理部分のみ、例えばデータサイズが小さかったり変換処理がシンプルであれば、dbt + Duckdb に置き換えることが可能です。

Dbt with Duckdb is faster than Spark

この記事では TPC-DS ベンチマークを用いた dbt + Duckdb / Spark の速度比較が行われています。詳しくは記事を参照いただきたいのですが、1台のマシンメモリ上で処理が完結できる場合には dbt + Duckdb の処理速度が速く、1台に収まりきらない場合はそもそも Duckdb で処理すべきではなく Spark で分散させるべき、という結論に至っています。