Apache Hudi は、Hadoop ファイルシステム上で変更データの更新、削除、および利用をサポートするデータレイクストレージフォーマットです。
Hudi のテーブルタイプ
Hudi は、次の 2 つのテーブルタイプをサポートしています:
-
Copy On Write
データを Parquet ファイルフォーマットで格納します。Copy On Write テーブルの更新には、書き換え操作が必要です。
-
Merge On Read
ベースデータを列指向フォーマット (Parquet) で、増分データを行指向フォーマット (Avro) で格納します。コンパクション操作は、設定可能なポリシーに基づいて、定期的に増分データを列指向ファイルにマージします。
次の表は、2 つのテーブルタイプを比較したものです。
|
トレードオフ |
Copy On Write |
Merge On Read |
|
データレイテンシー |
高 |
低 |
|
クエリレイテンシー |
低 |
高 |
|
更新コスト (I/O) |
高 (Parquet ファイル全体を書き換えるため) |
低 (デルタログに追加するため) |
|
Parquet ファイルサイズ |
小 (更新時の I/O オーバーヘッドが高いため) |
大 (更新時のオーバーヘッドが低いため) |
|
書き込み増幅 |
高 (書き込み増幅が大きいため) |
低 (マージポリシーに依存) |
Hudi のクエリタイプ
Hudi は、次の 3 つのクエリタイプをサポートしています:
-
スナップショットクエリ
最新のコミットスナップショットからデータをクエリします。Merge On Read テーブルの場合、スナップショットクエリはベースの列指向データとリアルタイムのログデータをマージします。Copy On Write テーブルの場合、スナップショットクエリは Parquet データの最新バージョンを返します。
Copy On Write テーブルと Merge On Read テーブルは、どちらもこのクエリタイプをサポートしています。
-
増分クエリ
特定のコミット後に書き込まれたデータをクエリします。
Copy On Write テーブルと Merge On Read テーブルは、どちらもこのクエリタイプをサポートしています。
-
読み取り最適化クエリ
最新のコンパクション済みデータを返します。Merge On Read テーブルの場合、このクエリタイプは、データの鮮度を犠牲にして、ログデータのオンラインマージをスキップすることでレイテンシーを削減します。
次の表は、クエリタイプを比較したものです。
|
トレードオフ |
スナップショットクエリ |
読み取り最適化クエリ |
|
データレイテンシー |
低 |
高 |
|
クエリレイテンシー |
高 (Merge On Read テーブルの場合) |
低 |
シナリオ
-
ほぼリアルタイムのデータインジェスト
Hudi は挿入、更新、削除の操作をサポートしています。Kafka や Simple Log Service (SLS) などのサービスからのログデータをリアルタイムで Hudi にインジェストできます。Hudi は、データベースのバイナリロギング (binlog) からの変更データのリアルタイム同期もサポートしています。
Hudi は、データ書き込み中に生成される小さなファイルを最適化します。これにより、Hudi は従来のファイル形式よりも HDFS 上で効率的に動作します。
-
ほぼリアルタイムのデータ分析
Hudi は、Hive、Spark、Presto、Impala など、複数の分析エンジンと連携して動作します。ファイルフォーマットとして、Hudi は追加のサービスプロセスを必要としないため、軽量です。
-
増分データ処理
Hudi は増分クエリをサポートしており、Spark Streaming を使用して特定のコミット後に変更されたデータを取得し、HDFS から変更データを利用することができます。