超越Pandas:Spark,Dask,Vaex和其他大数据技术并肩作战

十亿行数据集的API和性能比较。 你应该用什么?

... > Photo by Pietro Mattia on Unsplash

为什么

面对新的数据科学问题时,首先要问的问题是要使用哪种技术。 有炒作; 有标准工具; 有最先进的技术,整个平台和现成的解决方案。

在过去的几年中,我一直在尝试使用我可以使用的任何技术来构建概念和解决方案的证明。 如果有新平台,我将注册试用; 如果任何大型云平台发布了一项新功能,我都会尝试一下; 并且当一种新技术出现时,您可以确定我会完成一些教程,并在我的数据集上进行尝试。

从这个角度来看,我决定比较数据整理技术,以便为我的下一个项目选择最适合表格数据探索,清理和整理的技术。 我还以此为契机,重新接触了我几年没有使用过的技术,我认为随着时间的推移,这种技术会越来越好。

TL; DR

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

什么

在下面的内容中,我假定您基本掌握Python API和大数据功能。 我选择的数据是Taxi十亿行100GB数据集。 目的是比较技术的API,性能和易用性。 我认为Pandas是拥有最自然的API(我承认这是有争议的)的基准,因为它是迄今为止最常见的解决方案,但不能处理大数据。

您有两种处理大型数据集的常规方法/方式:更强大/分布式的计算,可以使内存与数据的大小匹配,或者是核心以外的解决方案,其中仅在必要时才在内存中读取数据。

成本差异巨大,因此,我只决定考虑可以在核心以外使用的解决方案。

竞争对手:

· Dask DataFrame —灵活的并行计算库,用于分析。

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

· Koalas-Apache Spark上的Pandas API。

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

· Turicreate-具有数据框结构的相对隐秘的机器学习程序包-SFrame,符合条件。

· 数据表-H2O的Driverless.ai的骨干。 一个数据帧包,特别强调单个节点的速度和大数据支持。

一些荣誉的提及:

· H2O —标准的内存数据框架是全面的。 尽管如此,在建议的集群大小是数据集大小的四倍的情况下,您仍然需要大量资金才能将其用于勘探和开发。 它还具有继承相同问题的GPU版本。

· cuDF(RapidAI)— GPU数据框包是一个令人兴奋的概念。 对于大数据,必须使用带有Dask的分布式GPU来匹配您的数据大小,非常适合无底洞。

· Modin —缩放Pandas的工具,无需更改在后端使用Dask或Ray的API即可。 可悲的是,此时,它只能读取单个镶木地板文件,而我已经拥有分块的镶木地板数据集。 有望获得与Dask DataFrame相似的结果,此时似乎不值得将所有实木复合地板文件合并到一个文件中。

· Pandas-Pandas具有分块功能,但对于探索和动态互动,它与其他人不在同一个联盟中。

· Vaex确实有GPU和numba支持大量计算,而我没有进行基准测试。

怎么样做的

我在AWS Sagemaker上使用了每小时0.95 USD的ml.c5d.4xlarge实例,因此可以轻松复制基准。 它具有16个vCPU,32 GB的RAM和500个SSD,与坚固的笔记本电脑有点相似。

尽管所有竞争对手都可以读取CSV文件,但是一种更优化的方法是使用最适合每种技术的二进制版本。 对于PySpark,Koalas和Dask DataFrame,我使用Parquet,而对于Vaex,我使用HDF5。 Turicreates的SFrame具有特定的压缩二进制版本。 Datatable是为jay格式优化的特殊情况。 尽管我无法使用Datatable读取CSV文件,但无论我的实例大小如何(即使RAM中的数据大小也超过两倍),Maarten Breddels还是采用了HDF5的方法。 当Datatable可以可靠地读取多个CSV,Arrow或Parquet文件时,最好进行更新。

我想指出的是,该基准测试的开发工作有些昂贵,因为技术在运行几个小时后便多次崩溃,尽管按原样运行代码不会破坏您的钱包。

结果

编码复杂度

只看一下API就能使您了解每种技术的代码量和设计模式。

