来自 数据 2022-06-09 13:30 的文章

国内高防cdn_ddos防御多少钱_免费测试

国内高防cdn_ddos防御多少钱_免费测试

KubernetesplantirFollow2019年5月17日·9分钟阅读

这是我们关于Rubix博客系列的第二篇文章,我们致力于围绕Kubernetes重建我们的云架构。

2018年,随着我们在Kubernetes生产中快速扩大Spark的使用,我们扩展了Kubernetes,通过调度器扩展器添加了对批处理作业调度的支持。特别是,我们试图缓解集群过度订阅期间部分调度带来的问题。这篇博文介绍了我们的开源k8s spark scheduler extender,解释了它的工作原理,并深入了解了我们在Palantir的生产中看到的运行结果。

简介

作为spark社区的长期热情参与者,我们很高兴使用Spark作为在Palantir Foundry中执行用户编写的代码的框架之一。Foundry为我们的客户提供了一个用于复杂数据分析和转换的通用数据平台。Foundry执行两类不同的工作负载:用于批处理的短期专用Spark应用程序和用于交互式用户查询的长期多租户Spark应用程序。今天我们每天在数百个环境的数千台主机上运行数万个Spark应用程序。

本系列的第一篇文章讲述了Rubix的起源故事:Palantir的部署基础设施团队决定将Foundry的云架构迁移到Kubernetes,从而致力于支持安全的多租户Spark群集在库伯内特斯之上。第一步是开源工作(与多个组织的工程师一起)向Spark添加Kubernetes支持。虽然这项工作在合并到主线Spark的意义上是成功的,并且在单个Spark应用程序中运行良好,但与YARN相比,Kubernetes对多容器批处理工作负载的支持仍然不成熟。我们开发了k8s spark scheduler,以解决在生产环境中运行spark on Kubernetes时遇到的两个主要问题:不可靠的执行器调度和缓慢的自动缩放。

spark on Kubernetes

Kubernetes通过Kubernetes API声明所需的对象状态,c防御ddos源码,从而使POD或服务等Kubernetes对象变为现实。Kubernetes控制器持续观察期望状态和实际状态之间的差异,并采取措施实现期望状态,例如,在具有未使用计算资源的机器上启动新POD。

Spark应用程序由单个驱动程序进程(也称为"主程序")和可变数量的执行器("工作人员")组成。在Kubernetes上执行时,驱动程序和执行程序都作为单独的pod执行,分两步启动:首先,Spark客户端启动驱动程序pod,然后驱动程序吊舱本身启动执行器吊舱。

国内高防cdn_ddos防御多少钱_免费测试

此设计的优点是驱动程序本身负责管理其执行器,例如,为了动态扩展集群。然而,这种设计决策有一个关键的缺点:在驱动程序成功启动之前,调度器不知道驱动程序需要多少执行器。这在资源丰富的集群中不会造成问题,但是当集群对于Spark提交的数量来说"太小"时,理论上客户端可能会使集群中充满驱动程序。在这种情况下,没有一个驱动程序会获得执行器,因此无法完成任何工作。在实践中,我们观察到该问题的一个更本地化的版本:偶尔,不幸运的应用程序会导致执行器不足,导致不可预测的性能下降。

此外,因为来自不同Spark应用程序的POD是单独安排的,ddos攻击检测及防御,并且(相对)以任意顺序安排的,小型应用程序有可能跳到大型应用程序之前。这导致了更大、更昂贵的工作负载中更高的资源匮乏率,以及随后的性能下降或故障。让我们看一个简单的例子:

国内高防cdn_ddos防御多少钱_免费测试

示例:将启动两个应用程序,A(蓝色)和B(粉色)。请注意,不同应用程序的驱动程序和执行程序的POD可能以任意顺序出现,例如,执行程序A.3出现在驱动程序B之后。假设集群有足够的空闲资源来为驱动程序A、执行程序A.1和A.2以及驱动程序B启动POD。群集现在可能没有足够的资源用于昂贵的执行器A.3,但有足够的资源用于较便宜的执行器B.1。因此,较便宜的应用程序B成功启动,而较昂贵的应用程序A仍在等待执行器A.3才能取得进展。

帮派调度。Spark应用程序更理想的行为是组调度。我们希望逐个应用程序启动pods应用程序,而不是逐个pod进行调度: