Hive Catalog
Hive Metastore または Hive Metastore と互換性のあるメタデータサービスに接続すると、Doris は Hive のデータベースとテーブルの情報を自動的に取得し、データをクエリできます。
Hive 以外にも、多くのシステムがメタデータの保存に Hive Metastore を使用しています。そのため、Hive Catalog を通じて Hive テーブルだけでなく、Iceberg や Hudi など、メタデータを Hive Metastore に保存するテーブル形式にもアクセスできます。
適用シナリオ
| シナリオ | 説明 |
|---|---|
| クエリの高速化 | Doris の分散コンピューティングエンジンから Hive データに直接アクセスし、クエリを高速化します。 |
| データ統合 | Hive データを読み取って Doris の内部テーブルに書き込むか、Doris のコンピューティングエンジンを使用して ZeroETL 処理を行います。 |
| データの書き戻し | Doris がサポートする任意のソースのデータを処理し、Hive テーブルに書き戻します。 |
Catalog の設定
構文
CREATE CATALOG [IF NOT EXISTS] catalog_name PROPERTIES (
'type'='hms', -- required
'hive.metastore.type' = '<hive_metastore_type>', -- optional
'hive.version' = '<hive_version>', -- optional
'fs.defaultFS' = '<fs_defaultfs>', -- required for write, optional for read-only
{MetaStoreProperties},
{StorageProperties},
{HiveProperties},
{CommonProperties}
);
-
<hive_metastore_type>Hive Metastore の種類を指定します。
hms: 標準の Hive Metastore サービス。glue: Hive Metastore 互換インターフェースを使用して AWS Glue メタデータサービスにアクセスします。dlf: Hive Metastore 互換インターフェースを使用して Alibaba Cloud DLF メタデータサービスにアクセスします。
-
<fs_defaultfs>Doris からこの Hive Catalog 内のテーブルにデータを書き込む場合、このパラメータが必要です。例:
'fs.defaultFS' = 'hdfs://namenode:port' -
{MetaStoreProperties}MetaStoreProperties セクションには、Metastore メタデータサービスへの接続情報と認証情報を指定します。詳しくは「サポートされるメタデータサービス」のセクションを参照してください。
-
{StorageProperties}StorageProperties セクションには、ストレージシステムに関する接続情報と認証情報を指定します。詳しくは「サポートされるストレージシステム」のセクションを参照してください。
-
{HiveProperties}HiveProperties セクションには、Hive Catalog に関するプロパティを指定します。
-
get_schema_from_table: デフォルト値は false です。通常、Doris は Hive Metastore からテーブルのスキーマ情報を取得します。ただし、Storage schema reading not supportedエラーなど、互換性の問題が発生する場合があります。その場合は、このパラメータを true に設定すると、Table オブジェクトからテーブルのスキーマを直接取得できます。ただし、この方法ではカラムのデフォルト値に関する情報が無視されます。このプロパティはバージョン 2.1.10 および 3.0.6 以降でサポートされています。 -
hive.recursive_directories: パーティションディレクトリを一覧表示する際に、サブディレクトリを再帰的に探索するかどうかを指定します。このパラメータはバージョン 3.0.2 以降でサポートされています。バージョン 4.0 より前のデフォルト値はfalseで、それ以降はtrueです。一部の Hive テーブルでは、パーティションのパスがテーブルスキーマ内のパーティション情報と一致しない場合があります。サブディレクトリ内のデータファイルを取得するには、このパラメータを true に設定する必要があります。 -
hive.ignore_absent_partitions: 存在しないパーティションを無視するかどうかを指定します。デフォルトはtrueです。falseに設定すると、存在しないパーティションが見つかったときにクエリでエラーが報告されます。このパラメータはバージョン 3.0.2 以降でサポートされています。 -
hive.staging_dir: Hive への書き込みに使用する一時ステージングのルートディレクトリを設定します。書き込み時には、まずこのディレクトリにデータを書き込み、完了後に Hive テーブルの最終ディレクトリへ移動します。Hive テーブルのルートディレクトリからの相対パス、または絶対パスを指定できます。デフォルト値は/tmp/.doris_stagingです。Hive テーブルへの書き込み時に、/tmpディレクトリとテーブルディレクトリが異なる名前空間に属するため、書き込みに失敗することがあります。その場合は、このパラメータを相対パスに変更することで解決できます。このパラメータはバージョン 4.0.3 以降でサポートされています。 -
hive.parquet.time-zone: FileScannerV2 が Hive テーブルを読み取る際、従来の ParquetINT96タイムスタンプを復元するために使用する互換タイムゾーンです。デフォルトは空で、タイムゾーン変換を行わず、INT96に保存された日時の各値を保持します。このプロパティは、Catalog 内のINT96ファイルが既知のタイムゾーンを使用して書き込み側で正規化された場合にのみ設定してください。Hudi テーブルは意図的にこのプロパティを無視し、従来どおり SQL セッションのタイムゾーンに従います。詳しくは Parquet INT96 タイムスタンプの互換性を参照してください。
-
-
{CommonProperties}CommonProperties セクションには共通属性を指定します。詳しくは Catalog の概要の「共通プロパティ」を参照してください。
メタデータキャッシュ
外部データソースへのアクセス性能を向上させるため、Apache Doris は Hive メタデータをキャッシュします。対象には、テーブルオブジェクト、パーティション名、パーティションオブジェクト、カラム統計、ファイル一覧、およびパーティションの絞り込みに使用する派生構造が含まれます。
Doris 4.1.x より前のバージョンでは、メタデータキャッシュは主に FE の設定項目でグローバルに制御します。詳しくは メタデータキャッシュを参照してください。
Doris 4.1.x 以降、Hive Catalog の外部メタデータキャッシュは統一された meta.cache.* キーで設定します。以下の項目は現行バージョンについて説明しています。Doris 4.1.x と 4.2.x では異なる項目を使用します。これらについては、このページの 4.x バージョンで説明しています。
キャッシュプロパティの設定
各キャッシュ項目には、統一された形式の設定キー meta.cache.<engine>.<entry>.{enable,ttl-second,capacity,max-weight} を使用します。Hive の <engine> は hive です。Iceberg テーブルを含む Hive Metastore Catalog では、Iceberg Catalog で説明する iceberg の項目も使用します。
| プロパティ | 例 | 意味 |
|---|---|---|
enable | true/false | このキャッシュ項目を有効にするかどうか。 |
ttl-second | 600, 0, -1 | 0 は項目を無効にします(即座に反映され、最新データの確認に使用できます)。-1 は期限切れにならないことを意味し、その他の正の整数はアクセス時刻を基準とした TTL を秒単位で表します。 |
capacity | 10000 | キャッシュ項目の最大エントリ数。0 は項目を無効にします。 |
max-weight | 1GB | Doris 4.1.4 以降でサポートされます。項目が保持するメモリの推定量に対する任意の上限です。正の値が必要で、0 は拒否されます。以下に示す対応項目でのみ指定できます。 |
有効になる条件: enable=true、ttl-second != 0、capacity > 0 の場合に項目が有効になります。FE 全体、Catalog、または項目に対するメモリ制限がある場合は、推定メモリ使用量に基づいてキャッシュへの登録も制御されます。詳しくは 外部メタデータキャッシュのメモリ管理を参照してください。
キャッシュモジュール
Hive Catalog には次のキャッシュ項目があります。すべての項目で max-weight を指定できます。
項目 (<entry>) | プロパティキーのプレフィックス | ENTRY_NAME | キャッシュされる内容と効果 | デフォルトの enable / TTL / capacity |
|---|---|---|---|---|
table | meta.cache.hive.table. | hive-table | Hive Metastore から取得したテーブルオブジェクト。効果: プランニング時の Metastore との通信回数を減らします。 | true / 86400 s / 10000 |
partition_names | meta.cache.hive.partition_names. | hive-partition-names | パーティション名の一覧。効果: パーティションの列挙に利用します。無効にすると、新しいパーティションが即座に見えるようになります。 | true / 86400 s / 10000 |
partition | meta.cache.hive.partition. | hive-partition | 場所や入力形式などのパーティションオブジェクト。 | true / 86400 s / 100000 |
column_stats | meta.cache.hive.column_stats. | hive-column-stats | Hive Metastore から取得したカラム統計。 | true / 86400 s / 10000 |
file | meta.cache.hive.file. | hive-file | ファイル一覧。効果: リモートの LIST 操作を減らします。無効にすると、ファイルの変更が即座に見えるようになります。 | true / 86400 s / 10000 |
partition_view | meta.cache.hive.partition_view. | hive-partition-view | パーティション名から生成されたパーティションの絞り込み用構造。 | true / 86400 s / 1000 |
Hive テーブルのカラムスキーマは、すべての外部 Catalog が使用する共通の default エンジン(meta.cache.default.schema.*)によってキャッシュされます。
従来のパラメータの対応付けと変換
統一されたキーの使用を推奨します。次の従来の Catalog プロパティも引き続き受け付けられ、対応するキーに変換されます。
| 従来のプロパティキー | 統一されたキー | 説明 |
|---|---|---|
schema.cache.ttl-second | meta.cache.default.schema.ttl-second と meta.cache.hive.table.ttl-second | テーブルスキーマとテーブルオブジェクトのキャッシュの有効期限 |
partition.cache.ttl-second | meta.cache.hive.partition_names.ttl-second | パーティション名一覧の有効期限 |
file.meta.cache.ttl-second | meta.cache.hive.file.ttl-second | ファイル一覧の有効期限 |
ベストプラクティス
- 最新データへのリアルタイムアクセス: 各クエリで外部データソースの最新のパーティション変更やファイル変更を確認したい場合は、対応する
ttl-secondを0に設定します。-- Disable the file listing cache to see file changes in real time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.file.ttl-second" = "0");
-- Disable the partition name cache to see new partitions in real time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.partition_names.ttl-second" = "0"); - 性能の最適化: メタデータの変更が少ない場合は、
capacityとttl-secondを増やして Hive Metastore とファイルシステムへのアクセス負荷を軽減します。非常に大きなテーブルでは、max-weightを使用してファイル一覧とパーティションの絞り込み用キャッシュのサイズを制限します。
Catalog プロパティの変更に成功すると、影響を受けるメタデータキャッシュが破棄され、次回のアクセス時に新しい設定で再構築されます。meta.cache.max-weight または schema.cache.ttl-second を変更すると Catalog のすべてのキャッシュが破棄され、meta.cache.<engine>.<entry>.* を変更すると、そのエンジンのキャッシュが破棄されます。実行中のクエリには影響しません。
監視
キャッシュのメトリクスは、システムテーブル information_schema.catalog_meta_cache_statistics で確認できます。ENTRY_NAME には上表の名前が表示され、default エンジンの行は共通のテーブルスキーマキャッシュを表します。
SELECT engine_name, entry_name,
effective_enabled, ttl_second, capacity,
estimated_size, hit_rate, max_weight, estimated_weight
FROM information_schema.catalog_meta_cache_statistics
WHERE catalog_name = 'hive_ctl'
ORDER BY engine_name, entry_name;
このシステムテーブルについては、catalog_meta_cache_statistics のドキュメントを参照してください。
サポートされる Hive バージョン
Hive 1.x、2.x、3.x、4.x をサポートします。
Hive トランザクションテーブルはバージョン 3.x 以降でサポートされます。詳しくは「Hive トランザクションテーブル」のセクションを参照してください。
サポートされるメタデータサービス
注: Doris のバージョンによって、サポートされるサービスの種類とパラメータは多少異なります。「例」のセクションを参照してください。
Hive Catalog の機能サポート一覧
| メタデータサービス | テーブルのクエリ | ビューのクエリ | DDL 操作 | データの書き戻し |
|---|---|---|---|---|
| Hive | ✅ | ✅ | ✅ | ✅ |
| AWS Glue | ✅ | ✅ | ❌ | ❌ |
| DLF | ✅ | ✅ | ✅ | ✅ |
サポートされるストレージシステム
- HDFS
- AWS S3
- Google Cloud Storage
- Azure Blob
- Apache Ozone(4.0.4 以降でサポート)
- Alibaba Cloud OSS
- Tencent Cloud COS
- Huawei Cloud OBS
- MINIO
Doris を通じて Hive テーブルを作成し、データを書き込むには、Catalog の属性に
fs.defaultFSプロパティを明示的に追加する必要があります。クエリ専用の Catalog を作成する場合は、このパラメータを省略できます。Doris のバージョンによって、サポートされるサービスの種類とパラメータは多少異なります。「例」のセクションを参照してください。
サポートされるデータ形式
Parquet INT96 タイムスタンプの互換性
Hive テーブルには、異なるエンジンが生成したタイムスタンプファイルが含まれる場合があります。タイムゾーン変換が必要かどうかは、物理エンコーディングと書き込み側の動作によって決まります。Parquet の INT96 値にはタイムゾーンの注釈がないため、Doris はその値から書き込み側のタイムゾーンを推測しません。
4.1.5 以降、hive.parquet.time-zone には IANA タイムゾーン、または -12:00 から +14:00 までの UTC オフセットを指定できます。UTC と GMT は使用できますが、CST や PRC などの短い別名は拒否されます。Parquet を参照してください。
Parquet INT96 タイムスタンプ
FileScannerV2 は Parquet タイムスタンプを次のように処理します。
| 物理エンコーディング | デフォルトの動作 | hive.parquet.time-zone の効果 |
|---|---|---|
DATETIMEV2 にマッピングされた INT96 | ファイルに保存された日付と時刻の各値を保持します。SQL セッションのタイムゾーンによって値はシフトしません。 | 生の INT96 値を UTC 上の時点として扱い、設定された互換タイムゾーンに変換して、従来の書き込み側が正規化したタイムスタンプを復元します。 |
タイムスタンプの論理型を持つ INT64 | Parquet の論理型のセマンティクスに従います。 | 影響を受けません。 |
たとえば、意図したローカルタイムスタンプが Asia/Shanghai における 2021-01-01 10:11:00 だとします。
- ファイルが日時の各値をそのまま
10:11:00として保存している場合は、hive.parquet.time-zoneを設定しないでください。SQL セッションでAsia/Shanghaiを使用していても、Doris は10:11:00を返します。 - 従来の書き込み側が
INT96に保存する前に値を UTC に正規化している場合、ファイルには02:11:00が含まれることがあります。Doris が10:11:00を復元できるよう、hive.parquet.time-zoneをAsia/Shanghaiに設定します。
Catalog の作成時に互換タイムゾーンを設定します。
CREATE CATALOG hive_legacy_int96 PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9083',
'hive.parquet.time-zone' = 'Asia/Shanghai'
);
値には、Asia/Shanghai などの IANA タイムゾーン名、または -12:00 から +14:00 までの UTC オフセットを指定できます。無効な値を指定すると、Catalog の作成に失敗します。
hive.parquet.time-zone は、Catalog 内の Hive テーブルで DATETIMEV2 にマッピングされるすべての INT96 タイムスタンプカラムに適用されます。同じ Hive Metastore 内の Iceberg テーブルには影響しません。Iceberg は独自のタイムスタンプのセマンティクスを定義しているためです。Hudi も意図的にこのプロパティを無視します。ネイティブのベースファイルスキャンと JNI による merge-on-read スキャンは、どちらも SQL セッションのタイムゾーンでタイムスタンプを解釈する従来の動作を維持します。Parquet のメタデータから、INT96 の書き込み側がどの規則を使用したかを Doris が確実に判断することはできません。SQL セッションのタイムゾーンに合わせるためだけに、このプロパティを設定しないでください。1 つの Hive Metastore に、異なる規則で書き込まれた INT96 ファイルを持つ Hive テーブルが含まれる場合は、可能であれば別々の Catalog を通じて公開してください。
同じプロパティは、Parquet ファイルを読み取るファイルのテーブル値関数でも使用できます。互換変換が適用されるのは、FileScannerV2 による Parquet INT96 のデコードだけです。FileScannerV1 の動作は意図的に変更されておらず、異なる結果を返す場合があります。FileScannerV1 への切り替えは、この変更に対する互換性確保の手段ではありません。Parquet INT64 の論理タイムスタンプには影響しません。INT96 カラムが TIMESTAMPTZ にマッピングされる場合、Doris はこのプロパティを無視して UTC 上の時点を保持します。その値の表示には、引き続き TIMESTAMPTZ とセッションのタイムゾーンのセマンティクスが適用されます。
移行時の推奨事項
- Doris はデフォルトで Parquet
INT64の論理タイムスタンプを書き込みます。Hive 2 や Hive 3 などの従来のリーダーでINT96が必要な場合にのみ、enable_int96_timestamps = trueを設定してください。 - この FileScannerV2 の動作を含むバージョンにアップグレードする際は、適用前に既存の Hive テーブルを確認してください。従来の書き込み側によって正規化された
INT96ファイルを含む Catalog では、アップグレード後に異なる日時の値が返される場合があります。代表的な値を比較し、変換が必要な場合はhive.parquet.time-zoneに書き込み側のタイムゾーンを設定します。Hudi は既存のセッションタイムゾーンに従う動作を維持するため、この変更に伴う移行は不要です。 hive.parquet.time-zoneを設定する前に、代表的なファイルを調べ、既知のタイムスタンプ値と比較してください。不要な設定を行うと、修正しようとしているものと同種の時差が生じます。INT96の書き込み規則が異なるファイルは別々の Catalog に分けるか、一貫したINT64エンコーディングに書き換えてください。- Doris が
enable_int96_timestamps = trueを指定して明示的にINT96をエクスポートする場合、エクスポート時のセッションタイムゾーンを使用してタイムスタンプを正規化します。そのファイルを FileScannerV2 で読み戻すには、hive.parquet.time-zoneをエクスポート時のセッションタイムゾーンに設定します。エクスポートの概要を参照してください。
カラム型のマッピング
Doris 4.2 の完全なマッピング表、精度の規則、サポートされない型については、Hive から Doris へのデータ型のマッピングを参照してください。
例
Hive Metastore
バージョン 3.1+
- HDFS
- ViewFs
- S3
- OSS
- COS
- OBS
- GCS
- Azure Blob
- Ozone
- MinIO
Kerberos 認証なしで HMS と HDFS のサービスにアクセスする
CREATE CATALOG hive_hms_hdfs_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'fs.defaultFS' = 'hdfs://127.0.0.1:8520',
'hadoop.username' = 'doris'
);
Kerberos 認証を有効にして HMS と HDFS のサービスにアクセスする
CREATE CATALOG hive_hms_hdfs_kerberos_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.authentication.type' = 'kerberos',
'fs.defaultFS' = 'hdfs://127.0.0.1:8520',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hadoop.kerberos.keytab' = '/keytabs/hive-presto-master.keytab'
);
CREATE CATALOG hive_viewfs PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'fs.defaultFS' = 'viewfs://your-cluster',
'fs.viewfs.mounttable.your-cluster.link./ns1' = 'hdfs://your-nameservice/',
'fs.viewfs.mounttable.your-cluster.homedir' = '/ns1',
'dfs.nameservices' = 'your-nameservice',
'dfs.ha.namenodes.your-nameservice' = 'nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1' = '172.21.0.2:8088',
'dfs.namenode.rpc-address.your-nameservice.nn2' = '172.21.0.3:8088',
'dfs.client.failover.proxy.provider.your-nameservice' = 'org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
Kerberos 認証なしで HMS にアクセスする
CREATE CATALOG hive_hms_s3_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.region' = 'ap-east-1',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>'
);
IAM Assumed Role を使用して S3 アクセス認証情報を取得する(3.1.2+)
CREATE CATALOG hive_hms_on_s3_iamrole PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.region' = 'us-east-1',
's3.role_arn' = 'arn:aws:iam::543815668950:role/role'
);
Kerberos 認証なしで HMS にアクセスする
CREATE CATALOG hive_hms_on_oss_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'oss.region' = 'cn-beijing',
'oss.endpoint' = 'oss-cn-beijing.aliyuncs.com',
'oss.access_key' = '<ak>',
'oss.secret_key' = '<sk>'
);
Kerberos 認証を有効にして HMS にアクセスする
CREATE CATALOG hive_hms_on_oss_kerberos_old_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.authentication.type' = 'kerberos',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'oss.region' = 'cn-beijing',
'oss.endpoint' = 'oss-cn-beijing.aliyuncs.com',
'oss.access_key' = '<ak>',
'oss.secret_key' = '<sk>'
);
Kerberos 認証なしで HMS にアクセスする
CREATE CATALOG hive_hms_cos_test_region_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'cos.region' = 'ap-beijing',
'cos.endpoint' = 'cos.ap-beijing.myqcloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
Kerberos 認証を有効にして HMS にアクセスする
CREATE CATALOG hive_hms_on_cos_kerberos_new_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.authentication.type' = 'kerberos',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'cos.region' = 'ap-beijing',
'cos.endpoint' = 'cos.ap-beijing.myqcloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
Kerberos 認証なしで HMS にアクセスする
CREATE CATALOG test_hive_on_hms_obs_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'obs.region' = 'cn-north-4',
'obs.endpoint' = 'obs.cn-north-4.myhuaweicloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
Kerberos 認証を有効にして HMS にアクセスする
CREATE CATALOG hive_hms_on_obs_kerberos_new_catalog PROPERTIES (
'type' = 'hms',
'iceberg.catalog.type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.authentication.type' = 'kerberos',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'obs.region' = 'cn-north-4',
'obs.endpoint' = 'obs.cn-north-4.myhuaweicloud.com',
'obs.access_key' = '<ak>',
'obs.secret_key' = '<sk>'
);
Kerberos 認証なしで HMS にアクセスする
CREATE CATALOG `hive_hms_on_gcs_new_catalog` PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'gs.access_key' = '<ak>',
'gs.secret_key' = '<sk>',
'fs.gcs.support'='true'
);
3.1.3 以降でサポート
CREATE CATALOG `hive_hms_on_azure_blob_new_catalog` PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'azure.account_name' = '<account_name>',
'azure.account_key' = '<account_key>',
'azure.endpoint' = 'https://<account_name>.blob.core.windows.net',
'fs.azure.support'='true'
);
4.0.4 以降でサポート
CREATE CATALOG `hive_hms_on_ozone_new_catalog` PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'fs.ozone.support' = 'true',
'ozone.endpoint' = 'http://ozone-s3g:9878',
'ozone.access_key' = '<ak>',
'ozone.secret_key' = '<sk>',
'ozone.region' = 'us-east-1',
'ozone.use_path_style' = 'true'
);
CREATE CATALOG test_hive_on_hms_minio_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'fs.minio.support' = 'true',
'minio.use_path_style' = 'true',
'minio.endpoint' = 'http://127.0.0.1:19001',
'minio.access_key' = '<ak>',
'minio.secret_key' = '<sk>'
);
バージョン 2.1 & 3.0
- HDFS
- S3
- OSS
- COS
- OBS
- GCS
- MinIO
Kerberos 認証なしで HMS にアクセスする
CREATE CATALOG hive_hms_hdfs_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'hadoop.username' = 'doris',
'fs.defaultFS' = 'hdfs://127.0.0.1:8320'
);
Kerberos 認証を有効にして HMS にアクセスする
CREATE CATALOG test_two_hive_kerberos PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.kerberos.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'fs.defaultFS' = 'hdfs://127.0.0.1:8520',
'hadoop.kerberos.min.seconds.before.relogin' = '5',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hadoop.kerberos.keytab' = '/keytabs/hive-presto-master.keytab',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT'
);
CREATE CATALOG hms_on_s3_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.region' = 'ap-east-1',
's3.endpoint' = 'https://s3.ap-east-1.amazonaws.com',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>'
);
CREATE CATALOG hive_hms_on_oss_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'oss.region' = 'cn-beijing',
'oss.endpoint' = 'oss-cn-beijing.aliyuncs.com',
'oss.access_key' = '<ak>',
'oss.secret_key' = '<sk>'
);
CREATE CATALOG hive_hms_cos_test_region_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'cos.region' = 'ap-beijing',
'cos.endpoint' = 'cos.ap-beijing.myqcloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
CREATE CATALOG test_hive_on_hms_obs_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'obs.region' = 'cn-north-4',
'obs.endpoint' = 'obs.cn-north-4.myhuaweicloud.com',
'obs.access_key' = '<ak>',
'obs.secret_key' = '<sk>'
);
CREATE CATALOG hive_hms_on_gcs_s3 PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'warehouse' = 's3://bucket/gcs/paimon_warehouse',
'gs.access_key' = '<ak>',
'gs.secret_key' = '<sk>',
'gs.endpoint' = 'storage.googleapis.com'
);
CREATE CATALOG test_hive_on_hms_minio_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.endpoint' = 'http://127.0.0.1:19000',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>',
's3.path.style.access' = 'true'
);
AWS Glue
バージョン 3.1+
- S3
AWS Glue と S3 ストレージサービスは同じ認証情報を共有します。
CREATE CATALOG hive_glue_on_s3_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.region' = 'ap-east-1',
'glue.endpoint' = 'https://glue.ap-east-1.amazonaws.com',
'glue.access_key' = '<ak>',
'glue.secret_key' = '<sk>'
);
Glue サービスと S3 で認証情報が異なる場合は、次のように S3 の認証情報を別途指定できます。
CREATE CATALOG hive_glue_on_s3_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.region' = 'ap-east-1',
'glue.endpoint' = 'https://glue.ap-east-1.amazonaws.com',
'glue.access_key' = '<ak>',
'glue.secret_key' = '<sk>',
's3.region' = 'ap-east-1',
's3.endpoint' = 'https://s3.ap-east-1.amazonaws.com/',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>'
);
IAM Assumed Role を使用して S3 アクセス認証情報を取得する(3.1.2+ 以降)
CREATE CATALOG `glue_hive_iamrole` PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.region' = 'us-east-1',
'glue.endpoint' = 'https://glue.us-east-1.amazonaws.com',
'glue.role_arn' = '<role_arn>'
);
バージョン 2.1 & 3.0
- S3
AWS Glue と S3 ストレージサービスは同じ認証情報を共有します。
EC2 以外の環境では、aws configure を使用して認証情報を設定し、~/.aws ディレクトリに認証情報ファイルを生成する必要があります。
または、Catalog の作成時に認証情報プロバイダのファクトリクラスを明示的に指定できます。
"aws.catalog.credentials.provider.factory.class" = "com.amazonaws.glue.catalog.credentials.ConfigurationAWSCredentialsProviderFactory"create catalog hive_glue PROPERTIES(
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.endpoint' = 'https://glue.ap-northeast-1.amazonaws.com',
'glue.region' = 'ap-northeast-1',
'glue.access_key' = '<ak>',
'glue.secret_key' = '<sk>'
);
Aliyun DLF
バージョン 3.1+
- DLF 1.0
CREATE CATALOG hive_dlf_oss_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'dlf',
'dlf.uid' = '203225413946383283',
'dlf.catalog_id' = 'p2_regression_case',
'dlf.endpoint' = 'dlf.cn-beijing.aliyuncs.com',
'dlf.region' = 'cn-beijing',
'dlf.access_key' = '<ak>',
'dlf.secret_key' = '<sk>'
);
バージョン 2.1 & 3.0
- DLF 1.0
CREATE CATALOG hive_dlf_oss_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'dlf',
'dlf.uid' = '203225413946383283',
'dlf.catalog.id' = 'p2_regression_case',
'dlf.endpoint' = 'dlf.cn-beijing.aliyuncs.com',
'dlf.region' = 'cn-beijing',
'dlf.access_key' = '<ak>',
'dlf.secret_key' = '<sk>'
);
クエリ操作
基本的なクエリ
Catalog を設定した後、次の方法で Catalog 内のテーブルデータをクエリできます。
-- 1. switch to catalog, use database and query
SWITCH hive_ctl;
USE hive_db;
SELECT * FROM hive_tbl LIMIT 10;
-- 2. use hive database directly
USE hive_ctl.hive_db;
SELECT * FROM hive_tbl LIMIT 10;
-- 3. use full qualified name to query
SELECT * FROM hive_ctl.hive_db.hive_tbl LIMIT 10;
Hive パーティションのクエリ
Hive のパーティション情報は、次の 2 つの方法でクエリできます。
-
SHOW PARTITIONS FROM [catalog.][db.]hive_tableこの文は、指定した Hive テーブルのすべてのパーティションとその値を一覧表示します。
SHOW PARTITIONS FROM hive_table;
+--------------------------------+
| Partition |
+--------------------------------+
| pt1=2024-10-10/pt2=beijing |
| pt1=2024-10-10/pt2=shanghai |
| pt1=2024-10-11/pt2=beijing |
| pt1=2024-10-11/pt2=shanghai |
| pt1=2024-10-12/pt2=nanjing |
+--------------------------------+ -
table$partitionsメタデータテーブルの使用バージョン 2.1.7 および 3.0.3 以降では、
table$partitionsメタデータテーブルを通じて Hive のパーティション情報をクエリできます。このテーブルはリレーショナルテーブルであり、各パーティションカラムがカラムとして表現されるため、任意の SELECT 文で使用できます。SELECT * FROM hive_table$partitions;
+------------+-------------+
| pt1 | pt2 |
+------------+-------------+
| 2024-10-10 | beijing |
| 2024-10-10 | shanghai |
| 2024-10-12 | nanjing |
| 2024-10-11 | beijing |
| 2024-10-11 | shanghai |
+------------+-------------+
バージョン 4.1.4 以降、Hive のディレクトリ形式のパーティション分割で使用されるデフォルトパーティションのマーカー __HIVE_DEFAULT_PARTITION__ は、文字列 \N としてエンコードされる代わりに、実際の NULL 値に変換されます。同時に、パーティションパスに実際に保存されたリテラルの \N はデータとして保持されます。
4.1.4 より前は、この 2 つを区別できず、どちらもクエリ結果に \N として表示されていました。アップグレード後は、WHERE <partition_col> IS NULL が Hive のデフォルトパーティションに正しく一致します。
Hive トランザクションテーブルのクエリ
Hive トランザクションテーブルは ACID セマンティクスをサポートします。詳しくは Hive Transactions を参照してください。
-
Hive トランザクションテーブルのサポート
テーブルの種類 Hive でサポートされる操作 Hive テーブルのプロパティ サポートされる Hive バージョン Full-ACID トランザクションテーブル Insert、Update、Delete をサポート 'transactional'='true'4.x、3.x、2.x(2.x の読み取りには Hive での Major Compaction が必要) Insert-Only トランザクションテーブル Insert のみをサポート 'transactional'='true','transactional_properties'='insert_only'4.x、3.x、2.x(Catalog の作成時に hive.versionを指定) -
現在の制限事項
Original Files を含むケースはサポートされません。テーブルをトランザクションテーブルに変換すると、新しいデータファイルには Hive トランザクションテーブルのスキーマが使用されますが、既存のデータファイルは変換されません。これらのファイルを Original Files と呼びます。
Hive ビューのクエリ
Hive ビューをクエリできますが、次の制限があります。
-
Hive ビューの定義(HiveQL)は、Doris がサポートする SQL 文と互換性がある必要があります。互換性がない場合は解析エラーが発生します。
-
HiveQL がサポートする関数の中には、Doris の関数と名前が同じでも動作が異なるものがあります。そのため、Hive と Doris で得られる結果が異なる場合があります。このような問題が発生した場合は、コミュニティに報告してください。
関連パラメータ
- セッション変数
| パラメータ名 | デフォルト値 | 説明 | 対応開始バージョン |
|---|---|---|---|
hive_parquet_use_column_names | true | Doris が Hive テーブルの Parquet データを読み取る際、デフォルトでは Hive テーブルのカラム名に基づき、Parquet ファイル内で同名のカラムを探してデータを読み取ります。この変数を false にすると、カラム名に関係なく Hive テーブル内のカラム順序に従って Parquet ファイルからデータを読み取ります。Hive の parquet.column.index.access 変数に似ています。このパラメータは最上位のカラム名にのみ適用され、Struct の内部では無効です。 | 2.1.6+、3.0.3+ |
hive_orc_use_column_names | true | hive_parquet_use_column_names と同様に、Hive テーブルの ORC データに適用されます。Hive の orc.force.positional.evolution 変数に似ています。 | 2.1.6+、3.0.3+ |
書き込み操作
INSERT 文を使用して Hive テーブルにデータを書き込めます。Doris が作成した Hive テーブル、および互換性のある形式の既存の Hive テーブルでサポートされます。
パーティションテーブルでは、データに応じて対応するパーティションに自動的に書き込まれるか、新しいパーティションが作成されます。4.1.5 以降、PARTITION (column = literal) は静的パーティション、および静的パーティションカラムと動的パーティションカラムの組み合わせをサポートします。静的パーティションカラムは INSERT の対象カラムリストと SELECT または VALUES の出力から除外し、残りの動的パーティションカラムを入力で指定します。
INSERT INTO
INSERT 操作は、対象テーブルにデータを追加します。
INSERT INTO hive_tbl VALUES (val1, val2, val3, val4);
INSERT INTO hive_ctl.hive_db.hive_tbl SELECT col1, col2 FROM internal.db1.tbl1;
INSERT INTO hive_tbl(col1, col2) VALUES (val1, val2);
INSERT INTO hive_tbl(col1, col2, partition_col1, partition_col2) VALUES (1, 2, "beijing", "2023-12-12");
4.1.5 以降、静的パーティション、または静的パーティションと動的パーティションの組み合わせへの書き込みをサポートします。
-- Full Static Partition
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
VALUES (val1, val2);
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
SELECT col1, col2 FROM source_table;
-- Hybrid Partition Mode: "partition_col1" is static, "partition_col2" comes from SELECT dynamically
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30')
VALUES (val1, val2, partition_val2);
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30')
SELECT col1, col2, partition_col2 FROM source_table;
INSERT OVERWRITE
INSERT OVERWRITE は、テーブル内の既存データを新しいデータで完全に置き換えます。
INSERT OVERWRITE TABLE hive_tbl VALUES (val1, val2, val3, val4);
INSERT OVERWRITE TABLE hive_ctl.hive_db.hive_tbl(col1, col2) SELECT col1, col2 FROM internal.db1.tbl1;
4.1.5 以降、静的パーティション、または静的パーティションと動的パーティションの組み合わせへの書き込みをサポートします。
-- Full Static Partition
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
VALUES (val1, val2);
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
SELECT col1, col2 FROM source_table;
-- Hybrid Partition Mode: "partition_col1" is static, "partition_col2" comes from SELECT dynamically
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30')
VALUES (val1, val2, partition_val2);
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30')
SELECT col1, col2, partition_col2 FROM source_table;
INSERT OVERWRITE のセマンティクスは Hive と同じで、次のように動作します。
-
対象テーブルがパーティションテーブルで、ソーステーブルが空の場合、操作は何も行いません。対象テーブルは変更されません。
-
対象テーブルが非パーティションテーブルで、ソーステーブルが空の場合、対象テーブルのデータは消去されます。
-
4.1.5 以降、書き込み時に静的パーティションを指定できるほか、静的パーティションと動的パーティションを組み合わせたモードもサポートされます。ただし、静的パーティションを指定しても、ソースクエリの結果が空の場合、指定したパーティションのデータは消去されません。
静的パーティションの完全な例(4.1.5 以降)
このページで説明した Hive Catalog を設定し、既存の hive_ctl.hive_db データベースを用意して、テーブルの作成、書き込み、クエリの権限を付与します。書き込みに使用する Catalog では fs.defaultFS の設定が必要です。この例では、静的な日付と動的な地域を組み合わせた後、完全に指定した 1 つの静的パーティションを上書きします。
CREATE TABLE hive_ctl.hive_db.static_write_demo (
id INT,
dt STRING,
region STRING
)
ENGINE=HIVE
PARTITION BY LIST (dt, region) ()
PROPERTIES ("file_format" = "parquet");
INSERT INTO hive_ctl.hive_db.static_write_demo PARTITION (dt='2026-10-01')
VALUES (1, 'beijing'), (2, 'shanghai');
INSERT OVERWRITE TABLE hive_ctl.hive_db.static_write_demo
PARTITION (dt='2026-10-01', region='beijing') VALUES (3);
SELECT id, dt, region FROM hive_ctl.hive_db.static_write_demo ORDER BY id;
+----+------------+----------+
| id | dt | region |
+----+------------+----------+
| 2 | 2026-10-01 | shanghai |
| 3 | 2026-10-01 | beijing |
+----+------------+----------+
静的パーティションの値はリテラルである必要があります。同じパーティションキーを複数回指定したり、明示的な INSERT カラムリストに静的パーティションカラムを重複して指定したりしないでください。静的キー名の照合では大文字と小文字が区別されません。存在しないパーティションカラムを指定するとエラーになります。
CTAS
CTAS (CREATE TABLE AS SELECT) 文を使用すると、Hive テーブルを作成してデータを挿入できます。
CREATE TABLE hive_ctas ENGINE=hive AS SELECT * FROM other_table;
次のように、CTAS ではファイル形式やパーティション方式なども指定できます。
CREATE TABLE hive_ctas ENGINE=hive
PARTITION BY LIST (pt1, pt2) ()
AS SELECT col1, pt1, pt2 FROM part_ctas_src WHERE col1 > 0;
CREATE TABLE hive_ctl.hive_db.hive_ctas (col1, col2, pt1) ENGINE=hive
PARTITION BY LIST (pt1) ()
PROPERTIES (
"file_format"="parquet",
"compression"="zstd"
)
AS SELECT col1, pt1 AS col2, pt2 AS pt1 FROM test_ctas.part_ctas_src WHERE col1 > 0;
関連パラメータ
-
BE の設定
パラメータ名 デフォルト値 説明 hive_sink_max_file_size1GB データファイルの最大サイズ。データサイズがこの制限を超えると、現在のファイルを閉じ、新しいファイルを作成して書き込みを続けます。 table_sink_partition_write_max_partition_nums_per_writer128 BE ノード上の各インスタンスが書き込めるパーティションの最大数。 table_sink_non_partition_write_scaling_data_processed_threshold25MB 非パーティションテーブルで書き込みの並列度を増やし始めるデータ量のしきい値。 table_sink_non_partition_write_scaling_data_processed_threshold分のデータが追加されるたびに、新しい writer(インスタンス)が使用されます。この仕組みはデータ量に応じて writer(インスタンス)の数を調整し、同時書き込みのスループットを高めます。データ量が少ない場合はリソースを節約し、ファイル数を抑えます。table_sink_partition_write_min_data_processed_rebalance_threshold25MB パーティションテーブルの再バランスを開始するための最小データ量のしきい値。 現在までの累積データ量-前回の再バランス以降または初期累積以降のデータ量>=table_sink_partition_write_min_data_processed_rebalance_thresholdの場合に再バランスが実行されます。最終的なファイルサイズのばらつきが大きい場合は、このしきい値を下げるとバランスが改善します。ただし、しきい値を下げると再バランスのコストが増え、性能に影響する可能性があります。table_sink_partition_write_min_partition_data_processed_rebalance_threshold15MB 再バランスを開始するための最小パーティションデータ量のしきい値。 現在のパーティションデータ量>=しきい値*そのパーティションに割り当て済みのタスク数の場合に再バランスが実行されます。最終的なファイルサイズのばらつきが大きい場合は、このしきい値を下げるとバランスが改善します。ただし、しきい値を下げると再バランスのコストが増え、性能に影響する可能性があります。
データベースとテーブルの管理
ユーザーは Doris を通じて Hive Metastore 内のデータベースとテーブルを作成、削除できます。これらの操作で Doris が行うのは Hive Metastore API の呼び出しだけであり、Hive メタデータ自体を Doris が保存または永続化することはありません。
データベースの作成と削除
SWITCH 文で適切な Catalog に切り替え、CREATE DATABASE 文を実行できます。
SWITCH hive_ctl;
CREATE DATABASE [IF NOT EXISTS] hive_db;
次のように、完全修飾名を使用してデータベースを作成したり、保存場所を指定したりすることもできます。
CREATE DATABASE [IF NOT EXISTS] hive_ctl.hive_db;
CREATE DATABASE [IF NOT EXISTS] hive_ctl.hive_db
PROPERTIES ('location'='hdfs://172.21.16.47:4007/path/to/db/');
SHOW CREATE DATABASE コマンドでデータベースの保存場所を確認できます。
mysql> SHOW CREATE DATABASE hive_db;
+----------+---------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------------------------------+
| hive_db | CREATE DATABASE hive_db LOCATION 'hdfs://172.21.16.47:4007/usr/hive/warehouse/hive_db.db' |
+----------+---------------------------------------------------------------------------------------------+
データベースを削除するには、次の文を実行します。
DROP DATABASE [IF EXISTS] hive_ctl.hive_db;
Hive データベースを削除するには、まずそのデータベース内のすべてのテーブルを削除する必要があります。削除していない場合はエラーが発生します。この操作により、Hive 内の対応するデータベースも削除されます。
テーブルの作成と削除
-
テーブルの作成
Doris では、Hive にパーティションテーブルと非パーティションテーブルの両方を作成できます。
-- Create unpartitioned hive table
CREATE TABLE unpartitioned_table (
`col1` BOOLEAN COMMENT 'col1',
`col2` INT COMMENT 'col2',
`col3` BIGINT COMMENT 'col3',
`col4` CHAR(10) COMMENT 'col4',
`col5` FLOAT COMMENT 'col5',
`col6` DOUBLE COMMENT 'col6',
`col7` DECIMAL(9,4) COMMENT 'col7',
`col8` VARCHAR(11) COMMENT 'col8',
`col9` STRING COMMENT 'col9'
) ENGINE=hive
PROPERTIES (
'file_format'='parquet'
);
-- Create partitioned hive table
-- The partition columns must be in table's column definition list
CREATE TABLE partition_table (
`col1` BOOLEAN COMMENT 'col1',
`col2` INT COMMENT 'col2',
`col3` BIGINT COMMENT 'col3',
`col4` DECIMAL(2,1) COMMENT 'col4',
`pt1` VARCHAR COMMENT 'pt1',
`pt2` VARCHAR COMMENT 'pt2'
) ENGINE=hive
PARTITION BY LIST (pt1, pt2) ()
PROPERTIES (
'file_format'='orc',
'compression'='zlib'
);
-- Create text format table(Since 2.1.7 & 3.0.3)
CREATE TABLE text_table (
`id` INT,
`name` STRING
) PROPERTIES (
'file_format'='text',
'compression'='gzip',
'field.delim'='\t',
'line.delim'='\n',
'collection.delim'=';',
'mapkey.delim'=':',
'serialization.null.format'='\\N',
'escape.delim'='\\'
);テーブルを作成した後は、
SHOW CREATE TABLEコマンドで Hive テーブルの作成文を確認できます。Hive のテーブル作成構文とは異なり、Doris でパーティションテーブルを作成する場合、パーティションカラムをテーブルスキーマに含める必要があります。また、パーティションカラムはスキーマの末尾に、同じ順序で配置する必要があります。
ヒントACID トランザクション機能がデフォルトで有効になっている Hive クラスターでは、Doris が作成するテーブルの
transactionalプロパティがtrueに設定されます。Doris がサポートする Hive トランザクションテーブルの機能は一部に限られるため、Doris 自身が作成した Hive テーブルを読み取れない場合があります。これを避けるには、テーブルプロパティに"transactional" = "false"を明示的に設定し、非トランザクションの Hive テーブルを作成します。CREATE TABLE non_acid_table(
`col1` BOOLEAN COMMENT 'col1',
`col2` INT COMMENT 'col2',
`col3` BIGINT COMMENT 'col3'
) ENGINE=hive
PROPERTIES (
'transactional'='false'
); -
テーブルの削除
DROP TABLE文で Hive テーブルを削除できます。テーブルを削除すると、パーティションデータを含むすべてのデータも削除されます。 -
カラム型のマッピング
詳しくは「カラム型のマッピング」セクションを参照してください。次の制限事項に注意してください。
- カラムには、デフォルトの NULL 許容型を使用する必要があります。
NOT NULLはサポートされません。 - Hive 3.0 はデフォルト値の設定をサポートします。デフォルト値を設定するには、Catalog プロパティに
"hive.version" = "3.0.0"を明示的に追加します。 - 挿入するデータ型に互換性がない場合(数値型に
'abc'を挿入する場合など)、値はnullに変換されます。
- カラムには、デフォルトの NULL 許容型を使用する必要があります。
-
パーティション分割
Hive のパーティション型は、Doris の List パーティションに対応します。そのため、Doris で Hive のパーティションテーブルを作成するときは List パーティション構文を使用しますが、各パーティションを明示的に列挙する必要はありません。データの挿入時に、Doris がデータの値に基づいて対応する Hive パーティションを自動的に作成します。単一カラムおよび複数カラムによるパーティション分割をサポートします。
-
ファイル形式
-
ORC(デフォルト)
-
Parquet
DATETIME 型を Parquet ファイルに書き込む場合、物理型には INT64 ではなく INT96 が使用されます。これは Hive 4.0 より前のバージョンの処理との互換性を保つためです。
-
Text(バージョン 2.1.7 および 3.0.3 以降でサポート)
Text 形式では、次のテーブルプロパティをサポートします。
field.delim: カラムの区切り文字。デフォルトは\1です。line.delim: 行の区切り文字。デフォルトは\nです。collection.delim: 複合型の要素の区切り文字。デフォルトは\2です。mapkey.delim: マップのキーと値の区切り文字。デフォルトは\3です。serialization.null.format:NULL値を保存する形式。デフォルトは\Nです。escape.delim: エスケープ文字。デフォルトは\です。
-
-
圧縮形式
- Parquet: snappy(デフォルト)、zstd、plain(非圧縮)
- ORC: snappy、zlib(デフォルト)、zstd、plain(非圧縮)
- Text: gzip、deflate、bzip2、zstd、lz4、lzo、snappy、plain(デフォルト、非圧縮)
-
ストレージ媒体
- HDFS
- オブジェクトストレージ
Hive Metastore イベントの購読
FE ノードが HMS の Notification Events を定期的に読み取ることで、Doris は Hive テーブルのメタデータの変更をリアルタイムで検出し、メタデータの鮮度を高めることができます。現在、次のイベントをサポートしています。
| イベント | 動作と対応する処理 |
|---|---|
| CREATE DATABASE | 対応するデータディレクトリにデータベースを作成します。 |
| DROP DATABASE | 対応するデータディレクトリからデータベースを削除します。 |
| ALTER DATABASE | 主にデータベースのプロパティ、コメント、デフォルトの保存場所の変更に関係します。これらの変更は Doris による外部データディレクトリのクエリに影響しないため、現在このイベントは無視されます。 |
| CREATE TABLE | 対応するデータベースにテーブルを作成します。 |
| DROP TABLE | 対応するデータベースからテーブルを削除し、テーブルキャッシュを無効化します。 |
| ALTER TABLE | 名前が変更された場合は古いテーブルを削除して新しい名前でテーブルを作成します。それ以外の場合はテーブルキャッシュを無効化します。 |
| ADD PARTITION | 対応するテーブルのキャッシュ済みパーティション一覧にパーティションを追加します。 |
| DROP PARTITION | キャッシュ済みパーティション一覧からパーティションを削除し、パーティションキャッシュを無効化します。 |
| ALTER PARTITION | 名前が変更された場合は古いパーティションを削除して新しい名前でパーティションを作成します。それ以外の場合はパーティションキャッシュを無効化します。 |
-
データのインポートによってファイルが変更されると、パーティションテーブルでは
ALTER PARTITIONイベントが、非パーティションテーブルではALTER TABLEイベントが発生します。 -
HMS を経由せずにファイルシステムを直接操作した場合、HMS は対応するイベントを生成せず、Doris はメタデータの変更を検出できません。
fe.conf の次のパラメータがこの機能に関係します。
-
enable_hms_events_incremental_sync: メタデータの自動増分同期を有効にします。デフォルトでは無効です。 -
hms_events_polling_interval_ms: イベントを読み取る間隔。デフォルトは 10000 ミリ秒です。 -
hms_events_batch_size_per_rpc: RPC ごとに読み取るイベントの最大数。デフォルトは 500 です。
この機能を使用するには(Huawei Cloud MRS を除く)、HMS の hive-site.xml を変更し、HMS と HiveServer2 の両方を再起動する必要があります。
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.dml.events</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.transactional.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
Huawei Cloud MRS では、hivemetastore-site.xml を変更し、HMS と HiveServer2 の両方を再起動する必要があります。
<property>
<name>metastore.transactional.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
付録
トランザクションの仕組み
Hive への書き込み操作は、個別のトランザクションで実行されます。トランザクションがコミットされるまで、データは外部から見えません。コミット後に初めて、関連するテーブル操作がほかのユーザーから見えるようになります。
トランザクションは操作の原子性を保証します。つまり、トランザクション内のすべての操作がまとめて成功するか、まとめて失敗します。
トランザクションは操作の分離性を完全には保証できませんが、ファイルシステム操作と Hive Metastore のメタデータ操作を分けることで、不整合を最小限に抑えます。
たとえば、Hive テーブルの複数のパーティションを変更するトランザクションで、タスクを 2 つのバッチに分けた場合、2 番目のバッチが完了する前に 1 番目のバッチが外部から見えることがあります。この場合、1 番目のバッチのパーティションは読み取れますが、2 番目のバッチのパーティションは読み取れません。
トランザクションのコミット中に例外が発生した場合は、HDFS ファイルと Hive Metastore のメタデータに対する変更を含め、トランザクション全体がロールバックされます。ユーザーによる追加の操作は不要です。
同時書き込みの仕組み
Apache Doris は現在、複数の insert 文を使用した同時書き込みをサポートしています。ただし、同時書き込みによって競合が発生しないよう、ユーザーが確認する必要があります。
通常の非トランザクション Hive テーブルには完全なトランザクション機構がないため、Apache Doris のトランザクション機構は不整合が生じる時間を最小限に抑えることを目指していますが、真の ACID 特性は保証できません。そのため、Apache Doris から Hive テーブルへの同時書き込みは、データの整合性に問題を引き起こす可能性があります。
-
同時
INSERT操作 -
INSERT操作はデータを追加するため、同時に実行しても競合せず、期待どおりの結果になります。 -
同時
INSERT OVERWRITE操作 -
同じテーブルまたはパーティションに対して
INSERT OVERWRITEを同時に実行すると、データの消失や破損につながり、結果が予測できなくなる場合があります。 -
一般的な対処方法は次のとおりです。
-
パーティションテーブルでは、異なるパーティションにデータを書き込みます。異なるパーティションに対する同時操作は競合しません。
-
非パーティションテーブルでは、競合を避けるために
INSERT OVERWRITEではなくINSERTを使用します。 -
競合する可能性がある操作では、業務側で書き込み操作が同時に 1 つしか実行されないようにします。
-
HDFS ファイル操作
HDFS 上の Hive テーブルデータは、通常、まず一時ディレクトリに書き込まれ、次に rename などのファイルシステム操作で確定されます。以下では、データ操作ごとに HDFS 上で実行されるファイル操作を詳しく説明します。
データ用の一時ディレクトリの形式は /tmp/.doris_staging/<username>/<uuid> です。
書き込まれるデータファイル名の形式は <query-id>_<uuid>-<index>.<compress-type>.<file-type> です。
各シナリオにおけるファイル操作の例を示します。
-
非パーティションテーブル
-
追加(データの追加)
-
対象テーブルのディレクトリ:
hdfs://ns/usr/hive/warehouse/example.db/table1 -
一時ファイル:
hdfs://ns/tmp/.doris_staging/root/f02247cb662846038baae272af5eeb05/b35fdbcea3a4e39-86d1f36987ef1492_7e3985bf-9de9-4fc7-b84e-adf11aa08756-0.orc -
コミット段階で、すべての一時ファイルが対象テーブルのディレクトリに移動されます。
-
-
上書き(データの置き換え)
-
対象テーブルのディレクトリ:
hdfs://ns/usr/hive/warehouse/example.db/table1 -
一時ファイル:
hdfs://ns/tmp/.doris_staging/root/f02247cb662846038baae272af5eeb05/b35fdbcea3a4e39-86d1f36987ef1492_7e3985bf-9de9-4fc7-b84e-adf11aa08756-0.orc -
コミット段階の手順:
-
対象テーブルのディレクトリを一時ディレクトリにリネームします:
hdfs://ns/usr/hive/warehouse/example.db/_temp_b35fdbcea3a4e39-86d1f36987ef1492_table1 -
一時ディレクトリを対象テーブルのディレクトリにリネームします。
-
一時的に退避した対象テーブルのディレクトリを削除します。
-
-
-
-
パーティションテーブル
-
新規追加(新しいパーティションへの追加)
-
対象テーブルのディレクトリ:
hdfs://ns/usr/hive/warehouse/example.db/table2/part_col=2024-01-01 -
一時ファイル:
hdfs://ns/tmp/.doris_staging/root/a7eac7505d7a42fdb06cb9ef1ea3e912/par1=a/d678a74d232345e0-b659e2fb58e86ffd_549ad677-ee75-4fa1-b8a6-3e821e1dae61-0.orc -
コミット段階で、一時ディレクトリが対象テーブルのディレクトリにリネームされます。
-
-
追加(既存パーティションへのデータの追加)
-
対象テーブルのディレクトリ:
hdfs://ns/usr/hive/warehouse/example.db/table2/part_col=2024-01-01 -
一時ファイル:
hdfs://ns/tmp/.doris_staging/root/a7eac7505d7a42fdb06cb9ef1ea3e912/par1=a/d678a74d232345e0-b659e2fb58e86ffd_549ad677-ee75-4fa1-b8a6-3e821e1dae61-0.orc -
コミット段階で、一時ディレクトリ内のファイルが対象テーブルのディレクトリに移動されます。
-
-
上書き(既存パーティションの置き換え)
-
対象テーブルのディレクトリ:
hdfs://ns/usr/hive/warehouse/example.db/table2/part_col=2024-01-01 -
一時ファイル:
hdfs://ns/tmp/.doris_staging/root/a7eac7505d7a42fdb06cb9ef1ea3e912/par1=a/d678a74d232345e0-b659e2fb58e86ffd_549ad677-ee75-4fa1-b8a6-3e821e1dae61-0.orc -
コミット段階の手順:
-
対象パーティションのディレクトリを一時パーティションディレクトリにリネームします:
hdfs://ns/usr/hive/warehouse/example.db/table2/_temp_d678a74d232345e0-b659e2fb58e86ffd_part_col=2024-01-01 -
一時パーティションディレクトリを対象パーティションのディレクトリにリネームします。
-
一時的に退避した対象パーティションのディレクトリを削除します。
-
-
-
変更履歴
| Doris バージョン | サポートされた機能 |
|---|---|
| 2.1.6 | Hive テーブルへの書き戻しをサポート |
| 3.0.4 | JsonSerDe 形式の Hive テーブルと、Hive4 のトランザクションテーブルをサポート。 |