您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

分布式计算哪家强:Spark、Dask、Ray大比拼

时间:2023-05-21 11:54:47  来源:  作者:Java学研大本营

介绍三个最主流的分布式计算框架Apache Spark、Dask和Ray的历史、用途和优缺点

以便了解如何选择最适合特定数据科学用例的框架。

1 历史

1.1 Apache Spark

Spark是由Matei Zaharia于2009年在加州大学伯克利分校的AMPLab启动的。这个项目的主要目的是加快分布式大数据任务的执行,在那个时候,这些任务是由Hadoop MapReduce处理的。MapReduce在设计时考虑到了可扩展性和可靠性,但性能和易用性一直不是它的强项。MapReduce需要不断将中间结果存储到磁盘,这是Spark要克服的关键障碍。Spark通过引入弹性分布式数据集(RDD)范式,并利用内存缓存和惰性计算的优势,能够比MapReduce减少几个数量级的延迟。这使Spark确立了其作为大规模、容错、并行化数据处理的事实标准的主导地位。该项目通过添加GraphX(用于分布式图形处理)、MLlib(用于机器学习)、SparkSQL(用于结构化和半结构化数据)等功能得到进一步加强。 值得注意的是,Spark是用Scala编写的,后来又增加了对Python/ target=_blank class=infotextkey>Python和R的支持,因此与它互动一般不会有Pythonic的感觉。理解RDD范式和Spark中的工作方式需要一点时间来适应,但这对任何熟悉Hadoop生态系统的人来说通常不是问题。

1.2 Dask

Dask是一个用于并行计算的开源库,它在2015年发布,所以与Spark相比,它相对较新。该框架最初是由Continuum Analytics(现在的Anaconda Inc.)开发的,他们是许多其他开源Python包的创造者,包括流行的Anaconda Python发行。Dask的最初目的只是为了将NumPy并行化,这样它就可以利用具有多个CPU和核心的工作站计算机。与Spark不同,Dask开发中采用的最初设计原则之一是 "无发明"。这一决定背后的想法是,使用Dask的工作应该让使用Python进行数据分析的开发者感到熟悉,而且升级时间应该最小。根据其创造者的说法,Dask的设计原则经过多年的发展,现在正被开发成一个用于并行计算的通用库。

最初围绕并行NumPy的想法得到进一步发展,包括一个完整而轻量级的任务调度器,可以跟踪依赖关系,并支持大型多维数组和矩阵的并行化。后来又增加了对Pandas DataFrames和scikit-learn并行化的支持。这使该框架能够缓解Scikit中的一些主要痛点,如计算量大的网格搜索和太大无法完全容纳在内存中的工作流程。最初的单机并行化目标后来被分布式调度器的引入所超越,这使Dask能够在多机多TB的问题空间中舒适地运行。

1.3 Ray

Ray是加州大学伯克利分校的另一个项目,其使命是 "简化分布式计算"。Ray由两个主要部分组成--Ray Core,它是一个分布式计算框架,而Ray Ecosystem,广义上讲是一些与Ray打包的特定任务库(例如Ray Tune--一个超参数优化框架,RaySGD用于分布式深度学习,RayRLib用于强化学习,等等)。

Ray与Dask类似,它让用户能够以并行的方式在多台机器上运行Python代码。然而,与Dask不同的是,Ray并不模仿NumPy和Pandas的API--它的主要设计目标不是为数据科学工作做一个落地的替代品,而是为Python代码的并行化提供一个通用的低层次框架。Ray更像是一个通用的集群和并行化框架,可以用来构建和运行任何类型的分布式应用。由于Ray Core的架构方式,它经常被认为是一个构建框架的框架。也有越来越多的项目与Ray集成,以利用加速的GPU和并行计算。 spaCy、Hugging Face和XGBoost都是引入Ray互操作性的第三方库的例子。

2 选择正确的框架

这里没有简单明了的方法来选择 "最佳 "框架,就像每个复杂的问题一样,答案在很大程度上取决于我们具体工作流程中的背景和许多其他因素。我们需要逐个看看这三个框架,分析它们的优劣势,同时考虑到各种常见的使用情况进行选择。

2.1 Spark

优点:

成熟稳定:Spark 的原始版本发布于2014年5月,是比较成熟的技术。 商业支持:大量的公司提供商业支持/服务。 处理大数据集:适用于针对大型数据集进行数据工程/ ETL 类型的任务。 提供高级 SQL 抽象层(Spark SQL)。 弊端:

