This is an automated email from the ASF dual-hosted git repository.
jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new fc6e11ea99 [#10163] improvement(optimizer): improve recommender log
messaging (#10121)
fc6e11ea99 is described below
commit fc6e11ea993f9d5876cda1156ccf777d44031ca5
Author: Roman Horilyi <[email protected]>
AuthorDate: Wed Mar 4 09:58:56 2026 +0200
[#10163] improvement(optimizer): improve recommender log messaging (#10121)
### What changes were proposed in this pull request?
Improve log messaging for optimizer
[Recommender#recommendForStrategyType](https://github.com/apache/gravitino/blob/969f7be707334b0a11a64846fbf014ca062d3a4a/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/Recommender.java#L134C15-L134C39)
execution.
### Why are the changes needed?
Currently there're several issues when `recommendForStrategyType` method
is run:
1. it's not clear why there's no output for candidate tables that
doesn't match triggering criteria
2.
[CompactionJobContext](https://github.com/apache/gravitino/blob/main/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/handler/compaction/CompactionJobContext.java)
produces verbose output for cases w/ many partitions and large tables.
Here are the sample log messages when running `recommendForStrategyType`
w/ multiple test identifiers for `compaction` strategy type:
#### Without this patch:
```
2026-02-19 22:40:12.753 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:183)]
- Recommend strategy compactionSmallPartitionFiles for identifiers
[generic.ad.ads_hourly_onsite_insertion_data,
generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
generic.ad.ads_hourly_engagement_sampled_table_iceberg_insertion_id,
generic.ad.ads_hourly_l1_sampled_data_table,
generic.ad.ads_hourly_video_engagement_sampl [...]
2026-02-19 22:40:14.505 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:201)]
- Recommend strategy compactionSmallPartitionFiles for identifier
generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid score: 45548
2026-02-19 22:40:15.859 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.job.NoopJobSubmitter.submitJob(NoopJobSubmitter.java:43)]
- NoopJobSubmitter submitJob: template=compaction,
identifier=generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
jobExecuteContext=CompactionJobContext(name=generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
jobOptions={}, jobTemplateName=compaction,
columns=[org.apache.gravitino.client.GenericColumn@f434c [...]
2026-02-19 22:40:15.875 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForStrategyType(Recommender.java:158)]
- Submit job for strategy compactionSmallPartitionFiles with context
CompactionJobContext(name=generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
jobOptions={}, jobTemplateName=compaction,
columns=[org.apache.gravitino.client.GenericColumn@f434c029,
org.apache.gravitino.client.GenericColumn@510cb662, org.apache.graviti [...]
```
#### With this patch:
```
2026-02-19 22:26:16.679 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:183)]
- Recommend strategy compactionSmallPartitionFiles for identifiers
[generic.ad.ads_hourly_onsite_insertion_data,
generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
generic.ad.ads_hourly_engagement_sampled_table_iceberg_insertion_id,
generic.ad.ads_hourly_l1_sampled_data_table,
generic.ad.ads_hourly_video_engagement_sampl [...]
2026-02-19 22:26:18.154 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:191)]
- Skip strategy compactionSmallPartitionFiles for identifier
generic.ad.ads_hourly_onsite_insertion_data because strategy handler trigger
condition is not met
2026-02-19 22:26:18.444 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:205)]
- Recommend strategy compactionSmallPartitionFiles for identifier
generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid score: 45548
2026-02-19 22:26:19.010 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:191)]
- Skip strategy compactionSmallPartitionFiles for identifier
generic.ad.ads_hourly_engagement_sampled_table_iceberg_insertion_id because
strategy handler trigger condition is not met
2026-02-19 22:26:19.181 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:191)]
- Skip strategy compactionSmallPartitionFiles for identifier
generic.ad.ads_hourly_l1_sampled_data_table because strategy handler trigger
condition is not met
2026-02-19 22:26:19.736 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForOneStrategy(Recommender.java:191)]
- Skip strategy compactionSmallPartitionFiles for identifier
generic.ad.ads_hourly_video_engagement_sampled_table_iceberg because strategy
handler trigger condition is not met
2026-02-19 22:26:19.736 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.job.NoopJobSubmitter.submitJob(NoopJobSubmitter.java:43)]
- NoopJobSubmitter submitJob: template=compaction,
identifier=generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
jobExecuteContext=CompactionJobContext{name=generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
jobTemplateName='compaction', jobOptions={}, columnCount=5041,
partitioningCount=4, partitionCount=100}
2026-02-19 22:26:19.743 INFO [main]
[org.apache.gravitino.maintenance.optimizer.recommender.Recommender.recommendForStrategyType(Recommender.java:158)]
- Submit job for strategy compactionSmallPartitionFiles with context
CompactionJobContext{name=generic.ad.ads_daily_conversion_sampled_yellow_box_iceberg_userid,
jobTemplateName='compaction', jobOptions={}, columnCount=5041,
partitioningCount=4, partitionCount=100}
```
Fix: #10163
### Does this PR introduce _any_ user-facing change?
1. Adds extra INFO logs in `gravitino-optimizer` log file for not
matching candidates.
2. Removes redundant fields from `CompactionJobContext#toString` method
to improve readability.
### How was this patch tested?
- [x] Manual verification w/ `./gravitino-optimizer.sh -type
recommend_strategy_type` CLI command
Co-authored-by: Roman Horilyi <[email protected]>
---
.../optimizer/recommender/Recommender.java | 10 ++++++++++
.../handler/compaction/CompactionJobContext.java | 23 ++++++++++++++++++++--
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git
a/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/Recommender.java
b/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/Recommender.java
index c6c66ffec6..8da6a52cf3 100644
---
a/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/Recommender.java
+++
b/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/Recommender.java
@@ -148,6 +148,12 @@ public class Recommender implements AutoCloseable {
String strategyName = entry.getKey();
List<StrategyEvaluation> evaluations =
recommendForOneStrategy(entry.getValue(), strategyName);
+
+ if (evaluations.isEmpty()) {
+ LOG.info("No evaluations for strategy {}", strategyName);
+ continue;
+ }
+
for (StrategyEvaluation evaluation : evaluations) {
results.add(toRecommendationResult(strategyName, evaluation, ""));
}
@@ -260,6 +266,10 @@ public class Recommender implements AutoCloseable {
for (NameIdentifier identifier : identifiers) {
StrategyHandler strategyHandler = loadStrategyHandler(strategy,
identifier);
if (!strategyHandler.shouldTrigger()) {
+ LOG.info(
+ "Skip strategy {} for identifier {} because strategy handler
trigger condition is not met",
+ strategyName,
+ identifier);
continue;
}
StrategyEvaluation evaluation = strategyHandler.evaluate();
diff --git
a/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/handler/compaction/CompactionJobContext.java
b/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/handler/compaction/CompactionJobContext.java
index f53000c455..4e36c4f1a3 100644
---
a/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/handler/compaction/CompactionJobContext.java
+++
b/maintenance/optimizer/src/main/java/org/apache/gravitino/maintenance/optimizer/recommender/handler/compaction/CompactionJobContext.java
@@ -23,7 +23,6 @@ import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
-import lombok.ToString;
import org.apache.gravitino.NameIdentifier;
import org.apache.gravitino.maintenance.optimizer.api.common.PartitionPath;
import
org.apache.gravitino.maintenance.optimizer.api.recommender.JobExecutionContext;
@@ -31,7 +30,6 @@ import org.apache.gravitino.rel.Column;
import org.apache.gravitino.rel.expressions.transforms.Transform;
@RequiredArgsConstructor
-@ToString
public class CompactionJobContext implements JobExecutionContext {
private final NameIdentifier name;
private final Map<String, String> jobOptions;
@@ -54,4 +52,25 @@ public class CompactionJobContext implements
JobExecutionContext {
public String jobTemplateName() {
return jobTemplateName;
}
+
+ // `columns`, `partitioning` & `partitions` fields are not logged to make
toString() output more
+ // readable (especially for big tables). Only their length is logged instead.
+ @Override
+ public String toString() {
+ return "CompactionJobContext{"
+ + "name="
+ + name
+ + ", jobTemplateName='"
+ + jobTemplateName
+ + '\''
+ + ", jobOptions="
+ + jobOptions
+ + ", columnCount="
+ + (columns != null ? columns.length : 0)
+ + ", partitioningCount="
+ + (partitioning != null ? partitioning.length : 0)
+ + ", partitionCount="
+ + (partitions != null ? partitions.size() : 0)
+ + '}';
+ }
}