我写了一个自定义的mesos执行器 是一个简单的示例 代码如下
package com.example;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.mesos.Executor;
import org.apache.mesos.ExecutorDriver;
import org.apache.mesos.Protos;
import org.apache.mesos.Protos.TaskInfo;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@Slf4j
public final class TaskExecutor implements Executor {
public TaskExecutor() {
log.info("task executor .........");
}
@Override
public void registered(final ExecutorDriver executorDriver, final Protos.ExecutorInfo executorInfo, final Protos.FrameworkInfo frameworkInfo, final Protos.SlaveInfo slaveInfo) {
log.info("task registered......");
}
@Override
public void reregistered(final ExecutorDriver executorDriver, final Protos.SlaveInfo slaveInfo) {
log.info("task reregistered......");
}
@Override
public void disconnected(final ExecutorDriver executorDriver) {
log.info("disconnected .........");
}
@Override
public void launchTask(final ExecutorDriver executorDriver, final TaskInfo taskInfo) {
log.info("launchTask......");
Protos.TaskStatus runningStatus = Protos.TaskStatus.newBuilder()
.setTaskId(taskInfo.getTaskId())
.setState(Protos.TaskState.TASK_RUNNING)
.build();
executorDriver.sendStatusUpdate(runningStatus);
// 2. 执行实际任务(以下任选一种实现)
// 方式A: 执行shell命令(如果TaskInfo中有command)
String command = taskInfo.getData().toStringUtf8();
try {
Process process = Runtime.getRuntime().exec(command);
// 等待任务完成
int exitCode = process.waitFor();
// 3. 根据结果发送最终状态
Protos.TaskState finalState = (exitCode == 0)
? Protos.TaskState.TASK_FINISHED
: Protos.TaskState.TASK_FAILED;
Protos.TaskStatus finalStatus = Protos.TaskStatus.newBuilder()
.setTaskId(taskInfo.getTaskId())
.setState(finalState)
.build();
executorDriver.sendStatusUpdate(finalStatus);
} catch (Exception e) {
log.error("Task execution failed", e);
Protos.TaskStatus errorStatus = Protos.TaskStatus.newBuilder()
.setTaskId(taskInfo.getTaskId())
.setState(Protos.TaskState.TASK_FAILED)
.setMessage("Exception: " + e.getMessage())
.build();
executorDriver.sendStatusUpdate(errorStatus);
}
}
@Override
public void killTask(final ExecutorDriver executorDriver, final Protos.TaskID taskID) {
log.info("task got killed......");
executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskID).setState(Protos.TaskState.TASK_KILLED).build());
}
@Override
public void frameworkMessage(final ExecutorDriver executorDriver, final byte[] bytes) {
}
@Override
public void shutdown(final ExecutorDriver executorDriver) {
}
@Override
public void error(final ExecutorDriver executorDriver, final String message) {
log.error("call executor error, message is: {}", message);
}
}
启动以后 进程会被mesos主动杀掉 下面是我的日志 我是在docker容器上部署的mesos-agent 考虑到是一个简单的例子 基本没有资源问题 比如oom 让我困惑的是 什么原因导致了进程被杀 后来我用了docker容器启动一个镜像nginx例子 进程启动后一分钟也被mesos自动杀掉 请教一下这是什么原因造成的呢
I0103 16:46:27.701495 109 exec.cpp:162] Version: 1.7.1
I0103 16:46:27.717497 116 exec.cpp:236] Executor registered on agent 157ff8a1-f680-453c-ab7d-2b4200dac5f0-S0
I0103 16:46:27.720517 116 executor.cpp:184] Received SUBSCRIBED event
I0103 16:46:27.721859 116 executor.cpp:188] Subscribed executor on mesos-agent
I0103 16:46:27.723505 116 executor.cpp:184] Received LAUNCH event
I0103 16:46:27.725533 116 executor.cpp:687] Starting task executor2-v1-1767429987406-1-mesos_agent-DEFAULT
I0103 16:46:27.730633 116 executor.cpp:502] Running '/usr/libexec/mesos/mesos-containerizer launch <POSSIBLY-SENSITIVE-DATA>'
I0103 16:46:27.733171 116 executor.cpp:702] Forked command at 119
I0103 16:46:28.437938 121 exec.cpp:162] Version: 1.7.1
I0103 16:46:28.451352 144 exec.cpp:445] Executor asked to shutdown
I0103 16:46:33.470431 110 executor.cpp:1003] Command terminated with signal Killed (pid: 119)
I0103 16:46:34.474253 118 process.cpp:926] Stopped the socket accept loop