如何从 Mesos 框架调度器类中读取 mesos task stdout/stderr?



我正在开发一个 Mesos 框架,它运行良好,我唯一的问题是我无法从调度程序类内部读取任务标准输出或标准。

我在下面提供了一个代码示例,我想阅读已完成任务的 stdout 和 stderr,最好是在 statusUpdate 函数中,但任何地方都会有用。如何获取该信息?我尝试从TaskInfo或TaskStatus对象中获取executorInfo或executorId,但没有任何运气。

如果有人可以提供代码示例,将不胜感激。我知道我可以从 url:master:5050 的主 UI 以及从属服务器上的文件系统中读取 stderr 和 stdout,但我真的需要在框架中读取它,在 Java 类中,因为它会影响将来在 resourceServices 函数中做出的调度决策。作为最后的手段,我正在考虑通过构造所需的 URL 对主节点进行 Web 调用,但这太不方便了。mesos API 必须提供一种从调度程序类内部执行此操作的方法。

public class TfScheduler implements Scheduler {
public TfScheduler(String volumes, String container) {
}
@Override
public void registered(SchedulerDriver driver,
Protos.FrameworkID frameworkId,
Protos.MasterInfo masterInfo) {
System.out.println("Registered! ID = " + frameworkId.getValue());
}
@Override
public void reregistered(SchedulerDriver driver, Protos.MasterInfo masterInfo) {
}
@Override
public void disconnected(SchedulerDriver driver) {
}
@Override
public void resourceOffers(SchedulerDriver driver, List<Protos.Offer> offers) {
}
@Override
public void offerRescinded(SchedulerDriver driver, Protos.OfferID offerId
) {
}
@Override
public void statusUpdate(SchedulerDriver driver, Protos.TaskStatus status
) {
System.out.println("Status update: task " + status.getTaskId().getValue()
+ " is in state " + status.getState().getValueDescriptor().getName());
if (status.getState() == Protos.TaskState.TASK_FINISHED) {
/* !!!!! */
//Can I read the task stdout here?
/* !!!!! */
}
}
@Override
public void frameworkMessage(SchedulerDriver driver,
Protos.ExecutorID executorId,
Protos.SlaveID slaveId,
byte[] data
) {
}
@Override
public void slaveLost(SchedulerDriver driver, Protos.SlaveID slaveId
) {
}
@Override
public void executorLost(SchedulerDriver driver,
Protos.ExecutorID executorId,
Protos.SlaveID slaveId,
int status
) {
}
public void error(SchedulerDriver driver, String message) {
System.out.println("Error: " + message);
}
}

谢谢!

无法按照您描述的方式访问 Mesos 任务的 stdout/stderr。默认情况下,Mesos 代理将在给定任务的代理沙箱路径中写入名为stdoutstderr的两个文件。只能通过调用代理 API 来访问此内容。

Mesos 主 UI 的工作原理是使用 URL 对代理进行 Ajax 调用,例如:http://agent:5051/files/browse?path=/var/run/mesos/agents/0/slaves/ab49f68a-b73f-4200-a523-2886353d6450-S0/frameworks/ab49f68a-b73f-4200-a523-2886353d6450-0000/executors/53c98219-f794-4fb6-815d-8b800fc30d9a/runs/0ae1795a-e80f-4f37-ab21-8f78c1286dae/tasks/2981d2db-a218-4c86-9bb2-4371f9be151c/stdout。可以使用计划程序可用的属性推断该路径。

新的 Mesos HTTP 运算符(尚不被认为是稳定的)可以通过READ_FILE调用来实现这一点。我这里有一些来自我开发的工具的示例代码(抱歉它不是用 Java 编写的),它从运算符 API 读取。

根据您尝试做出的调度决策类型,最好通过某个外部通道将消息传播回调度程序循环。

最新更新