apache mesos

在上一篇文章中 ,我们了解了mesos是什么,它如何有用,并开始使用它。 在本文中,我们将看到如何在mesos上编写自己的框架。 (在mesos中,框架是在其上运行的任何应用程序。)本文介绍了一个名为“ mesos-pinspider”的框架,该框架获取用户的pinterest页面的用户配置文件信息和用户面板信息。

Mesos框架

通常,Mesos框架具有三个基本组件。

  • 将任务提交给框架的驱动程序
  • 向主服务器注册要提供资源的调度程序 ,执行任务并在执行程序上运行它们
  • 在从属节点上启动以执行框架任务的执行程序进程

Pinspider框架示例

您可以在github上检查代码。 让我们将其细分为PinDriver,PinScheduler和Pin UserProfileExecutor。

司机

该框架的驱动程序组件是PinDriver。

  • 创建执行人信息

    使用Builder模式描述有关执行程序的信息,而mesos使用Google协议缓冲区进行数据交换。 在这里,我们需要设置executorID,该命令基本上是一个shell命令,通过以下命令执行:'/ bin / sh -c value'。 在执行命令之前,将获取指定的所有URI。 名称由setName()设置。 来源由
    setSource(),框架用来跟踪执行程序源的标识符样式字符串。 当不同的执行者ID可能在语义上相关时,这很有用。

    Protos.ExecutorInfo userProfileExecutorInfo = Protos.ExecutorInfo.newBuilder().setExecutorId(Protos.ExecutorID.newBuilder().setValue("PinUserProfileExecutor")).setCommand(commandInfoUserProfile).setName("PinUserProfileExecutor Java").setSource("java").build();
  • 创建框架信息

    描述框架信息。 用户字段用于确定执行程序/任务应以其启动的Unix用户。 如果用户字段设置为空字符串,Mesos将自动将其设置为当前用户。 主机在删除框架之前等待调度程序进行故障转移的时间由以下方式指定:
    setFailoverTimeout()。 框架的名称由setName()设置

    Protos.FrameworkInfo.Builder frameworkBuilder = Protos.FrameworkInfo.newBuilder().setFailoverTimeout(120000).setUser("").setName("Pinspider Framework");
  • 实例化调度程序

    您需要使用需要提交的数量实例化调度程序才能使执行程序运行。

    Scheduler scheduler = args.length == 1 ?new PinScheduler(userProfileExecutorInfo,userBoardExecutorInfo) :new PinScheduler(userProfileExecutorInfo, userBoardExecutorInfo, Integer.parseInt(args[1]), args[2]);

    注意:请注意,使用了两个ExecutorInfo。 一个用于获取用户个人资料信息,另一个用于演示用户板信息。 此说明仅涉及一个executorinfo – userProfileExecutorInfo

  • 启动mesos调度程序驱动程序。

    MesosSchedulerDriver是SchedulerDriver的实现,SchedulerDriver是将调度程序连接到mesos的抽象接口。 这是通过管理调度程序的生命周期(开始,停止和等待任务完成)以及与Mesos交互(启动任务,终止任务等)来完成的。

    MesosSchedulerDriver schedulerDriver =new MesosSchedulerDriver(scheduler,frameworkBuilder.build(), args[0]);int status = schedulerDriver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1;schedulerDriver.stop();System.exit(status);

执行器执行

框架的执行器组件是PinUserProfileExecutor。

执行程序是由框架的执行程序实现的回调接口。 在我们的实现中,让我们专注于launchTask()

@Override public void launchTask(final ExecutorDriver executorDriver
final Protos.TaskInfo taskInfo) { }
  • 通过使用构建器模式设置ID和状态来设置任务状态。

    Protos.TaskStatus taskStatus =Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId())
    .setState(Protos.TaskState.TASK_RUNNING).build();
  • 将状态更新发送到框架调度程序,根据需要进行重试,直到收到确认或执行程序终止为止,在这种情况下,将发送TASK_LOST状态更新。
    executorDriver.sendStatusUpdate(taskStatus);
  • 从任务中获取数据并运行逻辑。
    try {message = ("userprofile :" + getUserProfileInfo(url)).getBytes();
    } catch (IOException e) {LOGGER.error("Error parsing the Pinterest URL :" + e.getMessage());
    }
  • 向框架发送消息。
    executorDriver.sendFrameworkMessage(message);
  • 将任务的状态标记为已完成,然后将状态更新发送到框架调度程序。
    taskStatus = Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_FINISHED).build();
    executorDriver.sendStatusUpdate(taskStatus);
  • main()方法创建MesosExecutorDriver实例并运行
    mesosExecutorDriver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1

