Extension guide
The table maintenance tool loads its components through extension points, so a component that does not fit your environment can be replaced with your own implementation.
Extension model
The service supports three loading patterns:
ProviderSPI (name()+initialize()): loaded byServiceLoaderand selected by config value.- Class-name mapping for strategy handlers and job adapters.
- Typed SPI for
StatisticsCalculatorandMetricsEvaluator.
Extension points and config keys
| Area | Interface / type | Config key | Loading mode |
|---|---|---|---|
| Recommender statistics | StatisticsProvider | gravitino.optimizer.recommender.statisticsProvider | Provider SPI by name() |
| Recommender strategy source | StrategyProvider | gravitino.optimizer.recommender.strategyProvider | Provider SPI by name() |
| Recommender table metadata | TableMetadataProvider | gravitino.optimizer.recommender.tableMetaProvider | Provider SPI by name() |
| Recommender job submission | JobSubmitter | gravitino.optimizer.recommender.jobSubmitter | Provider SPI by name() |
| Strategy evaluation logic | StrategyHandler | gravitino.optimizer.strategyHandler.{strategy_type}.className | Reflection by class name |
| Job template adaptation | GravitinoJobAdapter | gravitino.optimizer.jobAdapter.{job_template}.className | Reflection by class name |
| Update statistics sink | StatisticsUpdater | gravitino.optimizer.updater.statisticsUpdater | Provider SPI by name() |
| Update metrics sink | MetricsUpdater | gravitino.optimizer.updater.metricsUpdater | Provider SPI by name() |
| Monitor metrics source | MetricsProvider | gravitino.optimizer.monitor.metricsProvider | Provider SPI by name() |
| Monitor table-job relation | TableJobRelationProvider | gravitino.optimizer.monitor.tableJobRelationProvider | Provider SPI by name() |
| Monitor evaluator | MetricsEvaluator | gravitino.optimizer.monitor.metricsEvaluator | Typed SPI (ServiceLoader<MetricsEvaluator>) |
| Monitor callbacks | MonitorCallback | gravitino.optimizer.monitor.callbacks | Provider SPI by name() (comma-separated) |
| CLI calculator | StatisticsCalculator | CLI --calculator-name | Typed SPI (ServiceLoader<StatisticsCalculator>) |
Implement a custom provider
Most extension points use Provider:
public class MyStatisticsProvider implements StatisticsProvider {
@Override
public String name() {
return "my-statistics-provider";
}
@Override
public void initialize(OptimizerEnv optimizerEnv) {
// Initialize clients and resources from the configuration file.
}
@Override
public void close() throws Exception {}
}
Requirements:
- Keep a stable
name()value; config resolves by this name (case-insensitive). - Provide a public no-arg constructor.
- Implement
initialize(OptimizerEnv)andclose()lifecycle correctly.
Register with ServiceLoader
Providers
List each class that implements Provider in this file, one class name per line.
com.example.optimizer.MyStatisticsProvider
com.example.optimizer.MyJobSubmitter
Statistics calculators
List each class that implements StatisticsCalculator in this file:
META-INF/services/org.apache.gravitino.maintenance.optimizer.api.updater.StatisticsCalculator
Metrics evaluators
List each class that implements MetricsEvaluator in this file:
META-INF/services/org.apache.gravitino.maintenance.optimizer.api.monitor.MetricsEvaluator
Configure the optimizer
The optimizer reads gravitino-optimizer.conf.
gravitino.optimizer.recommender.statisticsProvider = my-statistics-provider
gravitino.optimizer.recommender.jobSubmitter = my-job-submitter
gravitino.optimizer.strategyHandler.my-strategy.className = com.example.optimizer.MyStrategyHandler
gravitino.optimizer.jobAdapter.my-job-template.className = com.example.optimizer.MyJobAdapter
gravitino.optimizer.monitor.metricsEvaluator = my-metrics-evaluator
Notes:
strategyHandler.{strategy_type}.classNamemust matchstrategy.typein policy content.jobAdapter.{job_template}.classNamemust match the target job template name.jobSubmitterConfig.*entries are passed to job submitters as shared runtime options.
Package and deploy
- Build a JAR containing your classes and
META-INF/servicesfiles. - Put the JAR on the runtime classpath, for example
${GRAVITINO_HOME}/optimizer/libs/. - Restart the process before testing.
If you also extend Gravitino server job execution, see Automation.
Validation checklist
--helpshows no load-time SPI errors.- Commands using your extension run without
No ... found for provider nameerrors. - Strategy flow can resolve both handler and job adapter mappings.
- Dry-run (
submit-strategy-jobs --dry-run) prints expected recommendations.