我们知道目前在spark on k8s的官网中,这里有两项很明显的future work。
- 动态资源分配和外部的shuffle serivce
- 任务队列以及资源管理
也就是说,目前这两项spark还是不支持的,借助于广大社区的力量,各个大厂都提出了自己的开源方案
外部的shuffle service通过RSS(remote shuffle service)来解决
关于RSS可以参考spark remote shuffle service(RSS)杂谈, 简短的解释一下:在yarn中 动态资源分配是需要通过外部的shuffle service来实现的(目前也可以不基于外部的shuffle service。具体参考SPAKR-27963),而在hadoop的时代,是可以通过在yarn上开启shuffle service的,也就是说在每个节点上开启shuffle service,spark的shuffle RDD的中间结果就会保存在yarn的nodeManager上,这样每个executor空闲了以后就不需要等待job运行完了才释放executor,这样就会释放yarn的资源,因为shuffle RDD的中间结果是保存在了nodeManager上,下一个spark task需要的时候就可以从nodeManager上拉取,但是这对于kubernetes是不适合的,因为spark的executor是运行在pod上的,pod的如果摧毁了,中间结果也就不存在了。所以就引入了RSS,把中间结果存储专门的集中的shuffle service上来解决这个问题,(当然如果不开启动态资源分配,shuffle的中间结果,也会存在pod上,但是存储的路径是/var/lib,这是个系统盘,最好是进行磁盘的挂载)对于任务队列以及资源管理
我们知道spark on yarn的时候我们的任务是跑在yarn上的,那队列的分配肯定是由yarn这个资源管理框架来做啊,所以kuberentes社区也提出了YuniKorn调度器,这个调度器的功能其实就是为了满足批任务和服务部署的需求,具体的可以参考spark on k8s:apache YuniKorn(Incubating)的助力,
其实这个任务调度器的提供了不仅仅任务队列和资源管理的作用,当然该调度器还是处于孵化阶段,好多功能有待提高和完善。