我正在开发一个mesos框架,它工作得非常好,唯一的问题是我无法从调度器类内部读取任务stdout或stderr。
我在下面提供一个代码示例,我想阅读一个已完成任务的stdout和stderr,最好是在statusupdate函数中,但任何地方都会有用。我怎样才能得到那个信息?我尝试从taskinfo或taskstatus对象获取executorinfo或executorid,但没有成功。
如果有人能提供一个代码样本将不胜感激。我知道我可以从主ui中读取stderr和stdouturl:master:5050以及从机上的文件系统,但我确实需要在框架内,在java类中阅读它,因为它将影响在resourceoffers函数中做出的未来调度决策。作为最后的手段,我想通过构造所需的url来向主机进行web调用,但那太不方便了。mesosapi必须提供一种从调度器类内部执行的方法。
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);
}
}
谢谢!
1条答案
按热度按时间iq0todco1#
无法按您描述的方式访问mesos任务的stdout/stderr。默认情况下,mesos代理将写入两个名为
stdout
以及stderr
在给定任务的代理沙盒路径中。只有通过调用代理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
. 可以使用调度程序可用的属性推断该路径。新的mesoshttp操作符(尚未被认为是稳定的)可以通过
READ_FILE
打电话。我这里有一些示例代码来自我开发的一个工具(抱歉,它不是用java编写的),它从operator api读取。根据您尝试做出的调度决策类型,最好通过一些外部通道将消息传播回调度程序循环。