6

这场Spark、Dask、Vaex、Pandas的正面交锋,谁赢了?

 3 years ago
source link: https://baijiahao.baidu.com/s?id=1671080188522713952&wfr=spider&for=pc
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

这场Spark、Dask、Vaex、Pandas的正面交锋,谁赢了?

发布时间: 20-07-0217:04鲲鹏计划获奖作者,优质科技领域创作者

全文共3924字,预计学习时长15分钟

94cad1c8a786c917295c7d66aa5f98c93ac757fe.jpeg?token=5f5c8feaec713754ac8547a3ba192768图源:unsplash

新的数据科学问题席卷而来时,首要问题是使用何种技术。广告宣传、标准工具、尖端技术、整个平台和现成的解决方案,都是备选项。

过去的几年里,笔者尝试使用各项技术来构建概念证明和解决方案。笔者注册试用新平台、试用任何大型云平台发布的新功能。当一项新技术出现时,笔者必然会浏览一些教程并在个人数据集上试用。

笔者决定比较各项数据整理技术,以便为下一个项目选择最适合表格式数据探索、清洗和整理的技术。笔者也以此为契机,重新接触了好几年没有使用过的技术。随着时间的推移,这些技术已优化很多。

TL;DR

Vaex作为新型大数据技术正在崛起。如果用户已在使用PySpark平台或已拥有PySpark人才,这仍是一个不错的选择。

下文中,笔者假设读者对Python API和大数据功能有基本的掌握程度。我选取了Taxi数据集的10亿行数据,容量有100GB。目标是比较这些技术的API、性能和易用性。笔者认为Pandas是API的基准(确实承认该说法存在争议的),因为Pandas是目前最常见的解决方案,但不能处理大数据。

程序员有两种处理大数据集的传统方式/方法:一种是更强大的/分布式计算,使内存与数据大小相匹配;另外一种是核外方法,即只有在必要时才在内存中读取数据。二者成本差异巨大,因此,笔者决定只考虑核外计算的解决方案。

0eb30f2442a7d9333eb17b7fcc29391573f0010e.jpeg?token=8380e8fef4e2853b1921e74a5429b693图源:unsplash

竞争产品:

· Koalas —Apache Spark 上的Pandas API。

· Vaex —一个用于延迟外核数据帧的Python库。

· DaskDataFrame —一款用于分析的灵活并行计算库。

· PySpark —一款基于Spark的用于大规模数据处理的统一分析引擎。

· Turicreate —一个相对私密的机器学习包,其数据框架结构为符合标准的SFrame。

· Datatable — H2O无人驾驶AI的支柱。它是一个数据帧包,特别强调单节点速度和大数据支持。

· Vaex确实具有GPU和numba支持,但笔者没有进行基准测试。

· Pandas —Pandas具有分块功能,但在探索和动态交互方面,它与其他工具不同。

· cuDF (RapidAI) — GPU数据框软件包是一个刺激的概念。对于大数据,必须使用带有Dask的分布式GPU来匹配数据大小,适合无底洞。

· H2O — 标准的内存数据框架是全面的。尽管如此,根据集群是数据集四倍大小的建议,用户需要有足够的资金利用H2O进行勘探和开发。它另一个GPU版本也有相同的问题。

· Modin —一种在不更改后台使用Dask或 Ray的API情况下缩放Pandas的工具。然而目前它只能读取一个镶木地板文件,而笔者已拥有一个分块的镶木地板数据集。程序员们有望通过Modin获得与Dask数据帧类似的结果,所以此时将所有镶木地板文件合并不是最佳选择。

笔者在AWS Sagemaker上使用了一个0.95美元/小时的ml.c5d.4xlige实例,可以轻松复制基准。它有16个vcpu,32GB的RAM加上500个SSD,这与一台固态笔记本电脑有相似之处。

尽管所有竞争产品都可以读取CSV文件,但更优化的方法是使用最适合每种技术的二进制版本。

对于PySpark、Koalas和Dask数据帧,我使用了Parquet,而对于Vaex,笔者使用了HDF5。Turicreates的SFrame具有特定的压缩二进制版本。Datatable是jayformat优化的一种特殊情况。

尽管无法用Datatable读取CSV文件,但Maarten Breddels还是破解了一种使用HDF5的方法,无论实例大小(即使在RAM中的数据大小是原来的两倍多)。当Datatable能够可靠地读取多个CSV、Arrow或Parquet文件时,最好对工具进行更新。

