不知道为什么会推送给我一个三年前的挖坟的问题?我试着从调度的角度来分析一下Spark和Ray的区别。
调度是计算机系统核心,从各个层次上都有调度的问题需要去处理,微架构层面的指令调度、OS层面的线程调度、集群层面的任务调度等等;Spark和Ray作为分布式应用的开发和运行框架,核心使命其实也是把调度做好,让应用的任务在集群上跑的快、资源利用率高,还有容错性,但是应用调度的需求其实还是差异性很大的,一个单一的框架很难满足所有的需求,从大的层面看,应用调度可以分为两个阶段,首先是任务的编排和优化,然后是任务的调度执行,下面试图从这两个角度来分析一下不同的框架有什么样不同的策略,然后再看一下Spark和Ray有什么区别:
任务的编排和优化
总体而言可以分为两类:静态的编排和动态的编排
- 静态的编排和优化:任务执行前,通过编译和优化技术进行全局的编排;编排和优化可以基于代价模型,也可以基于rule。典型的案例,数据的SQL优化就是一个基于代价的优化,AI框架的静态图更加偏向与基于rule的优化。
- 动态的编排和优化:没有提前的编排,执行过程就是任务的编排过程,典型的如AI框架的动态图、传统HPC程序的模式(MPI/OpenMP)。
这两种模式各有优缺点,静态的方式非常利于优化,但是问题在于不容易处理动态的情况,比如有些任务需要根据执行结果进行动态调度,另外一个问题是如果是一个非常长的任务,执行前的编译优化需要耗时;而动态方式的优缺点恰好相反。
任务的调度执行
总体而言可以分为三类:中心化调度(集中调度)、去中心化调度、变种(中心化和去中心化调度结合)
- 中心化调度:编排好的任务由Master来动态决定在哪个节点上执行,Master的调度策略可以有很多选择,比如计算资源的多少,数据locality等等;Spark是一个典型的使用中心化调度策略的框架。
- 去中心化调度:没有一个集中的master进行任务执行的调度,也可以认为任务在执行前提前完成与资源的映射,各个节点独立进行任务调度执行,任务间通过消息或者共享内存进行交互;传统的MPI编程模型是典型的去中心化调度,AI框架一般也走这条路线。
这两种模式也是各有优缺点,中心化调度能最大化利用系统资源,并提供一定的动态性和容错性,即如果发现有节点down了,可以进行任务重分配,但是缺点是调度开销大,试想一下一个HPC程序运行在千级甚至万级节点上,如果都通过master去调度执行任务的话,调度开销估计远比执行开效大;而去中心化调度的优缺点恰好相反。
业界也在想各种变种(中心化与去中心化调度结合)试图同时获得两者的优点,举两个例子:
- 多Master+乐观策略:中心化调度有master的瓶颈,能否提供多个master?同时各个master在进行资源分配的时候采用乐观策略,调度的时候不进行全局同步,先进行资源分配,如果发现有冲突再进行回退,各个master的资源状态的同步通过lazy的方式进行。
- 先local再全局:优先在local分配资源,发现资源不够再到全局寻找空闲资源,每个节点都可以做master,资源信息通过全局共享内存进行记录。Ray的调度执行策略本质上与此类似,由于每个节点都可以是master,实际上资源的ownership形成了树状关系,个人认为这也是Ray的复杂性所在(当多个任务一起执行的时候,整体资源管理和负载均衡是非常复杂的)。
回到Spark和Ray的区别
从技术上很容易看到,Spark与Ray走的是截然不同的路子:
- Spark:静态的编排和优化+中心化的调度,利于执行优化和资源利用。
- Ray:动态编排(表面上是分布式RPC框架,但是多个RPC调用其实是形成了一张动态图)+树状的递归调度(去中心化和中心化结合的调度),利于灵活的编程以及低时延的调度。
从这个角度看,Spark去做大数据的处理有一定的道理,任务比较固定/单一任务运行时间长(适合做优化),任务处理实时性要求不高(调度开销不敏感),成本要求低;
而Ray的定位是分布式应用框架,我们想它可能的应用领域:
- 数据科学领域的分布式胶水:提供可编程的调度能力,利用其动态能力,把多个框架粘合起来,比如强化学习,里面有不少动态的任务,Ray结合AI框架做了些尝试
- AI和科学计算的框架:AI/科学计算领域其实目前大量使用了动态图/静态图+去中心化调度的模式,性能上Ray还看不到优势,灵活性上或许可以结合。
- 企业应用:企业应用其实有大量分布式RPC的场景,但是Ray主要在Python领域发力,大家知道Python主要的应用场景在数据科学(数据分析/AI/科学计算)和运维这两个领域,企业应用主要还是使用Java/Go等,所以Ray好像也很少有企业应用的案例。
来源:知乎 www.zhihu.com
作者:金雪锋
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。
点击下载
此问题还有 14 个回答,查看全部。
延伸阅读:
算法研发工作中对于MPI和Spark的一些困惑?