/* * Copyright 2014 LinkedIn Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package azkaban.executor; import java.io.IOException; import java.lang.Thread.State; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import azkaban.project.Project; import azkaban.utils.FileIOUtils.JobMetaData; import azkaban.utils.FileIOUtils.LogData; import azkaban.utils.Pair; public interface ExecutorManagerAdapter { public static final String LOCAL_MODE = "local"; public static final String REMOTE_MODE = "remote"; public static final String REMOTE_EXECUTOR_MANAGER_HOST = "remote.executor.manager.host"; public static final String REMOTE_EXECUTOR_MANAGER_PORT = "remote.executor.manager.port"; public static final String REMOTE_EXECUTOR_MANAGER_URL = "/executormanager"; public static final String ACTION_GET_FLOW_LOG = "getFlowLog"; public static final String ACTION_GET_JOB_LOG = "getJobLog"; public static final String ACTION_CANCEL_FLOW = "cancelFlow"; public static final String ACTION_SUBMIT_FLOW = "submitFlow"; public static final String ACTION_RESUME_FLOW = "resumeFlow"; public static final String ACTION_PAUSE_FLOW = "pauseFlow"; public static final String ACTION_MODIFY_EXECUTION = "modifyExecution"; public static final String ACTION_UPDATE = "update"; public static final String ACTION_GET_JMX = "getJMX"; public static final String COMMAND_MODIFY_PAUSE_JOBS = "modifyPauseJobs"; public static final String COMMAND_MODIFY_RESUME_JOBS = "modifyResumeJobs"; public static final String COMMAND_MODIFY_RETRY_FAILURES = "modifyRetryFailures"; public static final String COMMAND_MODIFY_RETRY_JOBS = "modifyRetryJobs"; public static final String COMMAND_MODIFY_DISABLE_JOBS = "modifyDisableJobs"; public static final String COMMAND_MODIFY_ENABLE_JOBS = "modifyEnableJobs"; public static final String COMMAND_MODIFY_CANCEL_JOBS = "modifyCancelJobs"; public static final String INFO_JMX_TYPE = "jmxType"; public static final String INFO_JMX_DATA = "jmxData"; public static final String INFO_ACTION = "action"; public static final String INFO_TYPE = "type"; public static final String INFO_EXEC_ID = "execId"; public static final String INFO_EXEC_FLOW_JSON = "execFlowJson"; public static final String INFO_PROJECT_ID = "projectId"; public static final String INFO_FLOW_NAME = "flowName"; public static final String INFO_JOB_NAME = "jobName"; public static final String INFO_OFFSET = "offset"; public static final String INFO_LENGTH = "length"; public static final String INFO_ATTEMPT = "attempt"; public static final String INFO_MODIFY_JOB_IDS = "modifyJobIds"; public static final String INFO_MODIFY_COMMAND = "modifyCommand"; public static final String INFO_MESSAGE = "message"; public static final String INFO_ERROR = "error"; public static final String INFO_UPDATE_TIME_LIST = "updateTimeList"; public static final String INFO_EXEC_ID_LIST = "execIdList"; public static final String INFO_UPDATES = "updates"; public static final String INFO_USER_ID = "userId"; public static final String INFO_LOG = "logData"; public boolean isFlowRunning(int projectId, String flowId); public ExecutableFlow getExecutableFlow(int execId) throws ExecutorManagerException; public List<Integer> getRunningFlows(int projectId, String flowId); public List<ExecutableFlow> getRunningFlows() throws IOException; /** * <pre> * Returns All running with executors and queued flows * Note, returns empty list if there isn't any running or queued flows * </pre> * * @return * @throws IOException */ public List<Pair<ExecutableFlow, Executor>> getActiveFlowsWithExecutor() throws IOException; public List<ExecutableFlow> getRecentlyFinishedFlows(); public List<ExecutableFlow> getExecutableFlows(Project project, String flowId, int skip, int size) throws ExecutorManagerException; public List<ExecutableFlow> getExecutableFlows(int skip, int size) throws ExecutorManagerException; public List<ExecutableFlow> getExecutableFlows(String flowIdContains, int skip, int size) throws ExecutorManagerException; public List<ExecutableFlow> getExecutableFlows(String projContain, String flowContain, String userContain, int status, long begin, long end, int skip, int size) throws ExecutorManagerException; public int getExecutableFlows(int projectId, String flowId, int from, int length, List<ExecutableFlow> outputList) throws ExecutorManagerException; public List<ExecutableFlow> getExecutableFlows(int projectId, String flowId, int from, int length, Status status) throws ExecutorManagerException; public List<ExecutableJobInfo> getExecutableJobs(Project project, String jobId, int skip, int size) throws ExecutorManagerException; public int getNumberOfJobExecutions(Project project, String jobId) throws ExecutorManagerException; public int getNumberOfExecutions(Project project, String flowId) throws ExecutorManagerException; public LogData getExecutableFlowLog(ExecutableFlow exFlow, int offset, int length) throws ExecutorManagerException; public LogData getExecutionJobLog(ExecutableFlow exFlow, String jobId, int offset, int length, int attempt) throws ExecutorManagerException; public List<Object> getExecutionJobStats(ExecutableFlow exflow, String jobId, int attempt) throws ExecutorManagerException; public JobMetaData getExecutionJobMetaData(ExecutableFlow exFlow, String jobId, int offset, int length, int attempt) throws ExecutorManagerException; public void cancelFlow(ExecutableFlow exFlow, String userId) throws ExecutorManagerException; public void resumeFlow(ExecutableFlow exFlow, String userId) throws ExecutorManagerException; public void pauseFlow(ExecutableFlow exFlow, String userId) throws ExecutorManagerException; public void pauseExecutingJobs(ExecutableFlow exFlow, String userId, String... jobIds) throws ExecutorManagerException; public void resumeExecutingJobs(ExecutableFlow exFlow, String userId, String... jobIds) throws ExecutorManagerException; public void retryFailures(ExecutableFlow exFlow, String userId) throws ExecutorManagerException; public void retryExecutingJobs(ExecutableFlow exFlow, String userId, String... jobIds) throws ExecutorManagerException; public void disableExecutingJobs(ExecutableFlow exFlow, String userId, String... jobIds) throws ExecutorManagerException; public void enableExecutingJobs(ExecutableFlow exFlow, String userId, String... jobIds) throws ExecutorManagerException; public void cancelExecutingJobs(ExecutableFlow exFlow, String userId, String... jobIds) throws ExecutorManagerException; public String submitExecutableFlow(ExecutableFlow exflow, String userId) throws ExecutorManagerException; /** * Manage servlet call for stats servlet in Azkaban execution server * Action can take any of the following values * <ul> * <li>{@link azkaban.executor.ConnectorParams#STATS_SET_REPORTINGINTERVAL}<li> * <li>{@link azkaban.executor.ConnectorParams#STATS_SET_CLEANINGINTERVAL}<li> * <li>{@link azkaban.executor.ConnectorParams#STATS_SET_MAXREPORTERPOINTS}<li> * <li>{@link azkaban.executor.ConnectorParams#STATS_GET_ALLMETRICSNAME}<li> * <li>{@link azkaban.executor.ConnectorParams#STATS_GET_METRICHISTORY}<li> * <li>{@link azkaban.executor.ConnectorParams#STATS_SET_ENABLEMETRICS}<li> * <li>{@link azkaban.executor.ConnectorParams#STATS_SET_DISABLEMETRICS}<li> * </ul> * @throws ExecutorManagerException */ public Map<String, Object> callExecutorStats(int executorId, String action, Pair<String, String>... param) throws IOException, ExecutorManagerException; public Map<String, Object> callExecutorJMX(String hostPort, String action, String mBean) throws IOException; public void shutdown(); public Set<String> getAllActiveExecutorServerHosts(); public State getExecutorManagerThreadState(); public boolean isExecutorManagerThreadActive(); public long getLastExecutorManagerThreadCheckTime(); public Set<? extends String> getPrimaryServerHosts(); /** * Returns a collection of all the active executors maintained by active * executors * * @return */ public Collection<Executor> getAllActiveExecutors(); /** * <pre> * Fetch executor from executors with a given executorId * Note: * 1. throws an Exception in case of a SQL issue * 2. return null when no executor is found with the given executorId * </pre> * * @throws ExecutorManagerException * */ public Executor fetchExecutor(int executorId) throws ExecutorManagerException; /** * <pre> * Setup activeExecutors using azkaban.properties and database executors * Note: * 1. If azkaban.use.multiple.executors is set true, this method will * load all active executors * 2. In local mode, If a local executor is specified and it is missing from db, * this method add local executor as active in DB * 3. In local mode, If a local executor is specified and it is marked inactive in db, * this method will convert local executor as active in DB * </pre> * * @throws ExecutorManagerException */ public void setupExecutors() throws ExecutorManagerException; /** * Enable flow dispatching in QueueProcessor * * @throws ExecutorManagerException */ public void enableQueueProcessorThread() throws ExecutorManagerException; /** * Disable flow dispatching in QueueProcessor * * @throws ExecutorManagerException */ public void disableQueueProcessorThread() throws ExecutorManagerException; }