需要学习新的执行模型和API,学习曲线陡峭。 调试困难。 复杂的架构,仅靠IT部门很难维护,因为适当的维护需要了解计算范式和Spark的内部运作(如内存分配)。 缺少丰富的数据可视化生态系统。 没有内置的GPU加速,需要RAPIDS加速器来访问GPU资源。

2.2 Dask

优点:

纯Python框架,非常容易上手。 直接支持Pandas DataFrames和NumPy数组。 通过Datashader轻松实现对数十亿行的探索性数据分析。 提供Dask Bags--它是PySpark RDD的Python版本,具有map、filter、groupby等功能。 Dask能够带来令人印象深刻的性能改进。 2020年6月,Nvidia使用RAPIDS、Dask和UCX在16个DGX A100系统(128个A100 GPU)上进行TPCx-BB测试,取得了惊人的结果。但是,需要谨慎对待,因为2021年1月,TPC强制Nvidia将该结果下架,因为它们违反了TPC的公平使用政策。 弊端:

缺乏商业支持(但有几家公司已开始在此领域的工作,例如Coiled和QuanSight)。 没有内置的GPU支持,依赖于RAPIDS进行GPU加速。

2.3 Ray

优点:

最小的集群配置 最适合于计算密集型工作负载。已经有证据表明,Ray在某些机器学习任务上的表现优于Spark和Dask,如NLP、文本规范化和其他。此外,Ray的工作速度比Python标准多处理快10%左右,即使是在单节点上也是如此。 因为Ray正被越来越多地用于扩展不同的ML库,所以你可以以可扩展的、并行的方式一起使用所有的ML库。另一方面,Spark将你限制在它的生态系统中可用的框架数量明显减少。 独特的基于actor的抽象,多个任务可以在同一个集群上异步工作,从而实现更好的利用率(相比之下,Spark的计算模型不太灵活,基于并行任务的同步执行)。 弊端:

相对较新(2017年5月首次发布)。 不太适合分布式数据处理。Ray没有用于分区数据的内置原语。该项目刚刚引入了Ray Datasets,但这是一个全新的补充,仍然非常新且基础。 对GPU的支持仅限于调度和预留。由远程函数来实际利用GPU(通常通过外部库,如TensorFlow和PyTorch)。 从这三个框架的优缺点出发,我们可以提炼出以下选择标准:

如果工作负载是以数据为中心的,主要是ETL/预处理方面的工作,那么我们最好选择Spark。特别是如果该组织拥有Spark API的机构知识。 Dask/Ray的选择并不那么明确,但一般的规则是,Ray旨在加速任何类型的Python代码,而Dask是面向数据科学特定的工作流程。 为了让事情变得更加复杂,还有Dask-on-Ray项目,它允许你在不使用Dask分布式调度器的情况下运行Dask工作流。 为了更好地理解Dask-on-Ray试图填补的空白,我们需要看一下Dask框架的核心组件。这些是集合抽象(DataFrames,数组等),任务图(DAG,表示类似于Apache Spark DAG的操作集合),以及调度器(负责执行Dask图)。分布式调度器是Dask中可用的调度器之一,它负责协调分布在多台机器上的若干工作进程的行动。这个调度器很好,因为它设置简单,保持最小的延迟,允许点对点的数据共享,并支持比简单的map-reduce链复杂得多的工作流。另一方面,分布式调度程序并非没有缺点,它的缺点包括:

它是一个单点故障--分布式调度器没有高可用性机制,因此如果它发生故障,整个集群需要重置,所有正在进行的任务都会丢失。 它是用Python编写的,这使得它易于安装和调试,但也会引入通常与Python搭配使用的标准性能考虑因素。 Client API是为数据科学家设计的,并不适合从高可用性的生产基础设施中调用(例如,它假定客户是长期存在的,可能从Jupyter会话中与集群一起工作)。 它对有状态执行提供的支持很少,所以很难实现容错的流水线。 它可能会成为瓶颈,并且不能本地扩展。 相比之下,容错和性能是深深嵌入Ray调度器设计中的原则。它是完全分散的(没有瓶颈),提供更快的数据共享(通过Apache Plasma),各个调度器是无状态的(容错),支持有状态的Actor等。这使得在Ray集群上运行Dask任务的吸引力非常明显,也是Dask-on-Ray调度器存在的理由。

3 如何做出选择

