メインコンテンツまでスキップ

Hudi カタログ

Hudi カタログはHive カタログを再利用します。Hive Metastore、またはHive Metastoreと互換性のあるメタデータサービスに接続することで、DorisはHudiのデータベースとテーブル情報を自動的に取得し、データクエリを実行できます。

Apache DorisとApache Hudiのクイックスタート

適用シナリオ

シナリオ説明
クエリ加速Dorisの分散コンピューティングエンジンを使用してHudiデータに直接アクセスし、クエリを高速化します。
データ統合Hudiデータを読み取ってDoris内部テーブルに書き込む、またはDorisコンピューティングエンジンを使用してZeroETL操作を実行します。
データ書き戻しサポートされていません。

カタログの設定

構文

CREATE CATALOG [IF NOT EXISTS] catalog_name PROPERTIES (
'type' = 'hms', -- required
'hive.metastore.uris' = '<metastore_thrift_url>', -- required
{MetaStoreProperties},
{StorageProperties},
{HudiProperties},
{CommonProperties}
);
  • [MetaStoreProperties]

    MetaStorePropertiesセクションは、Metastoreメタデータサービスの接続と認証情報を記入するために使用されます。詳細については、[Supported Metadata Services]セクションを参照してください。

  • [StorageProperties]

    StoragePropertiesセクションは、ストレージシステムに関連する接続と認証情報を記入するために使用されます。詳細については、[Supported Storage Systems]セクションを参照してください。

  • [CommonProperties]

    CommonPropertiesセクションは、共通プロパティを記入するために使用されます。[Common Properties]の詳細については、Data Catalog Overviewセクションを参照してください。

  • {HudiProperties}

    Parameter NameFormer NameDescriptionDefault Value
    hudi.use_hive_sync_partitionuse_hive_sync_partitionHive Metastoreによって既に同期されたパーティション情報を使用するかどうか。trueの場合、パーティション情報はHive Metastoreから直接取得されます。そうでない場合は、ファイルシステムのメタデータファイルから取得されます。Hive Metastoreからの情報取得はより効率的ですが、ユーザーは最新のメタデータがHive Metastoreに同期されていることを確認する必要があります。false

サポートされるHudiバージョン

現在の依存するHudiバージョンは0.15です。Hudiデータバージョン0.14以降へのアクセスを推奨します。

サポートされるクエリタイプ

Table TypeSupported Query Types
Copy On WriteSnapshot Query、Time Travel、Incremental Read
Merge On ReadSnapshot Queries、Read Optimized Queries、Time Travel、Incremental Read

サポートされるメタデータサービス

サポートされるストレージシステム

サポートされるデータフォーマット

カラムタイプマッピング

Hudi TypeDoris TypeComment
booleanboolean
intint
longbigint
floatfloat
doubledouble
decimal(P, S)decimal(P, S)
bytesstring
stringstring
datedate
timestampdatetime(N)精度に基づいてdatetime(3)またはdatetime(6)に自動的にマッピングされます
arrayarray
mapmap
structstruct
otherUNSUPPORTED

Hudi Catalogの作成はHive Catalogと類似しています。その他の例については、Hive Catalogを参照してください。

CREATE CATALOG hudi_hms PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.21.0.1:7004',
'hadoop.username' = 'hive',
'dfs.nameservices'='your-nameservice',
'dfs.ha.namenodes.your-nameservice'='nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1'='172.21.0.2:4007',
'dfs.namenode.rpc-address.your-nameservice.nn2'='172.21.0.3:4007',
'dfs.client.failover.proxy.provider.your-nameservice'='org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);

クエリ操作

基本クエリ

Catalogが設定されると、以下の方法を使用してCatalog内のテーブルをクエリできます:

-- 1. switch to catalog, use database and query
SWITCH hudi_ctl;
USE hudi_db;
SELECT * FROM hudi_tbl LIMIT 10;

-- 2. use hudi database directly
USE hudi_ctl.hudi_db;
SELECT * FROM hudi_tbl LIMIT 10;

-- 3. use full qualified name to query
SELECT * FROM hudi_ctl.hudi_db.hudi_tbl LIMIT 10;

Time Travel

