apache mesos_Apache Mesos:编写自己的分布式框架

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

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

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

相关文章

php获取访问量文本形式,php利用用文本统计访问量的方法图文详解

这篇文章主要介绍了php使用文本统计访问量的方法,涉及php文本文件读写与数值运算的相关技巧,需要的朋友可以参考下方法1&#xff1a;$fp fopen("counter.txt", "r");while(!flock($fp, LOCK_EX)) { // acquire an exclusive lock// waiting to lock the f…

yolov4论文_Alexey 大神接棒,YOLOv4 重磅来袭!快来一睹论文真容吧!| 原力计划...

作者 | Mr.Jk.Zhang责编 | 夕颜出品 | CSDN(ID:CSDNnews)前言千呼万唤始出来系列&#xff0c;继YOLOv3两年后&#xff0c;YOLOv4终于在上周出来了&#xff0c;让我们来一睹论文真容吧&#xff01;由于YOLO之父Jeseph Redmon在今年2月已宣布退出CV学术界&#xff0c;大家都以为Y…

【C/C 】浅谈C/C 中函数指针与回调函数

01、函数指针1.1、函数指针定义一个函数总是占用一段连续的内存区域&#xff0c;函数名在表达式中有时也会被转换为该函数所在内存区域的首地址&#xff0c;这和数组名非常类似。我们可以把函数的这个首地址&#xff08;或称入口地址&#xff09;赋予一个指针变量&#xff0c;使…

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

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

天线3db波束宽度_浅谈 Wi-Fi 天线(2)

在上一期内容中&#xff0c;我们为大家解读了增益(gain)、天线方向图(Antennae Directional Pattern)两个天线技术参数&#xff0c;本期我们来谈谈波束宽度(lobe width)。另一个常见的天线参数是“波束宽度”(又名&#xff1a;波瓣宽度)&#xff0c;英文是 lobe width 或 beam …

C语言实例:3个数从小到大排序

需求任意输入3个整数&#xff0c;对这3个整数由小到大进行排序&#xff0c;并将排序后的结果输出。源码// // author: 冲哥 // date: 2021/5/7 13:37 // description: 实现对这3个整数由小到大进行排序 #include int main() {int num1, num2, num3, temp;printf("请输入3个…

oracle u01清理,Oracleの/u01/11g/diag/rdbms/orcl/orcl/incident 的清理

https://docs.oracle.com/cd/E11882_01/server.112/e25494/diag.htm#ADMIN11007每当一个错误发生的时候&#xff0c;oracle会创建一个incident&#xff0c;并且分配一个INCIDENT_ID号&#xff0c;同时在ADR HOME的INCIDENT目录中创建相应的INCIDENT 目录&#xff0c;每个错误号…

jar 、war、ear_在命令行上操作JAR,WAR和EAR

jar 、war、ear尽管Java IDE和许多图形工具使查看和操作Java归档文件&#xff08;JAR&#xff0c;WAR和EAR&#xff09;文件的内容比以往更加容易&#xff0c;但有时我还是更喜欢使用命令行jar命令来完成这些任务。 当我必须重复做某事或作为脚本的一部分来做时&#xff0c;尤其…

C语言 | 读写文件

C语言怎样向文件读写字符fgetc函数调用形式&#xff1a;fgetc&#xff08;fp&#xff09; 功能&#xff1a;从fp指向的文件读入一个字符。 返回值&#xff1a;读成功&#xff0c;带回所读的字符&#xff0c;失败则返回文件结束标志EOF&#xff08;即-1&#xff09;。fputc函数调…

哨兵系列卫星_空客“哥白尼哨兵-1C”卫星雷达天线首次展开双翼

【民航事儿】2020年8月11日&#xff0c;腓特烈港&#xff1a;通过模拟零重力环境并固定在特殊装置上&#xff0c;哥白尼哨兵-1C卫星的12.3米宽、860公斤重的合成孔径雷达(SAR)的雷达天线&#xff0c;首次成功的在位于德国腓特烈港的空中客车综合技术中心展开双翼。作为哨兵-1系…

oracle vm 环境支持,使用 Oracle VM 模板快速部署 Oracle RAC 环境

6. 实时监控部署状态日志[rootracnode1 racovm]# cat /tmp/progress-racovm.out2014-04-16 03:02:27:[buildcluster:Start:racnode1] Building 11gR2 RAC Cluster2014-04-16 03:02:27:[setsshroot:Start:racnode1] SSH Setup for the root user…2014-04-16 03:02:39:[setsshro…

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

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

C语言中return、break用法和区别

1returnreturn&#xff1a;跳出当前正在执行函数。使用方法&#xff1a;return &#xff08;表达式&#xff09;;其中&#xff0c;&#xff08;表达式&#xff09;是可以省略的。 1.有返回类型return通常都是带有返回类型的&#xff0c;比如返回int型变量&#xff1a;int Fun(v…

兴趣点推荐代码_如何解读霍兰德职业兴趣测评结果?

霍兰德职业兴趣测评不难&#xff0c;难的是如何解读测评结果&#xff0c;这才是生涯规划测评中最重要的部分。今天我们就来说说霍兰德职业兴趣测评的结果应该如何解读。兴趣测评的结果是六种类型得分最高的三个代码依次排列组合而成&#xff0c;所以基本上就是R-实用型、I-研究…

linux mint 18支持安卓编译,Linux mint 18版本开启SSH服务

linux mint 18版本默认是没有安装ssh server的需要手动安装安装ssh server&#xff1a;此命令需要联网&#xff0c;会自动下载安装安装之后看是否开始了ssh&#xff0c;看到ssh-agent 和sshd 说明ssh server 已经启动了如果没看到ssh server 需要手动启动需要/etc/init.d/ssh s…

jcg q8 固件_JCG学院开设了Java设计模式课程!

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

C语言520心形表白,初学者福利!!

C语言实现打印出心形&#xff0c;初学者的表白神器。解题思路&#xff1a;这道例题我分了4部分&#xff0c;前3行一部分&#xff0c;4-6行一部分&#xff0c;7-13行一部分&#xff0c;最后一行一部分&#xff0c;读者请仔细阅读注释&#xff0c;小林写的很详细了。前三行输出&a…

python转型工资_【一点资讯】一个月完成转型!学会风变python到底有多值钱? www.yidianzixun.com...

入职新公司已经有半个月的时间了&#xff0c;现在想起来就在不久前还因为进退两难的工作、不喜欢的人际氛围和薪水少得可怜的工作发愁&#xff0c;就觉得和做了个梦一样神奇。一切的改变都因为学习风变python&#xff0c;一个月成功转型跳槽&#xff0c;并且还实现了薪资翻倍&a…

kali linux 2019教程,[教程]KALI LINUX 2.0 2019 更新国内源

2019年最新版本KALI 为 KALI 2019.1 下载地址:https://www.kali.org/downloads/有的新入门的朋友可能会问&#xff0c;为什么每次都无法手动更新 例如:Update命令的执行失败&#xff1f;其实系统是没有问题的&#xff0c;因为KALI自带的更新源是国外的。因国内延迟高&#xff0…

C | 构成和编码规范

C 的构成1.一个C 程序可以由一个程序单位或多个程序单位构成,每个程序单位为一个文件,编译过程中会对每个文件进行编译。2.每个程序文件包括&#xff1a;预处理命令、全局声明、函数&#xff0c;其中预处理命令就是程序开头的那行&#xff1b;全局声明则是在函数外进行的声明&a…