使用 Apache Mesos 打造分布式资源调度系统

简介:

Netflix使用Apache Mesos运行了一系列批处理、流式处理,以及服务类型的工作负载。两年多来,我们创建了层出不穷的用例,例如实时异常检测、批处理作业的训练和模型构建、机器学习编排,以及基于Node.js的微服务。最近发布的Apache Mesos 1.0意味着这项技术已经成熟,相比我们首次使用该服务时已经有了巨大的改进。

我们最初使用Apache Mesos的动力主要在于该技术能够将来自同一个EC2实例的资源更为细化地分配给不同规模的任务。如果不使用Mesos或其他类似的资源管理器,将无法为数量日益增加的实例进行更细化的分配,导致无法获得令人满意的利用率,或只能自行开发类似于Mesos的技术,至少也要开发出其中的部分功能。

越来越多的流式处理和批处理作业开始使用容器,这也推动了基于Mesos的资源调度技术的使用。最近开发者已经可以从基于Docker的容器通过Mesos集群获得一系列服务类型的工作负载。本文将概括介绍Netflix工程团队使用Apache Mesos打造的一些项目。我们将介绍该技术所满足的不同用例,以及每个用例是如何高效使用这种技术的。有关每个项目的进一步细节请参阅下文给出的博文链接。

使用Apache Mesos打造云端原生调度机制

为了从不同EC2实例为任务分配资源,我们需要一种能对可用资源进行调度,并能在分布式EC2实例上启动和监控任务的资源管理器。Apache Mesos可将要使用集群的“框架”的资源分配,与框架任务的资源调度区分处理。当Mesos确定要将多少资源分配给框架后,将由框架的调度器决定在什么时候将哪些资源分配给哪个任务。这样的调度器是一种相当简单的API,因此也能更专注于调度逻辑,并对分布式系统中不可避免出现的故障做出回应。借此用户可以针对不同用例编写不同调度器,不像Mesos那样为所有用例使用一个统一的调度器。下图来自Mesos文档,展示了“框架1”收到“代理1”的指令启动两个任务的过程。

image

一段时间来,Mesos社区已经出现了多种针对不同用例的调度器,并为用户提供了相应的API。

Netflix在AWS EC2弹性云中运行了多个微服务。在原生云环境中运维Mesos集群要求我们必须确保除了与数据中心内部运维类似的任务外,调度器还能同时处理另外两方面内容:运行任务的代理寿命更短暂,以及Mesos代理集群具备根据需求变化自动伸缩的能力。另外我们所处理的用例需要实现一种比First fit类型的分配更先进的资源调度机制。例如按照CPU、内存,以及网络带宽的用量将多个任务装箱(Bin packing)到不同代理,借此实现资源碎片最小化。装箱还可以帮助我们释放尽可能多的代理,在不影响运行中任务的前提下终止空闲代理,让代理集群的扩张速度放缓。

为找出现有调度器在此类能力方面的缺失,去年我们开发了一种名为Fenzo的调度库。Fenzo可以根据需求自动缩放代理集群,并根据由健康标准(Fitness criteria)和约束组成的多种调度目标为任务分配资源。这些健康标准和约束可通过插件进行扩展,并具备少量内建的通用实现,例如为了实现高可用跨越EC2可用区对作业进行任务装箱和分散。JVM上运行的任何Mesos框架都可使用Fenzo Java库。

Netflix对Mesos的运用

目前我们通过Apache Mesos集群运行了三个项目。

Mantis

Mantis是一种以原生云服务方式运行的反应式流处理平台,主要侧重于运维数据流的处理。Mantis包含多种不同用例,例如实时仪表盘、预警、异常检测、衡量指标生成,以及流数据的即席交互式探索。我们使用Mantis主要是为了简化团队成员访问实时事件和以此为基础构建的计费应用程序的过程。目前Mantis的事件流处理能力已高达每秒800万条事件,可不间断运行数百个流处理作业。我们有一个此类作业主要侧重于视频内容的处理,可以针对内容提供细化的洞察,例如巴西地区iPad上播放纸牌屋第四季第一集时遇到了问题。这一功能需要不间断追踪数百万不同的数据排列组合方式。

Mantis平台包含一个主(Master)集群和一个代理(Agent)集群。用户可以将流处理应用程序以作业的形式提交,并在代理集群内一个或多个工作进程(Worker)上运行。主集群会使用Apache Mesos中包含的Fenzo调度库优化作业工作进程的资源分配。这种分配操作的目标之一在于将需要持续不间断运行的流处理作业与只需要短时间运行的交互式作业分布到不同代理上,这样当短时间运行的作业运行完毕后,即可收缩代理集群的规模。下图展示了Mantis的体系结构。来自不同作业的工作进程可以通过基于Cgroups的资源隔离机制在同一个代理上运行。

image

Titus

Titus是一种Docker容器作业管理和执行平台。最初Titus主要用于实现包含算法训练(类似于视频推荐、A/B测试单元体分析等任务)的批处理作业,以及需要每小时运行一次的即席报表和分析作业。最近为了提供一致的本地开发体验以及实现更细化的资源管理,Titus开始为服务类型的作业(Netflix微服务)提供支持。Titus首个服务类型的用途是使用服务器端的NodeJS进行API的重构。

image

