Mesos自定义框架: 我们的目标是启动docker容器。 此docker容器应该运行自定义执行程序,如果容器可以访问作为URI的一部分传递的jar文件,则可以执行此操作。 这是编辑后的代码摘录,作为独立主类的一部分,作为框架的起点。
String path = "http://localhost/example/example-1.0-SNAPSHOT-jar-with-dependencies.jar";
Protos.CommandInfo.URI uri = Protos.CommandInfo.URI.newBuilder().setValue(path).setExtract(false).build();
String command = "java -cp example-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.ExampleExecutor";
Protos.CommandInfo commandInfo = Protos.CommandInfo.newBuilder().setValue(command).addUris(uri).build();
Protos.ContainerInfo.DockerInfo.Builder dockerInfo = Protos.ContainerInfo.DockerInfo.newBuilder();
dockerInfo.setImage(imageName);
dockerInfo.setNetwork(Protos.ContainerInfo.DockerInfo.Network.BRIDGE);
Protos.ContainerInfo.Builder containerInfo = Protos.ContainerInfo.newBuilder();
containerInfo.setType(Protos.ContainerInfo.Type.DOCKER);
containerInfo.setDocker(dockerInfo.build());
Protos.ExecutorInfo exampleExecutor = Protos.ExecutorInfo.newBuilder()
.setExecutorId(Protos.ExecutorID.newBuilder().setValue("ExampleExecutor"))
.setCommand(commandInfo)
.setName("Example Executor")
.setContainer(containerInfo)
.setSource("java")
.build();
Mesos自定义调度程序: 下面是用于启动docker任务的代码摘录。 我们希望将docker作为执行程序而不是任务运行。
Protos.TaskInfo task = Protos.TaskInfo.newBuilder()
.setName("task " + taskId).setTaskId(taskId)
.setSlaveId(offer.getSlaveId())
.addResources(buildResource("cpus", job.getCpu()))
.addResources(buildResource("mem", 128)) .setData(ByteString.copyFromUtf8(ExampleModelObject.toJSON()))
.setExecutor(Protos.ExecutorInfo.newBuilder(exampleExecutor))
.build();
我不确定它到底在做什么。我们的容器是由mesos启动的,但jar文件在容器内部不可用,因此在容器内运行执行程序类的命令失败,原因是无法加载主类。 此外,我不确定docker容器是作为任务还是执行程序运行。没有在互联网上找到任何相关问题。