Hive Catalog
Doris は Hive Metastore または Hive Metastore と互換性のあるメタデータサービスに接続することで、Hive のデータベースとテーブルの情報を自動的に取得し、データをクエリできます。
Hive 以外にも、多くのシステムがメタデータの保存に Hive Metastore を使用しています。そのため、Hive Catalog を通じて Hive テーブルだけでなく、メタデータの保存に Hive Metastore を使用する Iceberg や Hudi などのテーブル形式にもアクセスできます。
適用シナリオ
| シナリオ | 説明 |
|---|---|
| クエリの高速化 | 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>この Hive Catalog のテーブルへ Doris からデータを書き込む場合に必要です。例:
'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 以降でサポートされています。
-
-
{CommonProperties}CommonProperties セクションには共通属性を指定します。Catalog の概要の「共通プロパティ」セクションを参照してください。
メタデータキャッシュ
外部データソースへのアクセス性能を向上させるため、Apache Doris は Hive メタデータをキャッシュします。メタデータには、テーブル構造(スキーマ)、パーティション一覧、パーティションのプロパティ、ファイル一覧が含まれます。
Doris 4.1.x より前のバージョンでは、メタデータキャッシュは主に FE の設定項目でグローバルに制御します。詳しくはメタデータキャッシュを参照してください。
Doris 4.1.x 以降では、Hive Catalog の外部メタデータキャッシュを統一された meta.cache.* キーで設定します。
キャッシュプロパティの設定(4.1.x 以降)
各エンジンのキャッシュエントリには、統一された設定キーフォーマット meta.cache.<engine>.<entry>.{enable,ttl-second,capacity,max-weight} を使用します。現在、max-weight は推定器を備えた一部のエントリのみでサポートされています。外部メタデータキャッシュのメモリ管理を参照してください。
| プロパティ | 例 | 意味 |
|---|---|---|
enable | true/false | このキャッシュモジュールを有効にするかどうか。 |
ttl-second | 600, 0, -1 | 0 はキャッシュを無効にします(直ちに反映され、最新データの確認に使用できます)。-1 は有効期限なしを意味します。それ以外の正の整数は、アクセス時刻を基準とする TTL を秒単位で指定します。 |
capacity | 10000 | 件数で指定するキャッシュエントリの最大数。max-weight が有効な場合、件数の上限として同時には適用されませんが、0 は引き続きキャッシュを無効にします。 |
max-weight | 1GB | Doris 4.1.4 以降でサポートされます。推定される保持メモリ量の上限を任意で指定します。現在は Hive の partition_values でサポートされ、0 を指定するとそのエントリは無効になります。 |
有効になる条件: モジュールのキャッシュは、enable=true、ttl-second != 0、capacity > 0 で、かつ max-weight が未指定または 0 以外の場合に有効になります。
キャッシュモジュール
Hive Catalog には、次のキャッシュモジュールがあります。
モジュール(<entry>) | プロパティキーのプレフィックス | キャッシュする内容と影響 |
|---|---|---|
schema | meta.cache.hive.schema. | テーブル構造をキャッシュします。影響:テーブルのカラム情報がいつ反映されるかに関係します。無効にすると、クエリごとに最新のスキーマを取得します。 |
partition_values | meta.cache.hive.partition_values. | パーティションの値と名前の一覧をキャッシュします。影響:パーティションの枝刈りと列挙に関係します。無効にすると、外部で追加されたパーティションをリアルタイムに確認できます。 |
partition | meta.cache.hive.partition. | パーティションのプロパティ(Location、入力形式など)をキャッシュします。影響:各パーティションのメタデータに関係します。 |
file | meta.cache.hive.file. | ファイル一覧をキャッシュします。影響:リモートの LIST 操作の負荷を減らします。無効にすると、ファイルの変更をリアルタイムに確認できます。 |
従来のパラメータとの対応と変換
バージョン 4.1.x 以降では、統一されたキーの使用を推奨します。従来の Catalog プロパティと 4.1.x 以降の統一キーの対応は次のとおりです。
| 従来のプロパティキー | 4.1.x 以降の統一キー | 説明 |
|---|---|---|
schema.cache.ttl-second | meta.cache.hive.schema.ttl-second | テーブル構造キャッシュの有効期限 |
partition.cache.ttl-second | meta.cache.hive.partition_values.ttl-second | パーティション値キャッシュの有効期限 |
file.meta.cache.ttl-second | meta.cache.hive.file.ttl-second | ファイル一覧キャッシュの有効期限 |
ベストプラクティス
- 最新データへのリアルタイムアクセス:各クエリで外部データソースの最新のパーティションまたはファイルの変更を確認したい場合は、対応する
ttl-secondを0に設定できます。-- Disable file list cache to see file changes in real-time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.file.ttl-second" = "0");
-- Disable partition value cache to see new partitions in real-time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.partition_values.ttl-second" = "0"); - 性能の最適化:メタデータの変更が少ない場合は、
capacityとttl-secondを適切に増やし、Hive Metastore とファイルシステムへのアクセス負荷を減らすことを推奨します。
Hive Catalog に関する注意:Doris 4.1.4 以降では、Catalog プロパティの変更が成功すると、Catalog の実行コンテキストがリセットされ、その Catalog が経由するすべてのメタデータキャッシュエンジンの初期化済みエントリがクリアされます。次回のアクセス時に、新しいコンテキストと設定で再作成されます。実行中のクエリには影響しません。
可観測性
キャッシュのメトリクスは、information_schema.catalog_meta_cache_statistics システムテーブルで確認できます。
SELECT catalog_name, engine_name, entry_name,
effective_enabled, ttl_second, capacity,
estimated_size, hit_rate, load_failure_count, last_error
FROM information_schema.catalog_meta_cache_statistics
WHERE catalog_name = 'hive_ctl' AND engine_name = 'hive'
ORDER BY 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 の書き込み元のタイムゾーン(4.1.5 以降)
任意の Catalog プロパティ hive.parquet.time-zone は、Parquet INT96 を読み取る際に書き込み元のタイムゾーンを指定します。デフォルトは空文字列で、壁時計時刻をそのまま保持します。空でない値には、IANA タイムゾーン、または -12:00 から +14:00 までの UTC オフセットを指定する必要があります。UTC と GMT は使用できますが、CST や PRC などの短い別名は使用できません。たとえば "hive.parquet.time-zone" = "Asia/Shanghai" を指定します。INT96 にはタイムゾーンの注釈がないため、読み取り側のセッションから書き込み元のタイムゾーンを推測しないでください。Parquet を参照してください。
サポートされるデータ形式
カラム型のマッピング
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 を使用して Credentials 情報を設定し、~/.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 のパーティション情報は、次の方法でクエリできます。
-
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 より前は両者を区別できず、クエリ結果ではどちらも \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 の設定が必要です。この例では、静的な日付と動的な地域を組み合わせた後、完全に指定した静的パーティションを上書きします。
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増えるたびに、新しいライター(インスタンス)を使用します。この仕組みはデータ量に応じてライター(インスタンス)の数を調整し、並列書き込みのスループットを高めます。データ量が少ない場合は、リソースを節約し、ファイル数を抑えます。table_sink_partition_write_min_data_processed_rebalance_threshold25MB パーティションテーブルで再バランシングを開始するための最小データ量のしきい値。 current accumulated data volume-data volume since last rebalancing or initial accumulation>=table_sink_partition_write_min_data_processed_rebalance_thresholdの場合に再バランシングが実行されます。最終的なファイルサイズに大きなばらつきがある場合は、このしきい値を下げるとバランスが改善します。ただし、しきい値を下げると再バランシングのコストが増え、性能に影響する可能性があります。table_sink_partition_write_min_partition_data_processed_rebalance_threshold15MB 再バランシングを開始するためのパーティションデータ量の最小しきい値。 current partition data volume>=threshold*number of tasks already allocated to the partitionの場合に再バランシングが実行されます。最終的なファイルサイズに大きなばらつきがある場合は、このしきい値を下げるとバランスが改善します。ただし、しきい値を下げると再バランシングのコストが増え、性能に影響する可能性があります。
データベースとテーブルの管理
ユーザーは Doris を通じて Hive Metastore 内のデータベースやテーブルを作成・削除できます。これらの操作では、Doris は Hive Metastore API を呼び出すだけで、Hive メタデータ自体を保存または永続化しません。
データベースの作成と削除
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つのバッチに分かれている場合、後のバッチが完了する前に最初のバッチが外部から見えることがあります。この場合、最初のバッチのパーティションは読み取れますが、後のバッチのパーティションは読み取れません。
トランザクションのコミット中に例外が発生した場合は、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 のトランザクションテーブルをサポート。 |