BigQuery でオープンソースのテーブル形式に対するマニフェスト ファイルによるクエリのサポート開始
Google Cloud Japan Team
※この投稿は米国時間 2023 年 8 月 11 日に、Google Cloud blog に投稿されたものの抄訳です。
このブログ投稿では、BigQuery でのマニフェストのサポートに関する概要と、それによって BigQuery で Apache Hudi や Delta Lake などのオープンソースのテーブル形式に対するクエリがどのように可能になるかについても説明します。
オープンソースのテーブル形式は埋め込みのメタデータを使用して、トランザクションとして一貫性を持った DML、タイムトラベル機能を提供します。また、データファイルのさまざまなバージョンを保持し、マニフェストを作成できます。マニフェストは、特定の時点でのスナップショットを表す、データファイルのリストです。Delta Lake や Apache Hudi などの多くのデータ ランタイムは、読み込みやクエリ時に使用できるマニフェストを生成できます。この度、BigQuery でマニフェスト ファイルがサポートされるようになったため、BigQuery でのオープンソースのテーブル形式のクエリが簡単になります。
BigQuery は、URI を単に改行区切りしたリストである、SymLinkTextInputFormat 形式のマニフェスト ファイルをサポートします。テーブルのオプションで file_set_spec_type フラグに NEW_LINE_DELIMITED_MANIFEST を設定することで、指定された URI が、1 行に 1 つの URI が含まれる改行区切りのマニフェスト ファイルであることを示せます。この機能では、パフォーマンス向上とコスト削減につながる、Hive スタイルのパーティション分割テーブルのためのパーティション プルーニングもサポートされています。
マニフェスト ファイルを使用して BigLake テーブルを作成する例を示します。
マニフェストのサポートを使用して Apache Hudi をクエリする
Apache Hudi は、ビッグデータ ワークロードのためのオープンソースのデータ マネジメント フレームワークです。Apache Hadoop を基盤として構築されており、Hadoop 分散ファイル システム(HDFS)やその他のクラウド ストレージ システムでデータを管理するための仕組みを提供します。
Hudi のテーブルは、Hudi-BigQuery コネクタを使用することで、外部テーブルとして BigQuery からクエリできます。Hudi と BigQuery の統合は、Hive スタイルでパーティション分割された Copy-On-Write テーブルでのみ利用できます。この実装ではいくつかの重要なクエリ処理最適化が使用できないため、パフォーマンスが低下し、スロット消費量が増加します。
これらの課題を解決するために、BigQuery のマニフェスト ファイルのサポートを活用できるように Hudi-BigQuery コネクタをアップグレードしました。コネクタを使用して Apache Hudi ワークロードをクエリする詳細な手順を説明します。
ステップ 1: BigQuery Hudi コネクタをダウンロードして構築する
最新の hudi-gcp-bundle をダウンロードして構築し、BigQuerySyncTool を実行します。
ステップ 2: Spark アプリケーションを実行して、BigQuery の外部テーブルを生成する
マニフェスト アプローチを使用してコネクタを使用するための手順は次のとおりです。
BigQuery で Hudi テーブルを表す既存のビューをドロップする(古い実装が使用されている場合)
Hudi コネクタはテーブル名を探し、存在する場合はただマニフェスト ファイルをアップデートします。スキーマが一致しないため、クエリは失敗するようになります。最新のコネクタをトリガーする前に、必ずビューをドロップしてください。
最新の Hudi コネクタを実行して、マニフェスト アプローチをトリガーする
--use-bq-manifest-file フラグを指定して、BigQuerySyncTool を実行します。
古い実装から移行する場合、既存のコネクタを実行している現在の spark-submit に --use-bq-manifest-file フラグを追加します。同じテーブル名を使用することを推奨します。そうすることで、既存のダウンストリーム パイプライン コードをそのまま使用できるようになります。
use-bq-manifest-file フラグを指定してコネクタを実行すると、BigQuery がサポートしている形式のマニフェスト ファイルがエクスポートされます。それを使用して、--table パラメータで指定された名前の外部テーブルが作成されます。
このマニフェスト アプローチでの spark-submit の例を示します。
ステップ 3: 推奨事項: 高速な BigLake テーブルにアップグレードする
大規模な分析を実行しているお客様は、外部テーブルを BigLake テーブルにアップグレードできます。そうすれば、メタデータ キャッシュ保存とマテリアライズド ビューを活用することで、適切なきめの細かい管理を設定し、これらのワークロードのパフォーマンスを向上できます。
マニフェスト サポートを使用して Delta Lake をクエリする
Delta Lake はオープンソースのストレージ フレームワークで、レイクハウス アーキテクチャの構築を可能にします。Delta Lake は、ACID トランザクションとスケーラブルなメタデータ処理のためのファイルベースのトランザクション ログを備え、Parquet データファイルを拡張します。また、特定の時点でのスナップショットを表すデータファイルのリストを含むマニフェスト ファイルをエクスポートするオプションも提供します。
マニフェストのサポートにより、ユーザーは BigLake テーブルを作成して、GCS 上の Delta Lake テーブルをクエリできます。基盤となる Delta Lake テーブルが変更されるたびにマニフェストを生成するのはユーザーの責任であり、このアプローチでサポートされているのは Delta Lake Reader v1 のテーブルのみです。
マニフェスト サポートを使用して Delta Lake テーブルをクエリする詳細な手順を説明します。
ステップ 1: Apache Spark を使用して Delta テーブルのマニフェストを生成する
Delta Lake はマニフェスト ファイルのエクスポートをサポートしています。generate コマンドは、マニフェスト ファイルを <path-to-delta-table>/_symlink_format_manifest/ に生成します。このディレクトリのファイルにはデータファイル(Parquet ファイル)の名前が含まれています。データファイルは Delta テーブルのスナップショットを読み込む際に読まれるものです。
ステップ 2: 生成されたマニフェストを基にして BigLake テーブルを作成する
前のステップで生成したマニフェスト ファイルを使用して、マニフェスト ファイル ベースの BigLake テーブルを作成します。基盤となる Delta Lake テーブルがパーティション分割されている場合、Hive スタイルでパーティション分割された BigLake テーブルを作成できます。
ステップ 3: 推奨事項: 高速な BigLake テーブルにアップグレードする
Delta Lake ワークロードで大規模な分析を実行しているお客様は、メタデータ キャッシュ保存とマテリアライズド ビューを活用することで、パフォーマンスを向上できます。
次のステップ
GCS で Delta Lake または Apache Hudi のワークロードをクエリしたいと考えている OSS をご利用のお客様は、マニフェスト サポートをご活用ください。また、パフォーマンスを向上させたい場合は、メタデータ キャッシュ保存とマテリアライズド ビューをご活用ください。
追加情報
BigLake でクエリのパフォーマンスを向上させて大規模な分析ワークロードを実行する
BigLake テーブルの概要
Google Cloud の BigLake にアクセスする
謝辞: Micah Kornfield、Brian Hulette、Silvian Calman、Mahesh Bogadi、Garrett Casto、Yuri Volobuev、Justin Levandoski、Gaurav Saxena およびその他の BigQuery エンジニアリング チーム メンバー。
- ソフトウェア エンジニア Jinpeng Zhou
- データ & 分析コンサルタント Lakshmi Bobba