Hudi テーブルへのすべての書き込み操作は新しいスナップショットを作成します。Doris は Hudi テーブルの指定されたスナップショットの読み取りをサポートしています。デフォルトでは、クエリリクエストは最新のスナップショットのみを読み取ります。

hudi_meta() テーブル関数を使用して、指定された Hudi テーブルのタイムラインをクエリできます:

このテーブル関数は 3.1.0 以降でサポートされています。

SELECT * FROM hudi_meta(
'table' = 'hudi_ctl.hudi_db.hudi_tbl',
'query_type' = 'timeline'
);

+-------------------+--------+--------------------------+-----------+-----------------------+
| timestamp | action | file_name | state | state_transition_time |
+-------------------+--------+--------------------------+-----------+-----------------------+
| 20241202171214902 | commit | 20241202171214902.commit | COMPLETED | 20241202171215756 |
| 20241202171217258 | commit | 20241202171217258.commit | COMPLETED | 20241202171218127 |
| 20241202171219557 | commit | 20241202171219557.commit | COMPLETED | 20241202171220308 |
| 20241202171221769 | commit | 20241202171221769.commit | COMPLETED | 20241202171222541 |
| 20241202171224269 | commit | 20241202171224269.commit | COMPLETED | 20241202171224995 |
| 20241202171226401 | commit | 20241202171226401.commit | COMPLETED | 20241202171227155 |
| 20241202171228827 | commit | 20241202171228827.commit | COMPLETED | 20241202171229570 |
| 20241202171230907 | commit | 20241202171230907.commit | COMPLETED | 20241202171231686 |
| 20241202171233356 | commit | 20241202171233356.commit | COMPLETED | 20241202171234288 |
| 20241202171235940 | commit | 20241202171235940.commit | COMPLETED | 20241202171236757 |
+-------------------+--------+--------------------------+-----------+-----------------------+

FOR TIME AS OF文を使用して、スナップショットのタイムスタンプに基づいてデータの履歴バージョンを読み取ることができます。時刻形式はHudiドキュメントと一致しています。以下にいくつかの例を示します:

SELECT * FROM hudi_tbl FOR TIME AS OF "2022-10-07 17:20:37";
SELECT * FROM hudi_tbl FOR TIME AS OF "20221007172037";
SELECT * FROM hudi_tbl FOR TIME AS OF "2022-10-07";

Hudi テーブルは FOR VERSION AS OF ステートメントをサポートしていないことに注意してください。Hudi テーブルでこの構文を使用しようとするとエラーが発生します。

Incremental Query

Incremental Read は指定された時間範囲内のデータ変更をクエリすることを可能にし、その期間の終了時点でのデータの最終状態を返します。

Doris は Incremental Read をサポートするために @incr 構文を提供します:

SELECT * from hudi_table@incr('beginTime'='xxx', ['endTime'='xxx'], ['hoodie.read.timeline.holes.resolution.policy'='FAIL'], ...);
  • beginTime

    必須。時間フォーマットはHudi公式のhudi_table_changesと一致している必要があり、"earliest"をサポートします。

  • endTime

    オプション、デフォルトは最新のcommitTimeです。

@incr関数にさらにオプションを追加できます。Spark Read Optionsと互換性があります。

descを使用して実行プランを表示することで、Dorisが@incrVHUDI_SCAN_NODEにプッシュダウンされた述語に変換することが確認できます:

|   0:VHUDI_SCAN_NODE(113)                                                                                            |
| table: lineitem_mor |
| predicates: (_hoodie_commit_time[#0] > '20240311151019723'), (_hoodie_commit_time[#0] <= '20240311151606605') |
| inputSplitNum=1, totalFileSize=13099711, scanRanges=1

FAQ

  1. JNIを通じてJava SKDを使用して増分データを読み取る際にクエリがブロックされる

    be.confJAVA_OPTS_FOR_JDK_17またはJAVA_OPTS-Djol.skipHotspotSAAttach=trueを追加してください。

付録

変更ログ

Dorisバージョン機能サポート
2.1.8/3.0.4Hudi依存関係を0.15にアップグレード。Hadoop Hudi JNI Scannerを追加。