笔者想指出的是,该基准测试的开发成本有点昂贵,技术在运行几个小时后多次崩溃。

编码复杂度:只需关注API,就能了解每种技术的代码量和设计模式。

94cad1c8a786c9173da3493aaa5f98c93ac757fd.jpeg?token=e028ffec8192d391d4ad6fc6f08ca4ee

优胜者:Vaex,Dask DataFrame,Turicreate和Koalas的代码非常类似于Pandas代码(Koalas和Pandas代码一样),用户可以轻松完成任何事情。

淘汰者:PySpark和Datatable具有自己的API设计,用户必须学习和调整这些API。这项任务并不艰巨,但如果你习惯使用了Pandas,这是一个限制。

优胜者:PySpark / Koalas和Dask DataFrame提供了各种各样的功能。注意,在某些复杂情况下使用PySpark时,用户可能需要“ map-reduce”知识来编写算法以实现特定需求。

使用Dask DataFrame,用户需要知道何时可以或不能使用sklearn功能,该功能无需占用大量内存即可扩展。虽然Vaex和Turicreate缺少一些特定功能,但它们涵盖了大多数核心功能。

淘汰者:Datatable的功能似乎还不成熟,而且远远落后于其他竞争者。

9213b07eca806538997218b7f5bf4942ac348267.jpeg?token=1b4cd144df87dff02d47e511d1b34fa5图源:unsplash

通常,在为机器学习和后端API构建解决方案时,用户需要对流程进行编程。例如,在对列进行归一化时,需要记住均值和标准差以对新观察值进行归一化。此时,简单性,灵活性和代码简洁性至关重要。对于许多数据科学应用程序来说,该任务可能占据整项工作的80%。

优胜者:Vaex。借助自身表达系统,Vaex对数据集的任何转换都将保存在后台,以便用户可以轻松地将其应用于新数据。这使得学习管道轻松化,管道运行实际上是在进行一项无任务导向的事情。

其次是Dask DataFrame,它具有各种预处理工具。但可能需要运行转换器,并考虑可以有效处理哪些sklearn转换器。

接下来是PySpark。即使构建管道是PySpark的强项之一,用户需要编写很多代码才能实现该任务。不利于PySpark的另一件事是,模型和管道的安装和部署绝非易事。你肯定需要(或倾向于)昂贵的平台(例如Databricks和Domino),或严重依赖Sagemaker,Dataproc或Azure的基础结构。

淘汰者:Koalas,Turicreate和 Datatable

Turicreate and Datatable不具备管道功能。尽管Koalas具有比PySpark更好的API,但对在创建管道方面相当不友好。用户可以轻易将Koalas转换为PySpark数据帧并快速返回,但是对于管道功能而言,这很繁琐,并且会带来各种麻烦。

惰性计算是一项功能,仅在需要时才运行计算。例如,如果我有两列A和B,则创建新的A * B列实际上需要0秒且没有内存。如果我想查看该列的前几个值,则仅计算那些值即可,而无需计算整个列。

惰性计算提速并简化了使特征工程和其勘察过程,并防止了在内存中存储其他庞大的列数据。处理大型数据集时,例如设计新列,连接表或筛选太大而无法放在内存中的数据时,惰性计算的价值功能则相当明显,因为普通计算可能会导致计算机崩溃。

从性能角度来说,你会在下一节看到笔者创建了一个新列,然后计算了平均值。Dask 数据帧花费的时间比其他技术长10到200倍,笔者认为此功能没有得到很好的优化。不幸的是,尽管Koalas支持,但PySpark不支持惰性评估。

64380cd7912397ddcf261f493ae05ab1d1a2878d.jpeg?token=f0409dc404bd206322864a29fe9469df图源:unsplash

优胜者:Vaex, Datatable, Koalas和 Turicreate

淘汰者:PySpark和 Dask DataFrame

这里我想误引乔治·博克斯的话:“所有的基准都是错误的,但有些是有用的。”各工具的性能可能会有所不同,笔者受到此博客的启发,将每个基准测试运行两次。考虑到首次运行与成批处理工作更相关(更能指示磁盘读取速度),二次运行更能代表交互工作体验(方法的实际速度)。

在以下所有图表中:

· 蓝色条表示首次运行,橙色条表示二次运行。

· TuricRate具有草图功能,可以同时计算一系列统计和估计;它更适合于统计分析。

· 为了更简洁的名称可视化,我使用别名:“dt”表示Datatable,“tc”表示Turicreate,“spark”表示PySpark,“dask”表示dask DataFrame。