... > Commonly used methods (Image by author)

优胜者-Vaex,Dask DataFrame,Turicreate和Koalas具有非常类似于Pandas的代码(对于Koalas是相同的),您可以轻松地做任何想要的事情。

失败者-PySpark和Datatable具有自己的API设计,您必须学习和调整。 这不是一项艰巨的任务,但是如果您习惯使用Pandas,这将是一个不利条件。

特征

优胜者-PySpark / Koalas和Dask DataFrame提供了各种各样的功能。 请注意,在某些复杂情况下,使用PySpark时,您可能需要" map-reduce"知识来编写适合您需求的算法。 使用Dask DataFrame,您可能需要知道何时可以使用或不能使用无需大量内存即可扩展的sklearn功能。

尽管Vaex和Turicreate缺少一些功能,但它们确实涵盖了大多数核心功能。

失败者-Datatable似乎还不成熟,而且远远落后。

流水线

通常,在为机器学习和后端API构建解决方案时(与可视化不同),您需要对流程进行编程。 例如,在对列进行归一化时,您需要记住均值和标准差以对新观察值进行归一化。 在这里,简单性,灵活性和减少编写代码至关重要。 对于许多数据科学应用程序来说,这可能是80%的工作。

优胜者-Vaex。 藉助其表达系统,对数据集的任何转换都将保存在后台,以便您可以轻松地将其应用于新数据。 这使得流水线不仅轻松,而且实际上是一项非任务。

排名第二的是Dask DataFrame,它具有各种预处理工具。 但是,您可能需要实施变压器,并考虑可以有效处理哪些sklearn变压器。

接下来是PySpark。 即使构建管道是PySpark最适合的方法之一,您也需要编写很多代码才能实现。 使PySpark退缩的另一件事是,模型和管道的安装和部署绝非易事。 您几乎肯定需要(或希望使用)昂贵的平台(例如Databricks和Domino),或严重依赖Sagemaker,Dataproc或Azure的基础结构。

失败者—Koalas,Turicreate,数据表

Turicreate和Datatable没有流水线功能。

尽管Koalas具有比PySpark更好的API,但对于创建管道而言相当不友好。 可以将Koalas转换为PySpark数据框并轻松返回,但是出于流水线处理的目的,这很繁琐,并带来各种挑战。

懒惰评估

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

惰性评估使特征工程和探索的过程更快,更舒适,并防止您在内存中存储其他大量列。 在处理大型数据集时,例如设计新列,联接表或过滤太大而无法容纳在内存中的数据时,这特别有价值,这可能会导致计算机崩溃。

从性能角度看,正如您在下一节中看到的那样,我创建了一个新列,然后计算了平均值。 Dask DataFrame花费的时间比其他技术长10到200倍,因此我认为此功能没有得到很好的优化。

优胜者-Vaex,PySpark,Koalas,Datatable和Turicreate。

失败者-Dask DataFrame。

性能

"所有基准都是错误的,但有些是有用的" –错误引用了乔治·博克斯(George Box)

由于性能可能会有所不同,因此我受此博客的启发,使每个基准测试都运行两次。 我想认为第一次运行与批处理工作更相关(并且更能指示磁盘读取速度),第二次运行更能代表您进行交互工作时的体验(方法的实际速度) )。

在以下所有图形中:

· 第一次运行用蓝色条表示,第二次运行用橙色条表示。

· Turicreate具有"草图"功能,可同时计算大量统计数据和估计值; 更好地进行统计分析。

· 为了更简洁地显示名称,我使用了别名:" dt"表示数据表," tc"表示Turicreate," spark"表示PySpark," dask"表示Dask DataFrame。

基本统计

在这里,我测试了基础知识; 平均值,标准偏差,值计数,两列乘积的平均值,然后创建一个惰性列并计算其平均值。

... > Bigger is better (Image by author)

· Vaex处于领先地位。

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

· Dask DataFrame,Turicreate和Datatable落后了。

繁重的计算

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

... > Bigger is better (Image by author)

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

