目录

Spark2.4-Dynamic-Resource-Allocation

概述

因为有计划将 K8S 上的 Spark 2.2 升级到更新的版本,关于动态资源扩展,是一个比较关心的问题。

Comparison

先看看目前 Spark 2.4.3 里 KubernetesClusterSchedulerBackend 是怎么写的。

/spark2.4-dynamic-resource-allocation/image_1dcmhocdohi9urj145v1l3l1dk59.png

所以说,这部分的工作在是在 Feature Work 里的,不知道 3.0 会不会有?

再来看看 Spark on K8S 分支上的。

/spark2.4-dynamic-resource-allocation/image_1dcmhupoo8a5e2cefs3f1ahgm.png

看看 Spark on K8S 文档里,关于实现的设计。KubernetesExternalShuffleService 可以允许 Spark 进行动态资源分配的模式。 Executor 上的 Shuffle 服务可以把文件持久化,这样在进行 scale up 的操作的时候,这些计算文件就不会丢失了。其设计是通过在每个 node 节点上,通过 K8S 的 DaemonSet 来运行这个 shuffle 服务。

Shuffle 服务的 Pod 和 Executor Pod 通过 hostPath 共享磁盘,这样需要每个 Executor 必须知道相同 Node 上的 shuffle 服务 Pod 的 IP 地址。

1
2
spark.kubernetes.shuffle.service.labels
spark.kubernetes.shuffle.namespace

通过指定这两个参数,KubernetesClusterSchedulerBackend 可以配置 Executor Pod 连接同一个 Node 节点上 shuffle 服务。此外 KubernetesExternalShuffleService 还实现了 K8S 的 Watch 等 API,用于错误检测,并且可以在错误发生的时候删除无效文件。

总结

所以说,升级的时候需要谨慎,目前 2.2 是支持 Dynamic Resource Allocation 的,但是自从 2.3 可以支持基础 K8S 功能,目前相关 Feature 还在开发中,有兴趣的同学可以留意一下这个 JIRA

/spark2.4-dynamic-resource-allocation/image_1dcnhcuf21h9klcg184ebnrh3j13.png
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。