Extension guide
Introduction
Use this guide when the built-in components do not match your environment and you need custom implementations.
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:
MyStatisticsProvider.java
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
Provider implementation
Create the file and add one implementation class name per line.
META-INF/services/org.apache.gravitino.maintenance.optimizer.api.common.Provider
com.example.optimizer.MyStatisticsProvider
com.example.optimizer.MyJobSubmitter
StatisticsCalculator implementation
Create file:
META-INF/services/org.apache.gravitino.maintenance.optimizer.api.updater.StatisticsCalculator
MetricsEvaluator implementation
Create file:
META-INF/services/org.apache.gravitino.maintenance.optimizer.api.monitor.MetricsEvaluator
Configure gravitino-optimizer.conf
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.