@@ -88,31 +88,29 @@ public JobVertexScaler(AutoScalerEventHandler<KEY, Context> autoScalerEventHandl
8888 this .autoScalerEventHandler = autoScalerEventHandler ;
8989 }
9090
91- /** The parallelism change type of {@link ParallelismChange }. */
91+ /** The parallelism change type of {@link ParallelismResult }. */
9292 public enum ParallelismChangeType {
9393 NO_CHANGE ,
9494 REQUIRED_CHANGE ,
9595 OPTIONAL_CHANGE ;
9696 }
9797
98- /**
99- * The rescaling will be triggered if any vertex's ParallelismChange is required. This means
100- * that if all vertices' ParallelismChange is optional, rescaling will be ignored.
101- */
98+ /** The rescaling will be triggered if any vertex's {@link ParallelismResult} is changed. */
10299 @ Getter
103- public static class ParallelismChange {
100+ public static class ParallelismResult {
104101
105- private static final ParallelismChange NO_CHANGE =
106- new ParallelismChange (ParallelismChangeType .NO_CHANGE , -1 );
102+ private static final ParallelismResult NO_CHANGE = new ParallelismResult (-1 );
107103
108- private final ParallelismChangeType changeType ;
109104 private final int newParallelism ;
110105
111- private ParallelismChange (ParallelismChangeType changeType , int newParallelism ) {
112- this .changeType = changeType ;
106+ private ParallelismResult (int newParallelism ) {
113107 this .newParallelism = newParallelism ;
114108 }
115109
110+ public boolean isNoChange () {
111+ return this == NO_CHANGE ;
112+ }
113+
116114 @ Override
117115 public boolean equals (Object o ) {
118116 if (this == o ) {
@@ -121,39 +119,33 @@ public boolean equals(Object o) {
121119 if (o == null || getClass () != o .getClass ()) {
122120 return false ;
123121 }
124- ParallelismChange that = (ParallelismChange ) o ;
125- return changeType == that . changeType && newParallelism == that .newParallelism ;
122+ ParallelismResult that = (ParallelismResult ) o ;
123+ return newParallelism == that .newParallelism ;
126124 }
127125
128126 @ Override
129127 public int hashCode () {
130- return Objects .hash (changeType , newParallelism );
128+ return Objects .hash (newParallelism );
131129 }
132130
133131 @ Override
134132 public String toString () {
135- return "ParallelismChange{"
136- + "changeType="
137- + changeType
138- + ", newParallelism="
139- + newParallelism
140- + '}' ;
133+ return isNoChange ()
134+ ? "NoParallelismChange"
135+ : "ParallelismChange{newParallelism=" + newParallelism + '}' ;
141136 }
142137
143- public static ParallelismChange required (int newParallelism ) {
144- return new ParallelismChange (ParallelismChangeType .REQUIRED_CHANGE , newParallelism );
138+ public static ParallelismResult build (int newParallelism ) {
139+ checkArgument (newParallelism > 0 , "The parallelism should be greater than 0." );
140+ return new ParallelismResult (newParallelism );
145141 }
146142
147- public static ParallelismChange optional (int newParallelism ) {
148- return new ParallelismChange (ParallelismChangeType .OPTIONAL_CHANGE , newParallelism );
149- }
150-
151- public static ParallelismChange noChange () {
143+ public static ParallelismResult noChange () {
152144 return NO_CHANGE ;
153145 }
154146 }
155147
156- public ParallelismChange computeScaleTargetParallelism (
148+ public ParallelismResult computeScaleTargetParallelism (
157149 Context context ,
158150 JobVertexID vertex ,
159151 Collection <ShipStrategy > inputShipStrategies ,
@@ -168,7 +160,7 @@ public ParallelismChange computeScaleTargetParallelism(
168160 LOG .warn (
169161 "True processing rate is not available for {}, cannot compute new parallelism" ,
170162 vertex );
171- return ParallelismChange .noChange ();
163+ return ParallelismResult .noChange ();
172164 }
173165
174166 double targetCapacity =
@@ -178,7 +170,7 @@ public ParallelismChange computeScaleTargetParallelism(
178170 LOG .warn (
179171 "Target data rate is not available for {}, cannot compute new parallelism" ,
180172 vertex );
181- return ParallelismChange .noChange ();
173+ return ParallelismResult .noChange ();
182174 }
183175
184176 LOG .debug ("Target processing capacity for {} is {}" , vertex , targetCapacity );
@@ -222,7 +214,7 @@ public ParallelismChange computeScaleTargetParallelism(
222214 // Clear delayed scale down request if the new parallelism is equal to
223215 // currentParallelism.
224216 delayedScaleDown .clearVertex (vertex );
225- return ParallelismChange .noChange ();
217+ return ParallelismResult .noChange ();
226218 }
227219
228220 // We record our expectations for this scaling operation
@@ -241,7 +233,7 @@ public ParallelismChange computeScaleTargetParallelism(
241233 delayedScaleDown );
242234 }
243235
244- private ParallelismChange detectBlockScaling (
236+ private ParallelismResult detectBlockScaling (
245237 Context context ,
246238 JobVertexID vertex ,
247239 Configuration conf ,
@@ -263,7 +255,7 @@ private ParallelismChange detectBlockScaling(
263255
264256 // If we don't have past scaling actions for this vertex, don't block scale up.
265257 if (history .isEmpty ()) {
266- return ParallelismChange . required (newParallelism );
258+ return ParallelismResult . build (newParallelism );
267259 }
268260
269261 var lastSummary = history .get (history .lastKey ());
@@ -272,38 +264,40 @@ private ParallelismChange detectBlockScaling(
272264 && detectIneffectiveScaleUp (
273265 context , vertex , conf , evaluatedMetrics , lastSummary )) {
274266 // Block scale up when last rescale is ineffective.
275- return ParallelismChange .noChange ();
267+ return ParallelismResult .noChange ();
276268 }
277269
278- return ParallelismChange . required (newParallelism );
270+ return ParallelismResult . build (newParallelism );
279271 } else {
280272 return applyScaleDownInterval (delayedScaleDown , vertex , conf , newParallelism );
281273 }
282274 }
283275
284- private ParallelismChange applyScaleDownInterval (
276+ private ParallelismResult applyScaleDownInterval (
285277 DelayedScaleDown delayedScaleDown ,
286278 JobVertexID vertex ,
287279 Configuration conf ,
288280 int newParallelism ) {
289281 var scaleDownInterval = conf .get (SCALE_DOWN_INTERVAL );
290282 if (scaleDownInterval .toMillis () <= 0 ) {
291283 // The scale down interval is disable, so don't block scaling.
292- return ParallelismChange . required (newParallelism );
284+ return ParallelismResult . build (newParallelism );
293285 }
294286
295- var firstTriggerTime = delayedScaleDown .getFirstTriggerTimeForVertex (vertex );
296- if (firstTriggerTime .isEmpty ()) {
297- LOG .info ("The scale down of {} is delayed by {}." , vertex , scaleDownInterval );
298- delayedScaleDown .updateTriggerTime (vertex , clock .instant ());
299- return ParallelismChange .optional (newParallelism );
300- }
287+ var now = clock .instant ();
288+ var delayedScaleDownInfo = delayedScaleDown .triggerScaleDown (vertex , now , newParallelism );
301289
302- if (clock .instant ().isBefore (firstTriggerTime .get ().plus (scaleDownInterval ))) {
303- LOG .debug ("Try to skip immediate scale down within scale-down interval for {}" , vertex );
304- return ParallelismChange .optional (newParallelism );
290+ if (now .isBefore (delayedScaleDownInfo .getFirstTriggerTime ().plus (scaleDownInterval ))) {
291+ if (now .equals (delayedScaleDownInfo .getFirstTriggerTime ())) {
292+ LOG .info ("The scale down of {} is delayed by {}." , vertex , scaleDownInterval );
293+ } else {
294+ LOG .debug (
295+ "Try to skip immediate scale down within scale-down interval for {}" ,
296+ vertex );
297+ }
298+ return ParallelismResult .noChange ();
305299 } else {
306- return ParallelismChange . required ( newParallelism );
300+ return ParallelismResult . build ( delayedScaleDownInfo . getMaxRecommendedParallelism () );
307301 }
308302 }
309303
0 commit comments