你可能在 Twitter/X/LinkedIn 的炒作中偶然发现了smallpond。从DeepSeek这场炒作中,你可能已经得出结论,Databricks 和 Snowflake已经死了。但别这么急。现实是,虽然这是一项有趣且强大的开源技术,但它不太可能在短期内被广泛用于分析。
下面是一个简明的分析,以帮助你消除噪音。
我们将介绍:
- 什么smallpond和它的同伴3FS
- 它们是否适合你的用例
- 如何使用它们
什么是smallpond?
smallpond是 DeepSeek 最近推出的轻量级分布式数据处理框架。它扩展了DuckDB(通常是单节点分析数据库),使其能够处理跨多个节点的更大数据集。smallpond使 DuckDB 能够使用分布式存储和计算系统来管理分布式工作负载。
主要特点:
- 分布式分析:通过分区数据和并行运行分析任务,允许 DuckDB 处理大于内存的数据集。
- 开源部署:如果您能够设法使其运行,3FS 将以其他替代方案的一小部分成本为您提供强大且性能卓越的存储。
- 手动分区:数据由用户手动分区,并将smallpond这些分区分布在节点之间以进行并行处理。
什么是 3FS?
3FS,即 Fire-Flyer 文件系统,是一种高性能并行文件系统,也是由 DeepSeek 开发的。它专门针对 AI 和 HPC 工作负载进行了优化,通过使用 SSD 和 RDMA 网络技术提供极高的吞吐量和低延迟。
3FS 是一种高速分布式存储后端,可充分利用其极高的性能。3FS 在 180 节点集群上实现了 6.6 TiB/s 的惊人读取吞吐量,这比许多传统的分布式文件系统smallpond高得多。
我如何使用它?
首先,与任何其他 Python 包一样。如果您喜欢痛苦,
否则用uv
uv pip install smallpond
但要真正获得它的好处smallpond,还需要做更多的工作,并且很大程度上取决于您的数据大小和基础设施:
- 10TB 以下:smallpond除非您有非常具体的分布式计算需求,否则可能没有必要。单节点 DuckDB 实例或更简单的存储解决方案将更简单,并且可能性能更高。坦率地说,在较小规模下使用smallpond,没有 Ray/3FS 可能比普通 DuckDB 慢,而且要复杂得多。
- 10TB 到 1PB:smallpond开始大放异彩。您可以设置一个包含多个节点的集群(见下文),利用 3FS 或其他快速存储后端实现快速并行处理。
- 超过 1PB(PB 级):smallpond3FS 专为处理海量数据集而设计。在这种规模下,您需要部署更大的集群并进行大量基础设施投资。
部署通常涉及:
- 设置计算集群(AWS EC2、Google Compute Engine 或本地)。
- 在具有高性能 SSD 和 RDMA 网络的节点上部署 3FS。
- 通过 Python安装smallpond以在集群中运行分布式 DuckDB 任务。
步骤 1 和步骤 3 非常简单。步骤 2非常困难。
3FS 是新产品,因此没有关于如何在 AWS 或任何其他云上进行设置的指南(也许 DeepSeek 会提供此指南?)。您当然可以在裸机上部署它,但您将陷入 DevOps 地狱的低级阶段。
注意:如果您的公司规模在 10TB 以下,则 95% 的公司都应该尝试一下Definite。
我尝试在这里smallpond将 S3 换成 3FS 进行运行,但不清楚与扩展单个节点以处理中等大小的数据相比,您是否能获得性能提升。
是smallpond给我的吗?
tl;dr:可能不是。
是否要使用smallpond取决于以下几个因素:
- 您的数据规模:如果您的数据集小于 10TB,smallpond则会增加不必要的复杂性和开销。对于较大的数据集,它提供了显着的性能优势。
- 基础设施能力:smallpond3FS 需要大量基础设施和 DevOps 专业知识。如果没有专门的集群管理经验团队,这可能会很有挑战性。
- 分析复杂性:smallpond擅长分区级并行,但对复杂连接优化不足。对于需要跨分区复杂连接的工作负载,性能可能会受到限制。
Smallpond 的工作原理(内部原理)
惰性 DAG 执行
Smallpond 在处理像 map()、filter() 和 partial_sql() 这样的操作时,用的是“懒执行”策略。也就是说,它不会马上执行这些操作,而是先构建一个逻辑执行计划,这个计划就像一个没有回路的有向图(DAG)。在这个图里,每一个操作都变成一个节点,比如 SqlEngineNode、HashPartitionNode、DataSourceNode 等等。
除非你使用以下操作明确触发执行,否则什么也不会发生:
- write_parquet()— 将数据写入磁盘
- to_pandas()— 将结果转换为 pandas DataFrame
- compute()— 强制明确计算
- count()— 计算行数
- take()— 检索行的子集
这种惰性求值是有效的,因为它避免了不必要的计算并优化了工作流程。
从逻辑计划到执行计划当你最终触发一个动作时,逻辑计划就变成了由具体任务(例如SqlEngineTask,HashPartitionTask)组成的执行计划。这些任务是 Ray 分发和执行的实际工作单元。
Ray Core 和发行版Smallpond 的发行版在 Python 级别利用 Ray Core,使用分区实现可扩展性。
分区可以手动完成,Smallpond 支持:
- 哈希分区(基于列值)
- 均匀分区(按文件或行数)
- 随机洗牌分区
每个分区都在自己的 Ray 任务中独立运行,使用 DuckDB 实例来处理 SQL 查询。与 Ray 的这种紧密集成强调水平扩展(添加更多节点)而不是垂直扩展(更大、更强大的节点)。要大规模使用它,您需要一个 Ray 集群。您可以在云提供商(例如 AWS)上自己的基础设施上运行一个,但如果您只是想测试一下,那么使用 Anyscale(由 Ray 创建者创立)会更容易。
结论
smallpond和 3FS 提供了强大的功能,可用于在大型数据集上扩展 DuckDB 分析。但是,它们的复杂性和基础设施要求意味着它们最适合于简单的解决方案不再足够的场景。
- 如果您正在管理海量数据集并且已经拥有强大的 DevOps 支持,smallpond那么 3FS 可以显著增强您的分析能力。
- 对于更简单的场景,坚持使用单节点 DuckDB 实例或使用托管解决方案仍然是您的最佳选择。