现在我们已经看过了Spark、Dask和Ray的优缺点--并简要讨论了Dask-on-Ray混合解决方案,很明显这不是“一刀切”的情况。这三个框架从一开始就有不同的设计目标,试图把根本不同的工作流程硬塞到其中一个框架中不是最明智的选择。更好的方法是以灵活性为基础设计数据科学流程和相应的基础架构,最好能够让您启动并使用适合工作的正确工具。一个典型的流程可能涉及在Spark中进行一些类似ETL的数据处理,然后在Ray中执行机器学习工作流。提供自由度以控制、容错和按需方式运行两个框架,使数据科学团队能够利用两个框架的优势。

从Spark(DataFrames)到Ray(分布式训练)再返回到Spark(Transformer)的流程的高级概述。Ray Estimator在Spark Estimator接口中封装了这种复杂性。

混合使用框架的重要性已经显而易见,因为出现了使这种跨框架通信更加简化的集成库。例如,Spark on Ray正是这样做的--它 "结合了你的Spark和Ray集群,使你可以轻松地使用PySpark API进行大规模数据处理,并无缝地使用这些数据来使用TensorFlow和PyTorch训练你的模型。"还有Ray on Spark项目,它允许我们在Apache Hadoop/YARN上运行Ray程序。这种方法也已经成功地在实际生产工作负载中得到了测试。例如,Uber的机器学习平台Michelangelo定义了一个Ray Estimator API,该API抽象了终端用户在Spark和Ray之间移动的过程。Uber工程公司最近的出版物中详细介绍了这一点,该出版物涵盖了涉及Spark和XGBoost在Ray上的分布式训练的架构。

4 总结

在这文中,我们介绍了三种最流行的并行计算框架。我们讨论了它们的优缺,并给出了一些关于如何为手头的任务选择正确框架的一般性指导。推荐的方法不是寻找适合所有可能的需求或用例的终极框架,而是理解它们如何适合各种工作流程,并拥有一个灵活的数据科学基础架构,使该基础设施允许采用混合和匹配方法。



Tags:分布式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: 分布式  点击:(47)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: 分布式  点击:(39)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03  Search: 分布式  点击:(50)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  Search: 分布式  点击:(58)  评论:(0)  加入收藏
分布式事务框架选择与实践
分布式事务是处理跨多个服务的原子操作的关键概念,而选择适合应用场景的框架对于确保事务一致性至关重要。以下是几个常见的分布式事务框架,并讨论它们的使用和实践。1. XA协...【详细内容】
2024-01-05  Search: 分布式  点击:(96)  评论:(0)  加入收藏
分布式场景下的事务机制
事务消息是RocketMQ的一个非常特色的高级特性,它的基础诉求是通过RocketMQ的事务机制,来保证上下游的数据⼀致性。我们在单机版本下面只需要在业务方法上加上对应的事务就可以...【详细内容】
2023-12-26  Search: 分布式  点击:(120)  评论:(0)  加入收藏
分布式存储系统在大数据处理中扮演着怎样的角色?
如果存储节点本身可以定制,则通常会让其支持部分计算能力,以利用数据的亲和性,将部分计算下推到相关的存储节点上。如果存储是云上的 S3 等对象存储,无法定制,则通常会将数据在计...【详细内容】
2023-12-19  Search: 分布式  点击:(48)  评论:(0)  加入收藏
MongoDB与大数据处理:构建高性能分布式数据库
MongoDB是一种非关系型数据库,具有高度灵活性和可扩展性。在处理大量数据时,索引的优化是提升查询性能的关键。下面将介绍一些MongoDB索引优化的指南,帮助用户更好地利用索引来...【详细内容】
2023-12-18  Search: 分布式  点击:(71)  评论:(0)  加入收藏
聊一聊雪花算法与分布式ID生成
生成全局唯一ID的雪花算法原理雪花算法是一种用于生成全局唯一ID的算法,最初由Twitter开发,用于解决分布式系统中生成ID的问题。其核心思想是将一个64位的长整型ID划分成多个...【详细内容】
2023-12-12  Search: 分布式  点击:(132)  评论:(0)  加入收藏
Redis分布式锁常见坑点分析
日常开发中,基于 Redis 天然支持分布式锁,大家在线上分布式项目中都使用过 Redis 锁。本文主要针对日常开发中加锁过程中某些异常场景进行讲解与分析。本文讲解示例代码都在 h...【详细内容】
2023-12-11  Search: 分布式  点击:(111)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条