メタデータキャッシュ
このドキュメントは 4.1.x より前のバージョンに適用されます。
Doris 4.1.x 以降では、外部メタデータキャッシュが統一された設定キー meta.cache.* を使用するように再構成されています。各 Catalog ドキュメントの「メタデータキャッシュ」セクションを参照してください。
Apache Doris は外部データソースへのアクセス性能を向上させるため、外部データソースのメタデータをキャッシュします。
メタデータには、データベース、テーブル、カラム、パーティション、スナップショット、ファイル一覧などの情報が含まれます。
この記事では、従来のバージョン(4.1 より前)におけるメタデータキャッシュの種類、戦略、および関連するパラメータ設定について詳しく説明します。
データキャッシュについては、データキャッシュのドキュメントを参照してください。
Doris 4.1.4 の外部メタデータキャッシュのメモリ制限については、外部メタデータキャッシュのメモリ管理を参照してください。
キャッシュ戦略
ほとんどのキャッシュには、次の三つの戦略指標があります。
-
キャッシュの最大件数
キャッシュが保持できるオブジェクトの最大数です。たとえば、最大 1000 個のテーブルをキャッシュできます。キャッシュの件数がしきい値を超えると、LRU(Least-Recent-Used)戦略によって一部のキャッシュが削除されます。
-
破棄時間
-
バージョン 3.0.6 以前(同バージョンを含む):
キャッシュオブジェクトがキャッシュに書き込まれてから一定時間が経過すると、そのオブジェクトは自動的にキャッシュから削除されます。次回のアクセス時には、データソースから最新の情報を再取得してキャッシュを更新します。
たとえば、ユーザーが 08:00 に初めてテーブル A にアクセスしてキャッシュに書き込んだとします。破棄時間が 4 時間の場合、容量の制約によって置き換えられない限り、08:00~14:00 の間はキャッシュ内のテーブル A に直接アクセスします。14:00 を過ぎるとキャッシュが破棄されます。その後、ユーザーが再びテーブル A にアクセスすると、データソースから最新の情報を取得してキャッシュを更新します。
-
バージョン 3.0.7 以降(同バージョンを含む):
バージョン 3.0.7 以降、この戦略はキャッシュオブジェクトがアクセスされてから一定時間が経過すると自動的に削除される方式に変更されました。書き込まれてから一定時間が経過すると削除される方式ではありません。キャッシュオブジェクトにアクセスするたびにタイマーがリセットされるため、頻繁にアクセスされるオブジェクトはキャッシュに残り続けます。
たとえば、ユーザーが 08:00 に初めてテーブル A にアクセスしてキャッシュに書き込んだとします。破棄時間が 4 時間の場合、容量の制約によって置き換えられない限り、08:00~14:00 の間はキャッシュ内のテーブル A に直接アクセスします。ユーザーが 09:00 にこのオブジェクトへ再度アクセスすると、キャッシュの破棄時間は 09:00 を起点として再計算され、15:00 になります。
-
-
最小更新時間
キャッシュオブジェクトがキャッシュに書き込まれてから一定時間が経過すると、更新が自動的にトリガーされます。
たとえば、ユーザーが 08:00 に初めてテーブル A にアクセスしてキャッシュに書き込んだとします。最小更新時間が 10 分の場合、容量の制約によって置き換えられない限り、08:00~8:10 の間はキャッシュ内のテーブル A に直接アクセスします。08:10 になると、キャッシュオブジェクトには[更新準備完了]の印が付きます。ユーザーがこのキャッシュオブジェクトに再度アクセスすると、現在のオブジェクトが引き続き返されると同時に、キャッシュの更新処理が開始されます。キャッシュの更新に 1 分かかるとすると、1 分後に再度アクセスしたときには更新済みのキャッシュオブジェクトを取得できます。
キャッシュの更新がトリガーされるのは、[最小更新時間を超えた後、キャッシュオブジェクトへの最初のアクセスがあったとき]であり、更新は非同期に行われます。したがって、たとえば最小更新時間が 10 分であっても、10 分後に最新のオブジェクトを取得できるとは限りません。
この戦略は[破棄時間]とは異なり、主にキャッシュの鮮度を調整するために使用します。キャッシュを非同期に更新することで、現在の処理がブロックされることも防ぎます。
キャッシュの種類
以下のセクションでは、代表的な FE レベルのデフォルト値と従来のキャッシュ制御方法について説明します。 これらを Doris 4.1.x 以降のキャッシュエントリの完全な一覧として扱わないでください。
| 分類 | スコープ | 主な FE のデフォルト設定 | 備考 |
|---|---|---|---|
| データベース名/テーブル名の一覧 | カタログごと/データベースごと | external_cache_expire_time_seconds_after_access, external_cache_refresh_time_minutes | SHOW DATABASES/SHOW TABLES で使用 |
| データベース/テーブルのオブジェクト | カタログごと/データベースごと | max_meta_object_cache_num, external_cache_expire_time_seconds_after_access, external_cache_refresh_time_minutes | オブジェクトキャッシュと名前一覧のキャッシュは一時的に異なる場合がある |
| テーブルスキーマ | カタログごと | max_external_schema_cache_num, external_cache_expire_time_seconds_after_access, external_cache_refresh_time_minutes | 従来のカタログ単位の上書き設定: schema.cache.ttl-second |
| Hive のパーティション値 | Hive カタログごと | max_hive_partition_table_cache_num, external_cache_expire_time_seconds_after_access, external_cache_refresh_time_minutes | 従来のカタログ単位の上書き設定: partition.cache.ttl-second |
| Hive のパーティション属性 | Hive カタログごと | max_hive_partition_cache_num, external_cache_expire_time_seconds_after_access | 従来のカタログ単位の TTL 上書き設定はない |
| Hive のファイル一覧 | Hive カタログごと | max_external_file_cache_num, external_cache_expire_time_seconds_after_access, external_cache_refresh_time_minutes | 従来のカタログ単位の上書き設定: file.meta.cache.ttl-second |
| 従来の Hudi/Iceberg/Paimon のテーブルレベルのメタデータ | カタログごと | max_external_table_cache_num, external_cache_expire_time_seconds_after_access, external_cache_refresh_time_minutes | Doris 4.1.x 以降の fs_view、meta_client、view、manifest などの現在のキャッシュエントリについては、各カタログのページを参照 |
データベース名とテーブル名の一覧
データベース名の一覧は、カタログ内のすべてのデータベース名を列挙したものです。
テーブル名の一覧は、データベース内のすべてのテーブル名を列挙したものです。
名前の一覧は、SHOW TABLES や SHOW DATABASES 文など、名前を列挙する必要がある操作でのみ使用されます。
各カタログにはデータベース名一覧のキャッシュがあり、各データベースにはテーブル名一覧のキャッシュがあります。
-
キャッシュの最大件数
各キャッシュのエントリは一つだけです。したがって、キャッシュの最大件数は 1 です。
-
破棄時間
86400 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新の名前一覧をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
データベースとテーブルのオブジェクト
個々のデータベースオブジェクトとテーブルオブジェクトをキャッシュします。クエリや書き込みなど、データベースやテーブルにアクセスする操作では、このキャッシュから対応するオブジェクトを取得します。
このキャッシュ内のオブジェクト一覧は、データベース名とテーブル名の一覧のキャッシュと一致しない場合があります。
たとえば、SHOW TABLES コマンドを実行し、名前一覧のキャッシュからテーブル A、B、C を取得したとします。この時点で外部データソースにテーブル D が追加された場合、SELECT * FROM D でテーブル D にアクセスでき、[テーブルオブジェクト]キャッシュにはテーブル D のオブジェクトが追加されます。一方、[テーブル名一覧]キャッシュには、まだ A、B、C しか含まれていない可能性があります。[テーブル名一覧]キャッシュが更新されて初めて、A、B、C、D になります。
各カタログにはデータベースオブジェクトのキャッシュがあり、各データベースにはテーブルオブジェクトのキャッシュがあります。
-
キャッシュの最大件数
FE 設定項目
max_meta_object_cache_numで制御します。デフォルト値は 1000 です。単一カタログ内のデータベース数、または単一データベース内のテーブル数に応じて、このパラメータを適切に調整できます。 -
破棄時間
86400 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新のデータベースやテーブルをより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
テーブルスキーマ
カラム名など、テーブルのスキーマ情報をキャッシュします。このキャッシュは、アクセスされたテーブルのスキーマを必要に応じて読み込むために使用します。これにより、不要な多数のテーブルスキーマを同期して FE のメモリを消費することを防ぎます。
このキャッシュはカタログごとに管理されます。
-
キャッシュの最大件数
FE 設定項目
max_external_schema_cache_numで制御します。デフォルト値は 10000 です。カタログ内のテーブルの総数に応じて、このパラメータを適切に調整できます。
-
破棄時間
86400 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新のスキーマをより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
Hive Metastore テーブルのパーティション一覧
Hive Metastore から同期されたテーブルのパーティション一覧をキャッシュするために使用します。パーティション一覧は、クエリ時のパーティションプルーニングに使用されます。
各 Hive カタログに、このキャッシュが一つあります。
-
キャッシュの最大件数
FE 設定項目
max_hive_partition_table_cache_numで制御します。デフォルト値は 1000 です。カタログ内のテーブルの総数に応じて、このパラメータを適切に調整できます。
-
破棄時間
28800 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新のパーティション一覧をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
Hive Metastore テーブルのパーティション属性
ファイル形式やパーティションのルートパスなど、Hive テーブルの各パーティションの属性をキャッシュするために使用します。各クエリでは、パーティションプルーニングによってアクセスするパーティションの一覧を取得した後、このキャッシュを通じて各パーティションの詳細な属性を取得します。
各 Hive カタログに、このキャッシュが一つあります。
-
キャッシュの最大件数
FE 設定項目
max_hive_partition_cache_numで制御します。デフォルト値は 10000 です。カタログ内でアクセスするパーティションの総数に応じて、このパラメータを適切に調整できます。
-
破棄時間
28800 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新のパーティション属性をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
Hive Metastore テーブルのパーティション内ファイル一覧
Hive テーブルの単一パーティション内にあるファイル一覧の情報をキャッシュするために使用します。このキャッシュにより、ファイルシステムの List 操作に伴うオーバーヘッドを削減します。
-
キャッシュの最大件数
FE 設定項目
max_external_file_cache_numで制御します。デフォルト値は 10000 です。アクセスするファイルの数に応じて、このパラメータを適切に調整できます。
-
破棄時間
デフォルト値は 28800 秒です。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。カタログのプロパティに
file.meta.cache.ttl-secondが設定されている場合は、その設定値が使用されます。Hive テーブルのデータファイルが頻繁に変更され、キャッシュが鮮度要件を満たせない場合があります。このパラメータを 0 に設定すると、キャッシュを無効にできます。この場合、クエリごとにファイル一覧をリアルタイムで取得するため、性能が低下する可能性がありますが、ファイル情報の鮮度は向上します。
-
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新のファイル一覧をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
Hudi テーブルのパーティション
Hudi のパーティションメタデータキャッシュに関する従来の説明です。
Doris 4.1.x 以降の現在の Hudi キャッシュエントリには、fs_view と meta_client も含まれます。Hudi Catalogを参照してください。
各 Hudi カタログに、このキャッシュが一つあります。
-
キャッシュの最大件数
FE 設定項目
max_external_table_cache_numで制御します。デフォルト値は 1000 です。Hudi テーブルの数に応じて、このパラメータを適切に調整できます。
-
破棄時間
28800 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新の Hudi パーティション属性をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
Iceberg テーブルの情報
Iceberg テーブルのメタデータキャッシュに関する従来の説明です。テーブルオブジェクトは Iceberg API を通じて読み込まれ、構築されます。 Doris 4.1.x 以降で現在確認できるキャッシュエントリについては、Iceberg Catalogを参照してください。
各 Iceberg カタログに、このキャッシュが一つあります。
-
キャッシュの最大件数
FE 設定項目
max_external_table_cache_numで制御します。デフォルト値は 1000 です。Iceberg テーブルの数に応じて、このパラメータを適切に調整できます。
-
破棄時間
28800 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新の Iceberg テーブル属性をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
Iceberg スナップショット関連のメタデータ
Iceberg テーブルのメタデータから派生するスナップショット関連メタデータについての従来の説明です。
現在の実装では、これを table、view、manifest と並ぶ、独立した 4.1.x のキャッシュエントリとして扱わないでください。
-
キャッシュの最大件数
FE 設定項目
max_external_table_cache_numで制御します。デフォルト値は 1000 です。Iceberg テーブルの数に応じて、このパラメータを適切に調整できます。
-
破棄時間
28800 秒に固定されています。バージョン 3.0.7 以降は FE パラメータ
external_cache_expire_time_seconds_after_accessで設定し、デフォルト値は 86400 秒です。 -
最小更新時間
FE 設定項目
external_cache_expire_time_minutes_after_accessで分単位で制御します。デフォルト値は 10 分です。この時間を短くすると、Doris で最新の Iceberg テーブル属性をより早く確認できますが、外部データソースへのアクセス頻度が増えます。バージョン 3.0.7 以降、設定項目の名前は
external_cache_refresh_time_minutesに変更されています。デフォルト値は変わりません。
キャッシュの更新
上記の更新戦略と破棄戦略に加えて、ユーザーはメタデータを手動または定期的に更新できます。
手動更新
REFRESH 文を使用すると、カタログ、データベース、またはテーブルのメタデータを無効化できます。
現在の構文、権限、および例については、REFRESHを参照してください。
動作の概要は次のとおりです。
REFRESH CATALOGは、カタログレベルのオブジェクトキャッシュと、デフォルトでは下位レベルのメタデータキャッシュを無効化します。REFRESH DATABASEは、一つのデータベース内のメタデータを無効化します。REFRESH TABLEは、一つのテーブルのメタデータを無効化します。REFRESH CATALOGでinvalid_cache = falseを指定すると、下位レベルのキャッシュを維持し、オブジェクトと名前の一覧だけを更新します。
定期更新
カタログの作成時に、定期的な更新を設定できます。
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'metadata_refresh_interval_sec' = '3600'
);
上の例では、metadata_refresh_interval_sec はカタログが 3600 秒ごとに更新されることを意味します。これは、3600 秒ごとに次の文を自動実行することに相当します。
REFRESH CATALOG ctl1;
ベストプラクティス
キャッシュはメタデータへのアクセス性能を大幅に向上させ、頻繁なリモートアクセスによる性能のばらつきやメタデータサービスへの負荷を防ぎます。一方、キャッシュによってデータの鮮度は低下します。たとえば、キャッシュの更新時間が 10 分の場合、その間はキャッシュされたメタデータしか読み取れません。そのため、状況に応じてキャッシュを適切に設定する必要があります。
デフォルトの動作
このセクションでは、デフォルトのパラメータ設定でユーザーが特に注意すべきキャッシュの動作を説明します。
- 外部データソースに新しいデータベースやテーブルが追加された場合、Doris では SELECT を使用してリアルタイムでクエリできます。ただし、SHOW DATABASES や SHOW TABLES には表示されない場合があります。その場合は、手動でキャッシュを更新するか、最大 10 分待つ必要があります。
- 外部データソースに新しいパーティションが追加された場合、そのパーティションの新しいデータをクエリするには、手動でキャッシュを更新するか、最大 10 分待つ必要があります。
- パーティションのデータファイルが変更された場合、そのパーティションの新しいデータをクエリするには、手動でキャッシュを更新するか、最大 10 分待つ必要があります。
スキーマキャッシュの無効化
どの種類の外部カタログでも、最新のテーブルスキーマをリアルタイムで確認したい場合は、スキーマキャッシュを無効にできます。
-
グローバルに無効化
-- fe.conf
max_external_schema_cache_num=0 // Disable Schema cache. -
従来のカタログレベルのプロパティ
-- Catalog property
"schema.cache.ttl-second" = "0" // Legacy property, supported in 2.1.11 / 3.0.6
設定後、Doris では最新のテーブルスキーマをリアルタイムで確認できます。ただし、この設定によってメタデータサービスへの負荷が増える可能性があります。
Hive カタログのメタデータキャッシュの無効化
Hive カタログでキャッシュを無効にし、リアルタイムに更新されたデータをクエリしたい場合は、次のパラメータを設定できます。
-
グローバルに無効化
-- fe.conf
max_external_file_cache_num=0 // Disable file list cache
max_hive_partition_table_cache_num=0 // Disable partition list cache
max_hive_partition_cache_num=0 // Disable partition property cache -
従来のカタログレベルのプロパティ
-- Catalog property
"file.meta.cache.ttl-second" = "0" // Disable file list cache
"partition.cache.ttl-second" = "0" // Disable partition list cache (supported in 2.1.11 / 3.0.6)
上記のパラメータを設定すると、次のようになります。
- 外部データソースの新しいパーティションをリアルタイムでクエリできます。
- パーティションのデータファイルへの変更をリアルタイムでクエリできます。
- パーティション属性への変更を反映するには、パーティション属性のキャッシュも無効にする必要があります。
ただし、Hive Metastore や HDFS などの外部データソースへのアクセス負荷が増え、メタデータアクセスの遅延が不安定になるなどの現象が発生する可能性があります。