调度程序实施

该框架的Scheduler组件是Pin Scheduler。

调度程序是由框架的调度程序实现的回调接口。 在我们的实现中,让我们专注于resourceOffers(),statusUpdate()和frameworkMessage()

  • 构造函数:使用执行程序信息和启动任务数进行构造。

    public PinScheduler(Protos.ExecutorInfo pinUserProfileExecutor , Protos.ExecutorInfo pinUserBoardExecutor ) {this(pinUserProfileExecutor,pinUserBoardExecutor, 5, "http://www.pinterest.com/techcrunch");
    } public PinScheduler(Protos.ExecutorInfo pinUserProfileExecutor,Protos.ExecutorInfo pinUserBoardExecutor,  int totalTasks, String url) { this.pinUserProfileExecutor = pinUserProfileExecutor;this.pinUserBoardExecutor = pinUserBoardExecutor;this.totalTasks = totalTasks; this.crawlQueue =Collections.synchronizedList(new ArrayList<String>());this.crawlQueue.add(url);
    }
  • 资源报价
    • 资源商品可以是CPU,内存等资源。从商品列表中,获取资源的标量值。 在设置任务信息时,我们需要提供任务资源的需求。

      for (Protos.Offer offer : list) {List<Protos.TaskInfo> taskInfoList = new ArrayList<Protos.TaskInfo>();double offerCpus = 0; double offerMem = 0;for (Protos.Resource resource : offer.getResourcesList()) {if (resource.getName().equals("cpus")) {offerCpus += resource.getScalar().getValue();}else if (resource.getName().equals("mem")) {offerMem += resource.getScalar().getValue();}}LOGGER.info("Received Offer : " + offer.getId().getValue() +" with cpus = " + offerCpus + " and mem =" + offerMem);
    • 创建任务ID。
      Protos.TaskID taskID = Protos.TaskID.newBuilder().setValue(Integer.toString(launchedTasks++)).build();
    • 通过设置任务ID,添加资源,设置数据和设置执行程序来创建任务信息。
      Protos.TaskInfo pinUserProfileTaskInfo = Protos.TaskInfo.newBuilder().setName("task " + taskID.getValue()).setTaskId(taskID).setSlaveId(offer.getSlaveId()).addResources(Protos.Resource.newBuilder().setName("cpus").setType(Protos.Value.Type.SCALAR).setScalar(Protos.Value.Scalar.newBuilder().setValue(CPUS_PER_TASK))).addResources(Protos.Resource.newBuilder().setName("mem").setType(Protos.Value.Type.SCALAR).setScalar(Protos.Value.Scalar.newBuilder().setValue(MEM_PER_TASK))).setData(ByteString.copyFromUtf8(crawlQueue.get(0))).setExecutor(Protos.ExecutorInfo.newBuilder(pinUserProfileExecutor)).build();
    • 通过SchedulerDriver启动任务。
      ...
      taskInfoList.add(pinUserProfileTaskInfo);
      taskInfoList.add(pinUserBoardTaskInfo);
      }
      schedulerDriver.launchTasks(offer.getId(), taskInfoList);
  • 状态更新

    当任务的状态已更改(即,从属丢失且任务丢失),任务完成且执行者发送状态更新时,调用此方法。

    @Override public void statusUpdate(SchedulerDriver schedulerDriver, Protos.TaskStatus taskStatus) {
    ...
    }
    • 如果任务完成,请停止SchedulerDriver

      if (taskStatus.getState() == Protos.TaskState.TASK_FINISHED) {finishedTasks++;LOGGER.info("Finished tasks : " + finishedTasks);if (finishedTasks == totalTasks) {schedulerDriver.stop();}}
    • 如果任务被杀死,丢失或失败,则中止SchedulerDriver
      if (taskStatus.getState() == Protos.TaskState.TASK_FAILED
      || taskStatus.getState() == Protos.TaskState.TASK_KILLED
      || taskStatus.getState() == Protos.TaskState.TASK_LOST) {LOGGER.error("Aborting because the task " + taskStatus.getTaskId().getValue() +" is in unexpected state : " + taskStatus.getState().getValueDescriptor().getName() +"with reason : " + taskStatus.getReason().getValueDescriptor().getName()+ " from source : " + taskStatus.getSource().getValueDescriptor().getName() + " with message : " + taskStatus.getMessage());schedulerDriver.abort();
      }
  • 框架讯息

    当执行程序发送消息时,将调用此函数。

    • 处理您的讯息

      @Override public void frameworkMessage(SchedulerDriver schedulerDriver, Protos.ExecutorID executorID,
      Protos.SlaveID slaveID, byte[] bytes) {String data = new String(bytes);System.out.println(data);LOGGER.info("User Profile Information : " + data);
      }