· 在Join连接时,Datatable表现出色。 此结果可能与我用HDF5包装数据表的方式有关。 我没有包括所有的字符串行,这导致数据框的占用空间大大减小。 但是对我们的黑马来说是甜蜜的第二名。

· Dask DataFrame和Turicreate再次落后。

· 请注意,当我在新创建的列上运行联接时,除Vaex之外的所有技术都崩溃了。 计划要素工程时要考虑到这一点。

当Dask DataFrame和Turicreate落后时,Vaex赢得了绝对的胜利。

筛选

在这里,我首先过滤数据并重复上述操作。

不幸的是,此时考拉,Datatable和Turicreate崩溃了。

这些结果很好地表明了数据清除性能。

... > Bigger is better (Image by author)

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

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

号码

您可以在下面看到列表结果。

· 结果以秒为单位。

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

· 小于一秒的值表示延迟评估。

· 互动。

... > Smaller is better (Image by author)

优胜者-Vaex的明显胜利。

第二名是PySpark和Koalas。

失败者-Dask DataFrame,Turicreate,Datatable。

最后一点

· 该代码使您可以比较API并自己运行基准测试。 所有数据集都可以以正确的二进制格式下载。

· 我在使用Dask DataFrame时遇到了各种各样的问题,为了获得最佳性能,我花了很长时间重新启动内核,并在进行一些计算之前重新读取了数据。 尽管这很不愉快,但我还是尽了最大努力来获得最佳性能。 如果仅按原样运行笔记本,则可能要等待几个小时,否则可能会崩溃。

· 不出所料,因为Koalas和PySpark在幕后都使用Spark,所以结果非常相似。

· 如前所述,我无法对文件中未保留的新创建列应用测试,因为这会使Dask DataFrame和PySpark崩溃。 为了解决这个问题,我进一步计算了结果的平均值或计数,以强制使用单个值。

· 我没有使用任何字符串行,这是因为我们对Datatable的破解,这在字符串行上不起作用。

· 免责声明—我是vaex.io的一部分,我个人认识Turicreate的创建者之一,他是Spark的贡献者,但我尝试尽可能地保持公正,将其作为个人的专业项目来进行。

结论

自从Turicreate开源以来,我一直在使用Turicreate作为它的首选软件包,而在此之前,我一直使用PySpark,但是我改用了Vaex。 尽管状态还处于起步阶段,还有些粗糙,但是状态的表达和转移使我能够编写更少的代码来牺牲我不常用的功能,而且速度非常快。

我很惊讶地看到PySpark和Koalas表现出色。 尽管如此,设置它,不使用现成的平台来部署解决方案,管道问题,开发过程中无法解释的错误(以及时髦的PySpark API)对我来说还是太多了。

Dask DataFrame是一个不幸的挑战。 它崩溃了无数次,并且我经历了多次考验,以使其在性能上具有竞争力(请查看笔记本)。

总而言之,在基准测试开发期间,PySpark和Dask DataFrame是时间和金钱上最昂贵的。

后果

我有兴趣了解Datatable在未来的发展情况。

不要期望Turicreate会看到很多进展,因为他们目前正在专注于其深度学习开发。

如果您有任何疑问或想法,欢迎在Github存储库中针对基准进行评论/发表。

如果我找到合理合理的方法来优化任何技术,并且包括在使用不同实例时包括字符串行基准测试,那么我打算重新运行和更新基准测试。

您可以在Twitter,Linkedin上关注我。

更新

-20年1月6日—在Guhan给予了很好的评价之后,我将PySpark惰性评估添加到基准中并更新了所有地块。 除了在第一个绘图中添加了PySpark惰性评估结果以及在最终表中进行了少量更改之外,新的绘图与原始版本没有区别。 我也将PySpark添加到了懒惰的评估赢家中。

(本文翻译自Jonathan Alexander的文章《Beyond Pandas: Spark, Dask, Vaex and other big data technologies battling head to head》,参考:https://towardsdatascience.com/beyond-pandas-spark-dask-vaex-and-other-big-data-technologies-battling-head-to-head-a453a1f8cc13)