19
19
import org .elasticsearch .cluster .metadata .IndexNameExpressionResolver ;
20
20
import org .elasticsearch .cluster .metadata .MappingMetadata ;
21
21
import org .elasticsearch .cluster .service .ClusterService ;
22
+ import org .elasticsearch .common .settings .Settings ;
22
23
import org .elasticsearch .index .IndexNotFoundException ;
24
+ import org .elasticsearch .threadpool .ThreadPool ;
23
25
import org .elasticsearch .xpack .core .ClientHelper ;
24
26
import org .elasticsearch .xpack .core .ml .MlStatsIndex ;
25
27
import org .elasticsearch .xpack .core .ml .dataframe .DataFrameAnalyticsConfig ;
26
28
import org .elasticsearch .xpack .core .ml .job .persistence .AnomalyDetectorsIndex ;
27
29
import org .elasticsearch .xpack .core .ml .job .persistence .ElasticsearchMappings ;
28
30
import org .elasticsearch .xpack .core .ml .utils .ExceptionsHelper ;
31
+ import org .elasticsearch .xpack .ml .dataframe .extractor .ExtractedFieldsDetector ;
32
+ import org .elasticsearch .xpack .ml .dataframe .extractor .ExtractedFieldsDetectorFactory ;
33
+ import org .elasticsearch .xpack .ml .dataframe .inference .InferenceRunner ;
29
34
import org .elasticsearch .xpack .ml .dataframe .persistence .DataFrameAnalyticsConfigProvider ;
30
35
import org .elasticsearch .xpack .ml .dataframe .process .AnalyticsProcessManager ;
31
36
import org .elasticsearch .xpack .ml .dataframe .steps .AnalysisStep ;
32
37
import org .elasticsearch .xpack .ml .dataframe .steps .DataFrameAnalyticsStep ;
38
+ import org .elasticsearch .xpack .ml .dataframe .steps .FinalStep ;
39
+ import org .elasticsearch .xpack .ml .dataframe .steps .InferenceStep ;
33
40
import org .elasticsearch .xpack .ml .dataframe .steps .ReindexingStep ;
34
41
import org .elasticsearch .xpack .ml .dataframe .steps .StepResponse ;
42
+ import org .elasticsearch .xpack .ml .extractor .ExtractedFields ;
43
+ import org .elasticsearch .xpack .ml .inference .loadingservice .ModelLoadingService ;
35
44
import org .elasticsearch .xpack .ml .notifications .DataFrameAnalyticsAuditor ;
45
+ import org .elasticsearch .xpack .ml .utils .persistence .ResultsPersisterService ;
36
46
37
47
import java .util .Objects ;
38
48
import java .util .concurrent .atomic .AtomicBoolean ;
@@ -43,27 +53,36 @@ public class DataFrameAnalyticsManager {
43
53
44
54
private static final Logger LOGGER = LogManager .getLogger (DataFrameAnalyticsManager .class );
45
55
56
+ private final Settings settings ;
46
57
/**
47
58
* We need a {@link NodeClient} to get the reindexing task and be able to report progress
48
59
*/
49
60
private final NodeClient client ;
61
+ private final ThreadPool threadPool ;
50
62
private final ClusterService clusterService ;
51
63
private final DataFrameAnalyticsConfigProvider configProvider ;
52
64
private final AnalyticsProcessManager processManager ;
53
65
private final DataFrameAnalyticsAuditor auditor ;
54
66
private final IndexNameExpressionResolver expressionResolver ;
67
+ private final ResultsPersisterService resultsPersisterService ;
68
+ private final ModelLoadingService modelLoadingService ;
55
69
/** Indicates whether the node is shutting down. */
56
70
private final AtomicBoolean nodeShuttingDown = new AtomicBoolean ();
57
71
58
- public DataFrameAnalyticsManager (NodeClient client , ClusterService clusterService , DataFrameAnalyticsConfigProvider configProvider ,
59
- AnalyticsProcessManager processManager , DataFrameAnalyticsAuditor auditor ,
60
- IndexNameExpressionResolver expressionResolver ) {
72
+ public DataFrameAnalyticsManager (Settings settings , NodeClient client , ThreadPool threadPool , ClusterService clusterService ,
73
+ DataFrameAnalyticsConfigProvider configProvider , AnalyticsProcessManager processManager ,
74
+ DataFrameAnalyticsAuditor auditor , IndexNameExpressionResolver expressionResolver ,
75
+ ResultsPersisterService resultsPersisterService , ModelLoadingService modelLoadingService ) {
76
+ this .settings = Objects .requireNonNull (settings );
61
77
this .client = Objects .requireNonNull (client );
78
+ this .threadPool = Objects .requireNonNull (threadPool );
62
79
this .clusterService = Objects .requireNonNull (clusterService );
63
80
this .configProvider = Objects .requireNonNull (configProvider );
64
81
this .processManager = Objects .requireNonNull (processManager );
65
82
this .auditor = Objects .requireNonNull (auditor );
66
83
this .expressionResolver = Objects .requireNonNull (expressionResolver );
84
+ this .resultsPersisterService = Objects .requireNonNull (resultsPersisterService );
85
+ this .modelLoadingService = Objects .requireNonNull (modelLoadingService );
67
86
}
68
87
69
88
public void execute (DataFrameAnalyticsTask task , ClusterState clusterState ) {
@@ -141,6 +160,12 @@ private void determineProgressAndResume(DataFrameAnalyticsTask task, DataFrameAn
141
160
case RESUMING_ANALYZING :
142
161
executeStep (task , config , new AnalysisStep (client , task , auditor , config , processManager ));
143
162
break ;
163
+ case RESUMING_INFERENCE :
164
+ buildInferenceStep (task , config , ActionListener .wrap (
165
+ inferenceStep -> executeStep (task , config , inferenceStep ),
166
+ task ::setFailed
167
+ ));
168
+ break ;
144
169
case FINISHED :
145
170
default :
146
171
task .setFailed (ExceptionsHelper .serverError ("Unexpected starting state [" + startingState + "]" ));
@@ -162,7 +187,15 @@ private void executeStep(DataFrameAnalyticsTask task, DataFrameAnalyticsConfig c
162
187
executeStep (task , config , new AnalysisStep (client , task , auditor , config , processManager ));
163
188
break ;
164
189
case ANALYSIS :
165
- // This is the last step
190
+ buildInferenceStep (task , config , ActionListener .wrap (
191
+ inferenceStep -> executeStep (task , config , inferenceStep ),
192
+ task ::setFailed
193
+ ));
194
+ break ;
195
+ case INFERENCE :
196
+ executeStep (task , config , new FinalStep (client , task , auditor , config ));
197
+ break ;
198
+ case FINAL :
166
199
LOGGER .info ("[{}] Marking task completed" , config .getId ());
167
200
task .markAsCompleted ();
168
201
break ;
@@ -199,6 +232,24 @@ private void executeJobInMiddleOfReindexing(DataFrameAnalyticsTask task, DataFra
199
232
));
200
233
}
201
234
235
+ private void buildInferenceStep (DataFrameAnalyticsTask task , DataFrameAnalyticsConfig config , ActionListener <InferenceStep > listener ) {
236
+ ParentTaskAssigningClient parentTaskClient = new ParentTaskAssigningClient (client , task .getParentTaskId ());
237
+
238
+ ActionListener <ExtractedFieldsDetector > extractedFieldsDetectorListener = ActionListener .wrap (
239
+ extractedFieldsDetector -> {
240
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ().v1 ();
241
+ InferenceRunner inferenceRunner = new InferenceRunner (settings , parentTaskClient , modelLoadingService ,
242
+ resultsPersisterService , task .getParentTaskId (), config , extractedFields , task .getStatsHolder ().getProgressTracker (),
243
+ task .getStatsHolder ().getDataCountsTracker ());
244
+ InferenceStep inferenceStep = new InferenceStep (client , task , auditor , config , threadPool , inferenceRunner );
245
+ listener .onResponse (inferenceStep );
246
+ },
247
+ listener ::onFailure
248
+ );
249
+
250
+ new ExtractedFieldsDetectorFactory (parentTaskClient ).createFromDest (config , extractedFieldsDetectorListener );
251
+ }
252
+
202
253
public boolean isNodeShuttingDown () {
203
254
return nodeShuttingDown .get ();
204
255
}
0 commit comments