@@ -88,31 +88,22 @@ public JobVertexScaler(AutoScalerEventHandler<KEY, Context> autoScalerEventHandl
8888 this .autoScalerEventHandler = autoScalerEventHandler ;
8989 }
9090
91- /** The parallelism change type of {@link ParallelismChange}. */
92- public enum ParallelismChangeType {
93- NO_CHANGE ,
94- REQUIRED_CHANGE ,
95- OPTIONAL_CHANGE ;
96- }
97-
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- */
91+ /** The rescaling will be triggered if any vertex's {@link ParallelismResult} is changed. */
10292 @ Getter
103- public static class ParallelismChange {
93+ public static class ParallelismResult {
10494
105- private static final ParallelismChange NO_CHANGE =
106- new ParallelismChange (ParallelismChangeType .NO_CHANGE , -1 );
95+ private static final ParallelismResult NO_CHANGE = new ParallelismResult (-1 );
10796
108- private final ParallelismChangeType changeType ;
10997 private final int newParallelism ;
11098
111- private ParallelismChange (ParallelismChangeType changeType , int newParallelism ) {
112- this .changeType = changeType ;
99+ private ParallelismResult (int newParallelism ) {
113100 this .newParallelism = newParallelism ;
114101 }
115102
103+ public boolean isNoChange () {
104+ return this == NO_CHANGE ;
105+ }
106+
116107 @ Override
117108 public boolean equals (Object o ) {
118109 if (this == o ) {
@@ -121,39 +112,33 @@ public boolean equals(Object o) {
121112 if (o == null || getClass () != o .getClass ()) {
122113 return false ;
123114 }
124- ParallelismChange that = (ParallelismChange ) o ;
125- return changeType == that . changeType && newParallelism == that .newParallelism ;
115+ ParallelismResult that = (ParallelismResult ) o ;
116+ return newParallelism == that .newParallelism ;
126117 }
127118
128119 @ Override
129120 public int hashCode () {
130- return Objects .hash (changeType , newParallelism );
121+ return Objects .hash (newParallelism );
131122 }
132123
133124 @ Override
134125 public String toString () {
135- return "ParallelismChange{"
136- + "changeType="
137- + changeType
138- + ", newParallelism="
139- + newParallelism
140- + '}' ;
141- }
142-
143- public static ParallelismChange required (int newParallelism ) {
144- return new ParallelismChange (ParallelismChangeType .REQUIRED_CHANGE , newParallelism );
126+ return isNoChange ()
127+ ? "NoParallelismChange"
128+ : "ParallelismChange{newParallelism=" + newParallelism + '}' ;
145129 }
146130
147- public static ParallelismChange optional (int newParallelism ) {
148- return new ParallelismChange (ParallelismChangeType .OPTIONAL_CHANGE , newParallelism );
131+ public static ParallelismResult build (int newParallelism ) {
132+ checkArgument (newParallelism > 0 , "The parallelism should be greater than 0." );
133+ return new ParallelismResult (newParallelism );
149134 }
150135
151- public static ParallelismChange noChange () {
136+ public static ParallelismResult noChange () {
152137 return NO_CHANGE ;
153138 }
154139 }
155140
156- public ParallelismChange computeScaleTargetParallelism (
141+ public ParallelismResult computeScaleTargetParallelism (
157142 Context context ,
158143 JobVertexID vertex ,
159144 Collection <ShipStrategy > inputShipStrategies ,
@@ -168,7 +153,7 @@ public ParallelismChange computeScaleTargetParallelism(
168153 LOG .warn (
169154 "True processing rate is not available for {}, cannot compute new parallelism" ,
170155 vertex );
171- return ParallelismChange .noChange ();
156+ return ParallelismResult .noChange ();
172157 }
173158
174159 double targetCapacity =
@@ -178,7 +163,7 @@ public ParallelismChange computeScaleTargetParallelism(
178163 LOG .warn (
179164 "Target data rate is not available for {}, cannot compute new parallelism" ,
180165 vertex );
181- return ParallelismChange .noChange ();
166+ return ParallelismResult .noChange ();
182167 }
183168
184169 LOG .debug ("Target processing capacity for {} is {}" , vertex , targetCapacity );
@@ -222,7 +207,7 @@ public ParallelismChange computeScaleTargetParallelism(
222207 // Clear delayed scale down request if the new parallelism is equal to
223208 // currentParallelism.
224209 delayedScaleDown .clearVertex (vertex );
225- return ParallelismChange .noChange ();
210+ return ParallelismResult .noChange ();
226211 }
227212
228213 // We record our expectations for this scaling operation
@@ -241,7 +226,7 @@ public ParallelismChange computeScaleTargetParallelism(
241226 delayedScaleDown );
242227 }
243228
244- private ParallelismChange detectBlockScaling (
229+ private ParallelismResult detectBlockScaling (
245230 Context context ,
246231 JobVertexID vertex ,
247232 Configuration conf ,
@@ -263,7 +248,7 @@ private ParallelismChange detectBlockScaling(
263248
264249 // If we don't have past scaling actions for this vertex, don't block scale up.
265250 if (history .isEmpty ()) {
266- return ParallelismChange . required (newParallelism );
251+ return ParallelismResult . build (newParallelism );
267252 }
268253
269254 var lastSummary = history .get (history .lastKey ());
@@ -272,38 +257,40 @@ private ParallelismChange detectBlockScaling(
272257 && detectIneffectiveScaleUp (
273258 context , vertex , conf , evaluatedMetrics , lastSummary )) {
274259 // Block scale up when last rescale is ineffective.
275- return ParallelismChange .noChange ();
260+ return ParallelismResult .noChange ();
276261 }
277262
278- return ParallelismChange . required (newParallelism );
263+ return ParallelismResult . build (newParallelism );
279264 } else {
280265 return applyScaleDownInterval (delayedScaleDown , vertex , conf , newParallelism );
281266 }
282267 }
283268
284- private ParallelismChange applyScaleDownInterval (
269+ private ParallelismResult applyScaleDownInterval (
285270 DelayedScaleDown delayedScaleDown ,
286271 JobVertexID vertex ,
287272 Configuration conf ,
288273 int newParallelism ) {
289274 var scaleDownInterval = conf .get (SCALE_DOWN_INTERVAL );
290275 if (scaleDownInterval .toMillis () <= 0 ) {
291276 // The scale down interval is disable, so don't block scaling.
292- return ParallelismChange . required (newParallelism );
277+ return ParallelismResult . build (newParallelism );
293278 }
294279
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- }
280+ var now = clock .instant ();
281+ var delayedScaleDownInfo = delayedScaleDown .triggerScaleDown (vertex , now , newParallelism );
301282
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 );
283+ if (now .isBefore (delayedScaleDownInfo .getFirstTriggerTime ().plus (scaleDownInterval ))) {
284+ if (now .equals (delayedScaleDownInfo .getFirstTriggerTime ())) {
285+ LOG .info ("The scale down of {} is delayed by {}." , vertex , scaleDownInterval );
286+ } else {
287+ LOG .debug (
288+ "Try to skip immediate scale down within scale-down interval for {}" ,
289+ vertex );
290+ }
291+ return ParallelismResult .noChange ();
305292 } else {
306- return ParallelismChange . required ( newParallelism );
293+ return ParallelismResult . build ( delayedScaleDownInfo . getMaxRecommendedParallelism () );
307294 }
308295 }
309296
0 commit comments