|
@@ -10,21 +10,14 @@ import org.apache.logging.log4j.Logger;
|
|
|
import org.apache.logging.log4j.message.ParameterizedMessage;
|
|
|
import org.apache.lucene.util.SetOnce;
|
|
|
import org.elasticsearch.action.ActionListener;
|
|
|
-import org.elasticsearch.action.admin.indices.refresh.RefreshAction;
|
|
|
-import org.elasticsearch.action.admin.indices.refresh.RefreshRequest;
|
|
|
import org.elasticsearch.action.search.SearchResponse;
|
|
|
-import org.elasticsearch.action.support.IndicesOptions;
|
|
|
import org.elasticsearch.client.Client;
|
|
|
-import org.elasticsearch.client.ParentTaskAssigningClient;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.common.util.concurrent.ThreadContext;
|
|
|
import org.elasticsearch.index.query.QueryBuilders;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
-import org.elasticsearch.xpack.core.ClientHelper;
|
|
|
-import org.elasticsearch.xpack.core.ml.MlStatsIndex;
|
|
|
import org.elasticsearch.xpack.core.ml.dataframe.DataFrameAnalyticsConfig;
|
|
|
-import org.elasticsearch.xpack.core.ml.dataframe.stats.common.DataCounts;
|
|
|
import org.elasticsearch.xpack.core.ml.job.messages.Messages;
|
|
|
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndex;
|
|
|
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
|
|
@@ -32,20 +25,17 @@ import org.elasticsearch.xpack.ml.MachineLearning;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.DataFrameAnalyticsTask;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.extractor.DataFrameDataExtractor;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.extractor.DataFrameDataExtractorFactory;
|
|
|
-import org.elasticsearch.xpack.ml.dataframe.inference.InferenceRunner;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.process.results.AnalyticsResult;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.stats.DataCountsTracker;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.stats.ProgressTracker;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.stats.StatsPersister;
|
|
|
import org.elasticsearch.xpack.ml.dataframe.steps.StepResponse;
|
|
|
import org.elasticsearch.xpack.ml.extractor.ExtractedFields;
|
|
|
-import org.elasticsearch.xpack.ml.inference.loadingservice.ModelLoadingService;
|
|
|
import org.elasticsearch.xpack.ml.inference.persistence.TrainedModelProvider;
|
|
|
import org.elasticsearch.xpack.ml.notifications.DataFrameAnalyticsAuditor;
|
|
|
import org.elasticsearch.xpack.ml.utils.persistence.ResultsPersisterService;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
-import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
import java.util.Optional;
|
|
@@ -69,7 +59,6 @@ public class AnalyticsProcessManager {
|
|
|
private final ConcurrentMap<Long, ProcessContext> processContextByAllocation = new ConcurrentHashMap<>();
|
|
|
private final DataFrameAnalyticsAuditor auditor;
|
|
|
private final TrainedModelProvider trainedModelProvider;
|
|
|
- private final ModelLoadingService modelLoadingService;
|
|
|
private final ResultsPersisterService resultsPersisterService;
|
|
|
private final int numAllocatedProcessors;
|
|
|
|
|
@@ -79,7 +68,6 @@ public class AnalyticsProcessManager {
|
|
|
AnalyticsProcessFactory<AnalyticsResult> analyticsProcessFactory,
|
|
|
DataFrameAnalyticsAuditor auditor,
|
|
|
TrainedModelProvider trainedModelProvider,
|
|
|
- ModelLoadingService modelLoadingService,
|
|
|
ResultsPersisterService resultsPersisterService,
|
|
|
int numAllocatedProcessors) {
|
|
|
this(
|
|
@@ -90,7 +78,6 @@ public class AnalyticsProcessManager {
|
|
|
analyticsProcessFactory,
|
|
|
auditor,
|
|
|
trainedModelProvider,
|
|
|
- modelLoadingService,
|
|
|
resultsPersisterService,
|
|
|
numAllocatedProcessors);
|
|
|
}
|
|
@@ -103,7 +90,6 @@ public class AnalyticsProcessManager {
|
|
|
AnalyticsProcessFactory<AnalyticsResult> analyticsProcessFactory,
|
|
|
DataFrameAnalyticsAuditor auditor,
|
|
|
TrainedModelProvider trainedModelProvider,
|
|
|
- ModelLoadingService modelLoadingService,
|
|
|
ResultsPersisterService resultsPersisterService,
|
|
|
int numAllocatedProcessors) {
|
|
|
this.settings = Objects.requireNonNull(settings);
|
|
@@ -113,7 +99,6 @@ public class AnalyticsProcessManager {
|
|
|
this.processFactory = Objects.requireNonNull(analyticsProcessFactory);
|
|
|
this.auditor = Objects.requireNonNull(auditor);
|
|
|
this.trainedModelProvider = Objects.requireNonNull(trainedModelProvider);
|
|
|
- this.modelLoadingService = Objects.requireNonNull(modelLoadingService);
|
|
|
this.resultsPersisterService = Objects.requireNonNull(resultsPersisterService);
|
|
|
this.numAllocatedProcessors = numAllocatedProcessors;
|
|
|
}
|
|
@@ -183,7 +168,6 @@ public class AnalyticsProcessManager {
|
|
|
LOGGER.info("[{}] Started loading data", processContext.config.getId());
|
|
|
auditor.info(processContext.config.getId(), Messages.getMessage(Messages.DATA_FRAME_ANALYTICS_AUDIT_STARTED_LOADING_DATA));
|
|
|
|
|
|
- ParentTaskAssigningClient parentTaskClient = new ParentTaskAssigningClient(client, task.getParentTaskId());
|
|
|
DataFrameAnalyticsConfig config = processContext.config;
|
|
|
DataFrameDataExtractor dataExtractor = processContext.dataExtractor.get();
|
|
|
AnalyticsProcess<AnalyticsResult> process = processContext.process.get();
|
|
@@ -203,14 +187,6 @@ public class AnalyticsProcessManager {
|
|
|
resultProcessor.awaitForCompletion();
|
|
|
processContext.setFailureReason(resultProcessor.getFailure());
|
|
|
LOGGER.info("[{}] Result processor has completed", config.getId());
|
|
|
-
|
|
|
- runInference(parentTaskClient, task, processContext, dataExtractor.getExtractedFields());
|
|
|
-
|
|
|
- processContext.statsPersister.persistWithRetry(task.getStatsHolder().getDataCountsTracker().report(config.getId()),
|
|
|
- DataCounts::documentId);
|
|
|
-
|
|
|
- refreshDest(parentTaskClient, config);
|
|
|
- refreshIndices(parentTaskClient, config.getId());
|
|
|
} catch (Exception e) {
|
|
|
if (task.isStopping()) {
|
|
|
// Errors during task stopping are expected but we still want to log them just in case.
|
|
@@ -338,43 +314,6 @@ public class AnalyticsProcessManager {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private void runInference(ParentTaskAssigningClient parentTaskClient, DataFrameAnalyticsTask task, ProcessContext processContext,
|
|
|
- ExtractedFields extractedFields) {
|
|
|
- if (task.isStopping() || processContext.failureReason.get() != null) {
|
|
|
- // If the task is stopping or there has been an error thus far let's not run inference at all
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (processContext.config.getAnalysis().supportsInference()) {
|
|
|
- refreshDest(parentTaskClient, processContext.config);
|
|
|
- InferenceRunner inferenceRunner = new InferenceRunner(settings, parentTaskClient, modelLoadingService, resultsPersisterService,
|
|
|
- task.getParentTaskId(), processContext.config, extractedFields, task.getStatsHolder().getProgressTracker(),
|
|
|
- task.getStatsHolder().getDataCountsTracker());
|
|
|
- processContext.setInferenceRunner(inferenceRunner);
|
|
|
- inferenceRunner.run(processContext.resultProcessor.get().getLatestModelId());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void refreshDest(ParentTaskAssigningClient parentTaskClient, DataFrameAnalyticsConfig config) {
|
|
|
- ClientHelper.executeWithHeaders(config.getHeaders(), ClientHelper.ML_ORIGIN, parentTaskClient,
|
|
|
- () -> parentTaskClient.execute(RefreshAction.INSTANCE, new RefreshRequest(config.getDest().getIndex())).actionGet());
|
|
|
- }
|
|
|
-
|
|
|
- private void refreshIndices(ParentTaskAssigningClient parentTaskClient, String jobId) {
|
|
|
- RefreshRequest refreshRequest = new RefreshRequest(
|
|
|
- AnomalyDetectorsIndex.jobStateIndexPattern(),
|
|
|
- MlStatsIndex.indexPattern()
|
|
|
- );
|
|
|
- refreshRequest.indicesOptions(IndicesOptions.lenientExpandOpen());
|
|
|
-
|
|
|
- LOGGER.debug(() -> new ParameterizedMessage("[{}] Refreshing indices {}",
|
|
|
- jobId, Arrays.toString(refreshRequest.indices())));
|
|
|
-
|
|
|
- try (ThreadContext.StoredContext ignore = parentTaskClient.threadPool().getThreadContext().stashWithOrigin(ML_ORIGIN)) {
|
|
|
- parentTaskClient.admin().indices().refresh(refreshRequest).actionGet();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private void closeProcess(DataFrameAnalyticsTask task) {
|
|
|
String configId = task.getParams().getId();
|
|
|
LOGGER.info("[{}] Closing process", configId);
|
|
@@ -415,13 +354,10 @@ public class AnalyticsProcessManager {
|
|
|
private final SetOnce<AnalyticsProcess<AnalyticsResult>> process = new SetOnce<>();
|
|
|
private final SetOnce<DataFrameDataExtractor> dataExtractor = new SetOnce<>();
|
|
|
private final SetOnce<AnalyticsResultProcessor> resultProcessor = new SetOnce<>();
|
|
|
- private final SetOnce<InferenceRunner> inferenceRunner = new SetOnce<>();
|
|
|
private final SetOnce<String> failureReason = new SetOnce<>();
|
|
|
- private final StatsPersister statsPersister;
|
|
|
|
|
|
ProcessContext(DataFrameAnalyticsConfig config) {
|
|
|
this.config = Objects.requireNonNull(config);
|
|
|
- this.statsPersister = new StatsPersister(config.getId(), resultsPersisterService, auditor);
|
|
|
}
|
|
|
|
|
|
String getFailureReason() {
|
|
@@ -436,10 +372,6 @@ public class AnalyticsProcessManager {
|
|
|
this.failureReason.trySet(failureReason);
|
|
|
}
|
|
|
|
|
|
- void setInferenceRunner(InferenceRunner inferenceRunner) {
|
|
|
- this.inferenceRunner.set(inferenceRunner);
|
|
|
- }
|
|
|
-
|
|
|
synchronized void stop() {
|
|
|
LOGGER.debug("[{}] Stopping process", config.getId());
|
|
|
if (dataExtractor.get() != null) {
|
|
@@ -448,9 +380,6 @@ public class AnalyticsProcessManager {
|
|
|
if (resultProcessor.get() != null) {
|
|
|
resultProcessor.get().cancel();
|
|
|
}
|
|
|
- if (inferenceRunner.get() != null) {
|
|
|
- inferenceRunner.get().cancel();
|
|
|
- }
|
|
|
if (process.get() != null) {
|
|
|
try {
|
|
|
process.get().kill(true);
|
|
@@ -507,6 +436,7 @@ public class AnalyticsProcessManager {
|
|
|
DataFrameRowsJoiner dataFrameRowsJoiner =
|
|
|
new DataFrameRowsJoiner(config.getId(), settings, task.getParentTaskId(),
|
|
|
dataExtractorFactory.newExtractor(true), resultsPersisterService);
|
|
|
+ StatsPersister statsPersister = new StatsPersister(config.getId(), resultsPersisterService, auditor);
|
|
|
return new AnalyticsResultProcessor(
|
|
|
config, dataFrameRowsJoiner, task.getStatsHolder(), trainedModelProvider, auditor, statsPersister,
|
|
|
dataExtractor.get().getExtractedFields());
|