此处,笔者测试了一些基础数据:平均值、标准差、值计数、两列乘积的平均值,创建了一个惰性列并计算其平均值:

0eb30f2442a7d9338b918cb5cc29391572f001a7.jpeg?token=3312fd6febd3729bb0b4ecd0ba535e39

· Vaex处于领先地位。

· Koalas得到了与PySpark相似的结果,这是合理的,因为它在后台使用了PySpark。

· Dask数据帧、Turicreate和Datatable性能相对落后。

笔者在两列上使用均值和标准差进行分组,然后将其加入原始数据集并计算行数,这样就不必处理内存中的整个合并数据集。笔者还运行了一个超级繁琐复杂的数学表达式,以探索冗长特征工程的过程影响。

b999a9014c086e0646d9703e606a93f20ad1cb3f.jpeg?token=4f941430263f1e097048834c0aa670a2

· Vaex在连接方面做得很好,它使图形失真。

· Datatable在连接方面表现出色。此结果可能与我用HDF5包装数据表的方式有关。我没有加入所有的字符串列,这导致数据帧的占用空间更少。因此它是黑马,第二名!

· Dask DataFrame和Turicreate再次落后。

注意,当我在一个新创建的列上运行连接时,除了Vaex之外的所有技术都崩溃了,在规划特征工程时要考虑到这一点。

可以看到,Dask DataFrame和Turicreate性能落后,Vaex赢得了绝对的胜利。

此处,笔者首先过滤数据并重复上述操作。此时Koalas,Datatable和Turicreate崩溃了。这些结果很好地体现了数据清洗性能。

18d8bc3eb13533fa6c5ad0d1cbb1151943345bce.jpeg?token=b856a44b0d77ddf046a55671165e5c39

· 在大多数情况下,尤其是在第二轮比较中,Vaex似乎占了上风。

· Dask数据帧并未崩溃,因此获得了荣誉称号,但结果比Vaex和PySpark慢5到100倍。

下面是列表结果:

· 结果以秒为单位。

· 缺少结果的地方,技术崩溃了。

· 小于一秒的值表示惰性计算。

· 交互式表格。

4ec2d5628535e5dd1e1fd57f14a44fe9cf1b62cc.jpeg?token=138c63a42a75ea0a7c0156c5325b90ea

优胜者:Vaex明显胜利,亚军是PySpark和Koalas

淘汰者:Dask DataFrame,Turicreate和Datatable

此代码允许用户比较API并自己运行基准测试。所有数据集都可以以正确的二进制格式下载。我在使用Dask 数据帧时遇到了种种问题,为了获得最佳性能,我竭尽全力重新启动内核,并在进行一些计算之前重新读取了数据。

尽管过程很不愉快,但我还是尽了最大努力来获得最佳性能。如果仅按原样运行笔记本,则可能要等待几个小时,不然可能会崩溃。正如预期的那样,Koalas和PySpark的结果非常相似,因为它们都在后台使用Spark。

如前所述,我无法对文件中未保留的新创建列应用测试,因为这会使Dask 数据帧和PySpark崩溃。为了解决这个问题,我进一步计算了结果的平均值或计数,以强制使用单个值。我没有使用任何字符串列,这是因为破解Datatable对字符串列不起作用。

(免责声明:我本人认识Turicreate的创建者之一,Spark的撰稿人和Vaex的主要开发人员,但我尽可能地保持公正去发表看法。)

728da9773912b31b3153c6cde47ade7cdbb4e184.jpeg?token=4b8a992da5a426f3d4c169cb0ea06252图源:unsplash

自从Turicreate开源以来,笔者一直在使用Turicreate作为它的首选软件包,而在此之前,笔者一直使用PySpark,现在已改成Vaex。尽管状态还处于起步阶段,还有些粗糙,但是表达式和状态转移减少了因不常用功能而形成的代码浪费,提升了编码速度。

笔者对PySpark和Koalas的出色表现感到惊讶,但设置问题、使用非现有平台部署解决方案、管道问题、开发过程中无法解释的错误(以及常见的PySpark API问题)等麻烦依然存在。

Dask 数据帧是一个高难度挑战。它崩溃了无数次,笔者经历了多次考验,以使其在性能上更具竞争力。

概言之,在基准测试开发过程中,PySpark和Dask DataFrame是时间成本最高、价格成本最大的。

a2cc7cd98d1001e9d5becfac013493ea55e79751.jpeg?token=17135bdc2bbe3a5422fca4824852d4fe

留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

举报/反馈

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK