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