现代数据分析生态 - 2023
数据分析生态的活跃程度可能仅次于前端(一个坏笑话哈哈)。
我刚接触编程的那些年(大约是 2016 年),(大)数据分析人们主要谈论的是 Spark,逐渐放弃的是 Hadoop,
渐渐在讨论 Flink 这样的流处理平台。
这些平台有个共同点:都是跑在 JVM 上(好吧,又一个坏笑话,你读过 Spark 的异常信息码?信噪比低到令人发指)。
我觉得这些平台的共同点是:他们都是 Platform,而不是 library。什么意思呢?为了用这些平台分析数据,
首先,你需要安装对应的集群;然后,你需要把你的问题转化成对应平台的 API 来执行;最后,这些平台内部的
数据类型和数据结构是不兼容的。有时候,你会觉得你的问题用 Spark 有点高射炮打蚊子,又有些时候你觉得
Spark 的 API 好难用,并不是适合你的问题,而且它的运行时语义也不是你想要的,你需要各种 Hack。
很多时候,你只想把算任务派发到很电脑上,完成计算任务。
计算三要素:算、存、通讯。这些平台都有自己的算、存、通讯机制,导致相互共存非常困难。
如今,2023年,Spark Flink 仍然蓬勃发展,但是社区中似乎有了一些新的动向:
- 去平台化,去JVM化
- 统一数据格式( in memory / on disk)
我们看几个明星项目:
- 算
- Ray
- Dask
- Polars
- DuckDB
- 存
- Apache Arrow/Paruqet
- 通讯
- Arrow
- RedPanda
这些项目更像是乐高,可以互相堆砌;走的是小儿精的路线。
Fun Fact: 这些项目都跟 JVM 无关了。。因为 JVM 只有跟 JVM 堆才舒服。。
算
这里我写了 4 个项,除了 Ray 和 Dask,都是以包或者库的形式存在的。其实 Dask 和 Ray 属于非常
轻量级的平台,他们对代码的侵入性非常低,通常你写好一个函数,加个装饰器就好了。
Polars 具有原生的多核计算能力,特别适合内存 DataFrame 计算。DuckDB 是一个高性能的分析型数据库,它允许你使用 SQL 进行查询和分析,同时也支持嵌入式使用。这些项目都致力于提供更加灵活、轻量级的数据分析解决方案,摆脱了过去平台化的束缚。
Ray
首先,让我们深入了解一下 Ray。Ray 是一个高性能的分布式执行框架,它旨在让你能够轻松地编写并行和分布式应用程序,而无需担心底层的集群管理细节。与传统的数据处理平台不同,Ray 提供了一个更加灵活的方式来执行任务,它的核心思想是将任务调度和执行从底层平台抽象出来,使你可以专注于编写业务逻辑。
Ray 的一个重要概念是任务(Task),你可以将任务定义为一个函数,然后使用 Ray 的装饰器将其标记为可并行执行的任务。Ray 会自动管理任务的调度和执行,可以在多台计算机上并行执行任务,从而充分利用计算资源。这使得在 Ray 上开发数据分析应用变得非常简单。
Ray 还提供了分布式数据存储(如分布式对象存储系统)和分布式通信机制,以支持大规模数据分析和处理任务。这使得 Ray 成为一个强大的工具,特别适用于处理需要大规模计算和分析的数据。
Dask
与 Ray 类似,Dask 也是一个轻量级的并行计算框架,它专注于处理大规模数据集。Dask 的核心概念是分布式任务图(DAG),它允许你将计算任务构建成一个有向无环图,然后使用 Dask 调度器并行执行这些任务。
Dask 的一个独特之处在于它的设计哲学是与现有 Python 生态系统无缝集成。你可以使用 Pandas、NumPy 和其他常用的 Python 数据分析库来构建 Dask 任务图,这使得迁移现有的数据分析工作流程到 Dask 变得非常容易。
与其他平台不同,Dask 的入侵性非常低,你可以逐渐将它引入到现有代码中,而不需要重写整个应用程序。这种逐步迁移的方式让许多数据分析团队受益,因为他们可以在不中断现有工作流程的情况下,利用分布式计算能力来处理更大规模的数据。
Polars 和 DuckDB
Polars 和 DuckDB 都是针对数据分析和处理的库,它们提供了原生的多核计算能力,非常适合处理内存中的数据。Polars 提供了一个 DataFrame API,类似于 Pandas,但具有更高的性能和多核支持。它的目标是让你能够在内存中高效地执行数据操作,而无需借助复杂的集群设置。
DuckDB 则是一个嵌入式的高性能分析型数据库,它允许你使用 SQL 进行查询和分析。它的设计重点是轻量级和快速响应查询,适用于需要实时分析的应用场景。DuckDB 的嵌入式特性使得它能够轻松集成到各种应用程序中,而无需单独运行一个数据库服务器。
这些项目的共同点是它们都提供了一种轻量级的方式来进行数据分析,无需复杂的平台设置和侵入性的代码修改。它们为数据分析生态带来了新的可能性,使得数据分析人员能够更灵活地处理和分析数据。
存
在数据分析生态中,数据的存储和管理同样至关重要。传统的大数据平台通常依赖于复杂的分布式文件系统和存储系统,但现代数据分析生态中出现了一些新的存储解决方案,它们更加轻量且易于使用。
Apache Arrow 和 Parquet
Apache Arrow 是一个跨语言的内存数据格式,它旨在提供一种高效的数据交换方式,使不同语言的数据处理库能够无缝地共享数据。Arrow 的设计允许数据在不同语言之间进行零拷贝共享,这在大规模数据分析中非常有用。
Parquet 则是一种列式存储格式,它与 Arrow 兼容并且被广泛用于存储和交换数据。Parquet 的列式存储方式使得它非常适合分析型查询,可以快速读取和过滤大规模数据集。
这些存储格式的出现使得数据在不同环境和应用之间更加可移植,同时也提高了数据分析的性能和效率。
通讯
数据分析生态中的通讯机制同样至关重要,特别是在分布式计算和处理大规模数据时。在过去,不同平台之间的通讯通常需要经过复杂的编码和解码过程,但现代数据分析生态中出现了一些新的通讯解决方案,使通讯更加高效和易于实现。
Arrow 和 RedPanda
Arrow 作为一种跨语言数据格式,不仅用于数据存储,还用于数据传输。它的设计使得不同语言的应用程序能够快速、高效地交换数据,无需复杂的编码和解码。这在分布式数据分析中非常有用,可以降低通讯开销,提高数据传输性能。
RedPanda 则是一个高性能的事件流处理平台,它专注于实时数据流处理。与传统的消息队列系统不同,RedPanda 提供了更高的性能和可伸缩性,使得你能够处理大规模的数据流。它的设计目标是使数据流处理更加容易部署和管理。
这些通讯解决方案为数据分析生态中的数据传输和通信提供了更加高效和可扩展的选项,有助于加速数据分析任务的完成。
结语
现代数据分析生态在不断演变,提供了更多灵活、轻量级的工具和解决方案,使数据分析变得更加容易和高效。无论是通过 Ray 和 Dask 进行并行计算,还是使用 Polars 和 DuckDB 进行高性能数据操作,都有助于数据分析人员更好地处理和分析数据。同时,新的数据存储和通讯解决方案也为数据分析生态带来了更多的可能性。在这个充满活力的生态系统中,我们可以期待看到更多创新和发展,使数据分析变得更加强大和便捷。