此处提供了完整的代码,并提供了运行和输出示例的说明。

翻译自: https://www.javacodegeeks.com/2015/01/apache-mesos-writing-your-own-distributed-frameworks.html

apache mesos

apache mesos_Apache Mesos:编写自己的分布式框架相关推荐

  1. apache mesos_Apache Mesos + Marathon和Java EE

    apache mesos Apache Mesos是一个开放源代码群集管理器,可在分布式应用程序或框架之间提供有效的资源隔离和共享. Apache Mesos从计算机(物理或虚拟)中提取CPU,内存, ...

  2. Python 并行分布式框架 Celery

    Celery 官网:http://www.celeryproject.org Celery 官方文档英文版:http://docs.celeryproject.org/en/latest/index. ...

  3. SpringCloud分布式框架

    SpringCloud分布式框架 SpringCloud框架 Spring Cloud 是一个用于创建分布式系统的开源框架.它基于 Spring Boot 和 Spring Framework,提供了 ...

  4. 01.分布式框架-Dubbox

    1.走进电商 1.1电商行业分析 近年来,中国的电子商务快速发展,交易额连创新高,电子商务在各领域的应用不断拓展和深化.相关服务业蓬勃发展.支撑体系不断健全完善.创新的动力和能力 不断增强.电子商务正 ...

  5. 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer www.cnblogs.com/J ...

  6. 大数据时代,如何根据业务选择合适的分布式框架

    内容来源:2018 年 5 月 5 日,小米HBase研发工程师吴国泉在"ACMUG & CRUG 2018 成都站"进行<大数据时代系统体系架构和对比:存储与计算& ...

  7. javaweb学习总结(四十)——编写自己的JDBC框架

    一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...

  8. 游戏开发--开源软件11--Firefly(python 服务端分布式框架)||pygame

    2019独角兽企业重金招聘Python工程师标准>>> Firefly是免费.开源.稳定.快速扩展.能 "热更新"的分布式游戏服务器端框架,采用Python编写, ...

  9. 从零开始编写自己的C#框架(17)——Web层后端首页

    后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...

最新文章

  1. ASP.NET 2.0 – 善用DataSourceMode属性
  2. 图表控件 c++_用C/C++编写16位虚拟内核
  3. 酱油和gbt酱油哪个好_韩国酱油真的这么好,到底怎么挑?
  4. .net core HttpClient 使用之掉坑解析(一)
  5. dedecms织梦最新0day
  6. 腾讯实习生招聘笔试题目
  7. 校外实习报告(二十)
  8. [Android Security] DEX文件格式分析
  9. 职业四象限,分分钟定位你的方向
  10. 怎样使用轻快pdf阅读器
  11. 数学、键盘符号和时间复杂度的英语术语及表述方法(编程,标识符,按键,空间复杂度,指数,对数,模运算)
  12. GreenDao笔记
  13. 操作系统(第四版)期末复习总结(上)
  14. Sentinel 流控(限流)
  15. 数据挖掘与分析课程笔记(Chapter 7)
  16. 图之邻接矩阵详解(C语言版)
  17. 判断素数的五种方法最全埃筛素数欧筛素数孪生素数
  18. 中国上市公司对赌协议研究数据库(截至2020年5月6日,可用于业绩承诺等实证)
  19. 多尺度融合的MRI脑肿瘤图像分割方法
  20. 利用python爬取网易云心爱歌单

热门文章

  1. jzoj4024-石子游戏【SG函数,博弈论】
  2. vijos1237-隐形的翅膀【离散化】
  3. 【2018.4.21】模拟赛之四-ssl2405 巧克力【实际上是模拟】
  4. ssl1613-最短路径问题【图论,最短路径(还不明显?)】
  5. 【树链剖分】Milk Visits G(luogu 5838)
  6. 一文带你了解Java Agent
  7. <table/>默认适应内容宽度造成滚动条不显示的解决方法
  8. vue.js 接收url参数
  9. 分布式一致性算法:可能比你想象得更复杂
  10. publiccms中,怎么修改默认的端口8080以及默认上下文名称