上述Titus体系结构示意图展示了使用Fenzo从Mesos代理分配资源的主节点。Titus可与Netflix微服务和AWS生态系统实现紧密集成,包括与服务发现、基于软件的负载平衡、监控,以及我们的CI/CD管线、Spinnaker等技术进行集成。在Mesos中编写自定义执行器的能力使得我们能够轻松地对容器运行时进行优化,使其与生态系统的其他部分更为匹配。

Meson

Meson是一种通用的工作流编排和调度框架,主要可用于管理机器学习管线。

Meson主要适用于对CPU、内存,以及磁盘空间等资源有着不同要求的作业所组成的异构环境。它可以支持通过一个共享集群运行Spark作业和其他批处理作业。在基于Cgroups的隔离机制帮助下,代理上的不同任务将使用相互隔离的资源运行。Meson的调度器会根据图表(Graph)评估任务的就绪情况,并通过Mesos提供的资源启动已经就绪的任务。失败处理措施包括重新启动失败的任务,以及自动终止被确定为已经出错的任务。
image

上述示意图展示了Meson的体系结构。Meson团队目前正在着手使用Fenzo调度库增强其调度能力。

Apache Mesos的继续完善

在我们持续完善Mantis、Titus和Meson项目的过程中,Apache Mesos提供了稳定、可靠、可伸缩的资源管理平台。我们通过开源的Fenzo以及在MesosCon大会上分享创意等方式参与到了Mesos的社区贡献中。您可以在即将举办的MesosCon Europe 2016大会上与我们交流,或查看我们之前参与2014、2015年,以及今年上半年活动的总结(学到的经验和Meson)。

对于这些项目,我们的未来计划包括增加SLA(服务级别协议,例如为服务和批处理形式的作业提供不同的容量担保),对代理和容器的安全加固,改善运维效率和能见度,以及对更广泛用例的支持。为了取得更长足的进展,目前我们正在围绕Mesos、Fenzo以及我们的框架开展一些非常激动人心的项目。

文章转载自 开源中国社区[http://www.oschina.net]

相关文章
|
2月前
|
消息中间件 安全 Kafka
Apache Kafka安全加固指南:保护你的消息传递系统
【10月更文挑战第24天】在现代企业环境中,数据的安全性和隐私保护至关重要。Apache Kafka作为一款广泛使用的分布式流处理平台,其安全性直接影响着业务的稳定性和用户数据的安全。作为一名资深的Kafka使用者,我深知加强Kafka安全性的重要性。本文将从个人角度出发,分享我在实践中积累的经验,帮助读者了解如何有效地保护Kafka消息传递系统的安全性。
141 7
|
18天前
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
257 66
|
3月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
128 3
|
5天前
|
存储 监控 Java
招行面试: 分布式调度 设计,要考虑 哪些问题?
45岁资深架构师尼恩在读者交流群中分享了关于设计分布式调度框架时需考虑的关键问题。近期有小伙伴在面试招商银行时遇到了相关难题,因准备不足而失利。为此,尼恩系统化地梳理了以下几点核心内容,帮助大家在面试中脱颖而出,实现“offer直提”。
|
2月前
|
消息中间件 监控 数据可视化
Apache Airflow 开源最顶级的分布式工作流平台
Apache Airflow 是一个用于创作、调度和监控工作流的平台,通过将工作流定义为代码,实现更好的可维护性和协作性。Airflow 使用有向无环图(DAG)定义任务,支持动态生成、扩展和优雅的管道设计。其丰富的命令行工具和用户界面使得任务管理和监控更加便捷。适用于静态和缓慢变化的工作流,常用于数据处理。
Apache Airflow 开源最顶级的分布式工作流平台
|
1月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
81 4
|
2月前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
142 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
2月前
|
消息中间件 Java Kafka
初识Apache Kafka:搭建你的第一个消息队列系统
【10月更文挑战第24天】在数字化转型的浪潮中,数据成为了企业决策的关键因素之一。而高效的数据处理能力,则成为了企业在竞争中脱颖而出的重要武器。在这个背景下,消息队列作为连接不同系统和服务的桥梁,其重要性日益凸显。Apache Kafka 是一款开源的消息队列系统,以其高吞吐量、可扩展性和持久性等特点受到了广泛欢迎。作为一名技术爱好者,我对 Apache Kafka 产生了浓厚的兴趣,并决定亲手搭建一套属于自己的消息队列系统。
89 2
初识Apache Kafka:搭建你的第一个消息队列系统
|
2月前
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
111 1
|
2月前
|
机器学习/深度学习 人工智能 分布式计算
【AI系统】分布式通信与 NVLink
进入大模型时代后,AI的核心转向大模型发展,训练这类模型需克服大量GPU资源及长时间的需求。面对单个GPU内存限制,跨多个GPU的分布式训练成为必要,这涉及到分布式通信和NVLink技术的应用。分布式通信允许多个节点协作完成任务,而NVLink则是一种高速、低延迟的通信技术,用于连接GPU或GPU与其它设备,以实现高性能计算。随着大模型的参数、数据规模扩大及算力需求增长,分布式并行策略,如数据并行和模型并行,变得至关重要。这些策略通过将模型或数据分割在多个GPU上处理,提高了训练效率。此外,NVLink和NVSwitch技术的持续演进,为GPU间的高效通信提供了更强的支持,推动了大模型训练的快
52 0

推荐镜像

更多