DeepSeek开源周第五弹之二!Smallpond:构建于3FS之上的轻量级数据处理框架,高效处理PB级数据

138 阅读6分钟

❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发感兴趣,我会每日分享大模型与 AI 领域的开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术!

🥦 AI 在线答疑 -> 智能检索历史文章和开源项目 -> 尽在微信公众号 -> 搜一搜:蚝油菜花 🥦


🎧 “数据处理的革命性突破!DeepSeek开源Smallpond:PB级数据轻松搞定,性能爆表!”

大家好,我是蚝油菜花。你是否也遇到过——

  • 👉 处理大规模数据时,系统卡顿、效率低下
  • 👉 数据清洗和转换耗时过长,影响项目进度
  • 👉 需要快速生成分析结果,但现有工具无法满足需求...

今天揭秘的 Smallpond,用AI彻底颠覆数据处理方式!这个基于 DuckDB 和 3FS 构建的轻量级框架,支持 PB 级数据处理,提供高效的数据加载、查询和转换功能,连复杂的数据分析任务都能轻松搞定。工程师们已经用它处理大规模数据集,数据分析师靠它快速生成分析结果——你的数据处理效率准备好迎接革命了吗?

🚀 快速阅读

Smallpond 是 DeepSeek 开源的轻量级数据处理框架,专为高性能和大规模数据处理设计。

  1. 核心功能:支持 PB 级数据处理,提供高效的数据加载、查询和转换功能。
  2. 技术原理:基于 DuckDB 和 3FS 构建,支持并行处理和分布式存储。

Smallpond 是什么

smallpond-cover

Smallpond 是 DeepSeek 推出的基于 DuckDB 和 3FS 构建的轻量级数据处理框架,专为高性能和大规模数据处理设计。Smallpond 支持处理 PB 级数据集,借助 DuckDB 的高性能分析能力和 3FS 的分布式存储优势,实现高效的数据加载、查询和转换。

Smallpond 支持快速上手,提供示例数据和详细的文档,适合需要高效处理大规模数据的用户和开发者。

Smallpond 的主要功能

  • 轻量级和易用性:提供简洁的 API 和易于理解的工作流程,方便用户快速上手。
  • 高性能数据处理:由 DuckDB 驱动,支持高效处理大规模数据集。
  • PB 级数据扩展性:基于 3FS 构建,支持处理 PB 级别数据。
  • 便捷操作:无需长时间运行的服务即可完成数据处理任务。
  • 快速上手:提供快速入门指南和示例数据,支持用 DuckDB SQL 进行数据处理。

Smallpond 的技术原理

  • 数据加载:基于 3FS 加载数据,支持多种数据格式(如 Parquet、CSV)。
  • 数据处理:用 DuckDB 的 SQL 引擎对数据进行处理,支持复杂的查询和分析操作。
  • 数据存储:处理后的数据保存回 3FS,支持分区存储和高效读写。
  • 并行处理:Smallpond 支持数据分区和并行处理,充分利用集群资源,提高处理效率。

如何运行 Smallpond

安装

Python 3.8 到 3.12 支持。

pip install smallpond

快速开始

# 下载示例数据
wget https://duckdb.org/data/prices.parquet
import smallpond

# 初始化会话
sp = smallpond.init()

# 加载数据
df = sp.read_parquet("prices.parquet")

# 处理数据
df = df.repartition(3, hash_by="ticker")
df = sp.partial_sql("SELECT ticker, min(price), max(price) FROM {0} GROUP BY ticker", df)

# 保存结果
df.write_parquet("output/")
# 显示结果
print(df.to_pandas())

如何运行 Smallpond 数据流图

Smallpond 提供了高层和低层两种 API,分别支持动态和静态数据流图的构建和执行。以下是关于如何使用这两种 API 的详细教程和示例代码。

高层 API 使用教程

高层 API 以 DataFrame 为核心,支持动态构建数据流图、执行以及结果提取。推荐使用高层 API,因为它更易于使用,并且支持动态数据流图的构建。

示例代码

以下是一个典型的高层 API 使用流程:

import smallpond

# 初始化 Smallpond
sp = smallpond.init()

# 读取 Parquet 数据集
df = sp.read_parquet("path/to/dataset/*.parquet")

# 对数据进行重新分区
df = df.repartition(10)

# 对数据进行映射操作
df = df.map("x + 1")

# 将结果写入 Parquet 文件
df.write_parquet("path/to/output")

代码解释

  1. 初始化 Smallpond: 使用 smallpond.init() 初始化 Smallpond 环境。
  2. 读取数据: 使用 read_parquet 方法读取 Parquet 格式的输入数据。
  3. 数据处理: 调用 repartition 方法对数据进行重新分区,然后使用 map 方法对数据进行简单的映射操作。
  4. 写入结果: 使用 write_parquet 方法将处理后的数据写入指定路径。

低层 API 使用教程

低层 API 提供了更灵活的配置选项,但需要手动创建节点以构建静态数据流图。它使用内置调度器,支持一次性执行静态数据流图。

示例代码

以下是一个完整的低层 API 示例:

from smallpond.logical.dataset import ParquetDataSet
from smallpond.logical.node import Context, DataSourceNode, DataSetPartitionNode, SqlEngineNode, LogicalPlan
from smallpond.execution.driver import Driver
from typing import List

# 定义数据流图构建函数
def my_pipeline(input_paths: List[str], npartitions: int):
    # 初始化上下文
    ctx = Context()
    
    # 创建数据源节点
    dataset = ParquetDataSet(input_paths)
    node = DataSourceNode(ctx, dataset)
    
    # 创建分区节点
    node = DataSetPartitionNode(ctx, (node,), npartitions=npartitions)
    
    # 创建 SQL 引擎节点
    node = SqlEngineNode(ctx, (node,), "SELECT * FROM {0}")
    
    # 返回逻辑计划
    return LogicalPlan(ctx, node)

if __name__ == "__main__":
    # 初始化驱动器
    driver = Driver()
    
    # 添加命令行参数
    driver.add_argument("-i", "--input_paths", nargs="+")
    driver.add_argument("-n", "--npartitions", type=int, default=10)
    
    # 获取参数并构建逻辑计划
    plan = my_pipeline(**driver.get_arguments())
    
    # 执行逻辑计划
    driver.run(plan)

代码解释

  1. 定义数据流图: 使用 my_pipeline 函数定义静态数据流图,包括数据源节点、分区节点和 SQL 引擎节点。
  2. 初始化驱动器: 使用 Driver 类初始化驱动器,并添加命令行参数。
  3. 构建逻辑计划: 根据命令行参数构建逻辑计划。
  4. 执行计划: 调用 driver.run(plan) 执行逻辑计划。

如何运行脚本

运行上述脚本时,可以通过以下命令指定输入路径和分区数量:

python script.py -i "path/to/*.parquet" -n 10

高层 API 与低层 API 的区别

高层 API

  • 使用 Ray 作为后端,支持动态数据流图的构建和执行。
  • 推荐用于快速开发和动态场景。

低层 API

  • 使用内置调度器,仅支持静态数据流图的一次性执行。
  • 提供更多性能优化和配置选项。

资源


❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发感兴趣,我会每日分享大模型与 AI 领域的开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术!

🥦 AI 在线答疑 -> 智能检索历史文章和开源项目 -> 尽在微信公众号 -> 搜一搜:蚝油菜花 🥦