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

eqfvzcg8  于 2021-06-26  发布在  Mesos
关注(0)|答案(1)|浏览(285)

我正在开发一个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);
    }

}

谢谢!

iq0todco

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读取。
根据您尝试做出的调度决策类型,最好通过一些外部通道将消息传播回调度程序循环。

相关问题