メタデータキャッシュ
外部データソースへのアクセスパフォーマンスを改善するため、Apache Dorisは外部データソースのmetadataをキャッシュします。
Metadataには、データベース、テーブル、カラム、パーティション、スナップショット、ファイルリストなどの情報が含まれます。
この記事では、キャッシュされたmetadataの種類、戦略、および関連するパラメータ設定について詳しく説明します。
data cacheについては、data cache documentationを参照してください。
この文書は2.1.6以降のバージョンに適用されます。
キャッシュ戦略
ほとんどのキャッシュには、以下の3つの戦略指標があります:
-
最大キャッシュ数
キャッシュが保持できるオブジェクトの最大数。たとえば、最大1000個のテーブルをキャッシュできます。キャッシュ数が閾値を超えると、LRU(Least-Recent-Used)戦略を使用して一部のキャッシュが削除されます。
-
退避時間
-
バージョン3.0.6以前(3.0.6を含む):
キャッシュオブジェクトがキャッシュに書き込まれてから一定時間が経過すると、そのオブジェクトは自動的にキャッシュから削除されます。次回のアクセス時には、データソースから最新情報を再取得し、キャッシュを更新します。
たとえば、ユーザーが08:00にテーブルAに最初にアクセスし、それをキャッシュに書き込みます。退避時間が4時間の場合、容量の問題により置き換えられない限り、ユーザーは08:00-14:00の間にキャッシュ内のテーブルAに直接アクセスします。14:00以降、キャッシュは退避されます。ユーザーが再びテーブルAにアクセスすると、データソースから最新情報が取得され、キャッシュが更新されます。
-
バージョン3.0.7以降(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分後に最新のオブジェクトが取得されるとは限りません。
この戦略は[退避時間]とは異なり、主にキャッシュの適時性を調整し、キャッシュを非同期でリフレッシュすることで現在の操作をブロックすることを回避します。
キャッシュの種類
データベースとテーブル名リスト
データベース名リストは、カタログ下のすべてのデータベース名のリストを指します。
テーブル名リストは、データベース下のすべてのテーブル名のリストを指します。
名前リストは、SHOW TABLESやSHOW DATABASES文などの名前を列挙する必要がある操作でのみ使用されます。
各カタログにはデータベース名リストキャッシュがあります。各データベースにはテーブル名リストキャッシュがあります。
-
最大キャッシュ数
各キャッシュにはエントリが1つだけあります。したがって、最大キャッシュ数は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に変更されます。デフォルト値は変更されません。
table Schema
カラム名などのテーブルのschema情報をキャッシュします。このキャッシュは主に、アクセスされたテーブルのschemaをオンデマンドで読み込み、大量の不要なテーブルschemaの同期による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分です。この時間を短縮することで、最新のschemaをDorisでよりリアルタイムに確認できますが、外部データソースへのアクセス頻度が増加します。バージョン3.0.7以降、設定項目名は
external_cache_refresh_time_minutesに変更されます。デフォルト値は変更されません。
Hive Metastore table パーティション List
Hive Metastoreから同期されたテーブルのパーティションリストをキャッシュするために使用されます。パーティションリストは、クエリ時のパーティションプルーニングに使用されます。
このキャッシュは、各Hive カタログに1つあります。
-
最大キャッシュ数
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 table パーティション プロパティ
Hiveテーブルの各パーティションのプロパティ(ファイル形式、パーティションルートパスなど)をキャッシュするために使用されます。各クエリで、パーティションプルーニング後にアクセスするパーティションのリストを取得した後、このキャッシュを通じて各パーティションの詳細プロパティを取得します。
このキャッシュは、各Hive カタログに1つあります。
-
最大キャッシュ数
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 table パーティション File List
Hiveテーブルの単一パーティション下のファイルリスト情報をキャッシュするために使用されます。このキャッシュは、ファイルシステムのList操作のオーバーヘッドを削減するために使用されます。
-
最大キャッシュ数
FE設定項目
max_external_file_cache_numにより制御され、デフォルトは100000です。アクセスするファイル数に応じて、このパラメータを適切に調整できます。
-
退避時間
デフォルトは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 table Partitions
Hudиテーブルのパーティション情報をキャッシュするために使用されます。
このキャッシュは、各Hudi カタログに1つあります。
-
最大キャッシュ数
FE設定項目
max_external_table_cache_numにより制御され、デフォルトは1000です。Hudиテーブル数に応じて、このパラメータを適切に調整できます。
-
退避時間
28800秒に固定されています。バージョン3.0.7以降、FEパラメータ
external_cache_expire_time_seconds_after_accessで設定され、デフォルトは86400秒です。 -
最小リフレッシュ時間
FE設定項目
external_cache_expire_time_minutes_after_accessにより制御され、分単位です。デフォルトは10分です。この時間を短縮することで、最新のHudиパーティションプロパティをDorisでよりリアルタイムに確認できますが、外部データソースへのアクセス頻度が増加します。バージョン3.0.7以降、設定項目名は
external_cache_refresh_time_minutesに変更されます。デフォルト値は変更されません。
Iceberg table Information
Icebergテーブルオブジェクトをキャッシュするために使用されます。オブジェクトはIceberg APIを通じて読み込まれ、構築されます。
このキャッシュは、各Iceberg カタログに1つあります。
-
最大キャッシュ数
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分です。この時間を短縮することで、最新のIcebergテーブルプロパティをDorisでよりリアルタイムに確認できますが、外部データソースへのアクセス頻度が増加します。バージョン3.0.7以降、設定項目名は
external_cache_refresh_time_minutesに変更されます。デフォルト値は変更されません。
Iceberg table Snapshot
Icebergテーブルのスナップショットリストをキャッシュするために使用されます。オブジェクトはIceberg APIを通じて読み込まれ、構築されます。 このキャッシュは、各Iceberg カタログに1つあります。
-
最大キャッシュ数
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分です。この時間を短縮することで、最新のIcebergテーブルプロパティをDorisでよりリアルタイムに確認できますが、外部データソースへのアクセス頻度が増加します。バージョン3.0.7以降、設定項目名は
external_cache_refresh_time_minutesに変更されます。デフォルト値は変更されません。
キャッシュリフレッシュ
上記の各キャッシュのリフレッシュと退避戦略に加えて、ユーザーは手動でまたはスケジュールによりmetadataキャッシュを直接リフレッシュすることもできます。
手動リフレッシュ
ユーザーはREFRESHコマンドを使用してmetadataを手動でリフレッシュできます。
-
REFRESH CATALOG
指定されたカタログをリフレッシュします。
REFRESH CATALOG ctl1 PROPERTIES("invalid_cache" = "true");- このコマンドは、指定されたカタログのデータベースリスト、テーブルカラム名、およびすべてのキャッシュ情報をリフレッシュします。
invalid_cacheは、パーティションやファイルリストなどのキャッシュをリフレッシュするかどうかを示します。デフォルトはtrueです。falseの場合、カタログのデータベースとテーブルリストのみがリフレッシュされ、パーティションやファイルリストなどのキャッシュはリフレッシュされません。このパラメータは、ユーザーが新しく追加または削除されたデータベースとテーブルのみを同期したい場合に適しており、falseに設定できます。
-
REFRESH DATABASE
指定されたDatabaseをリフレッシュします。
REFRESH DATABASE [ctl.]db1 PROPERTIES("invalid_cache" = "true");- このコマンドは、指定されたDatabase下のテーブルカラム名とすべてのキャッシュ情報をリフレッシュします。
invalid_cacheプロパティの意味は上記と同じです。デフォルトはtrueです。falseの場合、Databaseのテーブルリストのみがリフレッシュされ、キャッシュ情報はリフレッシュされません。このパラメータは、ユーザーが新しく追加または削除されたテーブルのみを同期したい場合に適しています。
-
REFRESH TABLE
指定されたtableをリフレッシュします。
REFRESH TABLE [ctl.][db.]tbl1;- このコマンドは、指定されたtable下のすべてのキャッシュ情報をリフレッシュします。
スケジュールリフレッシュ
ユーザーはカタログの作成時にスケジュールリフレッシュを設定できます。
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'metadata_refresh_interval_sec' = '3600'
);
上記の例では、metadata_refresh_interval_sec は Catalog が 3600 秒ごとにリフレッシュされることを意味します。これは、3600 秒ごとに以下を自動実行することと同等です:
REFRESH CATALOG ctl1 PROPERTIES("invalid_cache" = "true");
ベストプラクティス
キャッシュはメタデータアクセスのパフォーマンスを大幅に向上させ、メタデータへの頻繁なリモートアクセスを回避できます。頻繁なリモートアクセスはパフォーマンスのジッターを引き起こしたり、メタデータサービスに負荷をかけたりする可能性があります。ただし、キャッシュはデータの即時性も低下させます。例えば、キャッシュのリフレッシュ時間が 10 分の場合、10 分以内はキャッシュされたメタデータのみを読み取ることができます。そのため、状況に応じてキャッシュを適切に設定する必要があります。
デフォルト動作
このセクションでは、主にデフォルトパラメータ設定でのキャッシュ動作について、ユーザーが関心を持つ可能性のある内容を紹介します。
- 外部データソースに新しいデータベースやテーブルが追加された後、Doris で SELECT を通じてリアルタイムでクエリできます。ただし、SHOW DATABASES や SHOW TABLES では表示されない場合があります。手動でキャッシュをリフレッシュするか、最大 10 分待つ必要があります。
- 外部データソースに新しいパーティションが追加された場合、新しいパーティションデータをクエリするには、手動でキャッシュをリフレッシュするか、最大 10 分待つ必要があります。
- パーティションデータファイルが変更された場合、新しいパーティションデータをクエリするには、手動でキャッシュをリフレッシュするか、最大 10 分待つ必要があります。
Schema Cache の無効化
すべてのタイプの External Catalog で、最新の Table Schema をリアルタイムで確認したい場合は、Schema Cache を無効にできます:
-
グローバルで無効化
-- fe.conf
max_external_schema_cache_num=0 // Disable Schema cache. -
Catalog レベルで無効化
-- Catalog property
"schema.cache.ttl-second" = "0" // For a specific Catalog, disable Schema cache (supported in 2.1.11, 3.0.6)
設定後、DorisはリアルタイムでTable Schemaの最新情報を確認できます。ただし、この設定によりメタデータサービスへの負荷が増加する場合があります。
Hive Catalogメタデータキャッシュの無効化
Hive Catalogにおいて、リアルタイムで更新されたデータをクエリするためにキャッシュを無効化したい場合は、以下のパラメータを設定できます:
-
グローバルに無効化
-- fe.conf
max_external_file_cache_num=0 // Disable file list cache
max_hive_partition_table_cache_num=0 // Disable partition list cache -
Catalog レベルで無効化
-- Catalog property
"file.meta.cache.ttl-second" = "0" // For a specific Catalog, disable file list cache
"partition.cache.ttl-second" = "0" // For a specific Catalog, disable partition list cache (supported in 2.1.11, 3.0.6)
上記のパラメータを設定した後:
- 外部データソース内の新しいパーティションをリアルタイムでクエリできます。
- パーティションデータファイルの変更をリアルタイムでクエリできます。
ただし、これにより外部データソース(Hive MetastoreやHDFSなど)へのアクセス負荷が増加し、メタデータアクセスレイテンシの不安定化などの現象が発生する可能性があります。