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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery可见性选择器(综合)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>可见性选择器</title>…

LoadRunner如何监控Linux下的系统资源

前一段时间在研究LoadRunner过程中&#xff0c;在进行压力场景测试中通过LoadRunner来实时监控windows的系统资源&#xff0c;在前几节中我已经总结了相关过程&#xff0c;近段时间发现群里有朋友问如何监控Linux下的系统资源&#xff0c;所以我也就此问题搭建了一些的Linux环境…

页面跳转多种方法(加传参)

onclick"javascript:location.href/HelpCenter/HelpCenter/" <a href"/HelpCenter/HelpCenter">帮助中心</a>点击页面返回上一页&#xff1a; onclick"javascript:window.history.go(-1); *********************************************…

log4j的使用

文章出处&#xff1a;http://www.blogjava.net/zJun/archive/2006/06/28/55511.html 首先&#xff0c;要在项目classpath下建立log4j.properties 1. 配置文件 #配置根Logger log4j.rootLogger [level], appenderName1, appenderName2, …#配置日志信息输出目的地Appender log4…

使用@Rule在JUnit中测试文件和目录

多亏了TemporaryFolder Rule在JUnit中使用文件和目录进行测试很容易。 在JUnit中&#xff0c;规则&#xff08; Rule &#xff09;可以替代或设置夹具设置和清除方法&#xff08; org.junit.Before &#xff0c; org.junit.After &#xff0c; org.junit.BeforeClass和org.jun…

jquery简单原则器(匹配索引为指定值的元素)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>简单选择器</title>&l…

POJ-1664 放苹果 动态规划思想解组合数学

该题说明了状态开设的意义一样,但是从哪个方向去理解推倒状态的转移对解题非常关键.该题扣住是否所有的盘子中有空盘子,就得到了一个非常简单且优美的方程.如果从当前盘子的放置状态或者是当前苹果的放置状态来求解状态转移方程就不能写出来.这和题意中的相同盘子,相同苹果有很…

JCG学院开设了Java设计模式课程!

自从我们推出JCG学院以来&#xff0c;已经有一段时间了。JCG学院是一个基于付费内容的高级订阅网站&#xff0c;提供有关最新技术的课程&#xff0c;涵盖从RedSQL数据库&#xff08;如Redis和CouchDB&#xff09;到使用Android进行移动开发的最新知识。 当然&#xff0c;与Jav…

用友异常清理工具

此类工具网上很多&#xff0c;但&#xff0c;网上的病毒千千万万&#xff0c;还是自己开发使用较为放心。而且具体执行了什么也一清二楚&#xff0c;可以放心。 此工具适用大部份版本&#xff0c;从U821至U871&#xff0c;包括U6系列。 转载于:https://www.cnblogs.com/wuxi15/…

JVM因“ OutOfMemory”错误而关闭-我该怎么办?

看起来似乎很神奇&#xff0c;但是在有关JVM设置的搜索请求结果中经常显示这种“从深度”的呼喊。 您可能会遇到“我记得该选项&#xff0c;但如何启用它”的问题&#xff0c;而有时&#xff08;主要是半年一次&#xff09;管理服务器或调整虚拟设备&#xff0c;而又除主要任务…

jquery层级原则器(匹配后代元素div)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>层级 </title><met…

输入焦点默认指示在编辑框上

mfc 对话框(模态)中有一编辑框控件 如何在显示对话框时 将输入焦点默认指示在编辑框上呢&#xff1f; 2011-05-11 11:40 提问者&#xff1a; 绝岭雄风 我来帮他解答 满意回答2011-05-11 11:42对话框上按ctrlD 出来后先点那个编辑框控件 使得那个空间的排序为1号即可 追问太感谢…

JBoss Data Virtualization 6.1 Beta现在可用

JBoss 数据虚拟化 &#xff08;JDV&#xff09;是一种数据集成解决方案&#xff0c;位于多个数据源的前面&#xff0c;并允许将它们视为一个源。 做到这一点&#xff0c;它提供了数据抽象&#xff0c;联合&#xff0c;集成&#xff0c;转换和交付功能&#xff0c;可将来自一个或…

hibernater面试一

什么是Hibernate的并发机制&#xff1f;怎么去处理并发问题&#xff1f; Hibernate并发机制&#xff1a; a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次, 然后就丢弃。 如果一个Session 实例允许共享的…

使用Spring Boot和MongoDB创建REST API

Spring Boot是一个自以为是的框架&#xff0c;可简化Spring应用程序的开发。 它使我们摆脱了复杂配置文件的束缚&#xff0c;并帮助我们创建了不需要外部servlet容器的独立Spring应用程序。 这听起来实在令人难以置信&#xff0c;但Spring Boot确实可以完成所有这一切 。 这篇…

Oracle用 odp.net 时出现 Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常 问题的解决...

在初次使用 Oracle 时&#xff0c;用ado.net连接数据&#xff0c;出现 “Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常 的提示&#xff1a; 解决方法&#xff1a;将对应版本的 OraOps11W.dll 拷到应用程序目录。 转载于:https://www.cnblogs.com/pp…

如何将Jersey集成到Spring MVC应用程序中

我最近开始使用Java为Podcastpedia.org和JAX-RS实现构建公共的REST API&#xff0c;我选择了Jersey &#xff0c;因为我发现它“自然”且功能强大-您可以通过遵循教程了解更多信息-带有Jersey和Spring的Java中的REST API设计和实现。 由于Podcastpedia.org是由Spring MVC支持的…

点击显示底框颜色,默认显示第一个。

页面初始化显示第一个底框颜色&#xff0c;点击另一个第一个底框颜色消失&#xff0c;被点击的底框颜色显示&#xff0c;以此循环。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional…

简单用于测试的listview的视图

http://www.iteye.com/topic/540423转载于:https://www.cnblogs.com/ct732003684/archive/2013/01/21/2869376.html

依赖注入–字段vs构造函数vs方法

嗨&#xff0c;今天&#xff0c;我想简单地讨论将依赖项注入您的类的不同方式。 通常&#xff0c;您有以下三种注射方法 直接进入字段/属性 通过显式的setter方法 通过显式的构造函数参数 现场注入 这种类型的注入为将所需的依赖项注入到类中提供了某种反射机制。 尽管这…