duckdb_Deepseek_开源的smallpond用到的部分
smallpond
A lightweight data processing framework built on DuckDB and 3FS.
源码
__init__.py功能:初始化 Smallpond 环境,定义版本号和 init 函数。
init 函数:是 Smallpond 的入口点,用于初始化会话(Session)
session.py 功能:定义 SessionBase 类,管理任务执行环境和资源。
dataframe.py DataFrame 类 封装了逻辑计划(Node)和任务执行
worker.py 功能:Smallpond 工作节点的入口脚本
DuckDB
数据库--分析型数据库,存储和加载parquet数据格式的数据非常快,向量化运算
conn: duckdb.DuckDBPyConnection = None,
row = duckdb.sql(sql_query).fetchone()
num_rows = duckdb.sql(
f"select count(*) as num_rows from {self.sql_query_fragment()}"
).fetchall()
duckdb.sql(sql_query).fetch_arrow_table()
duckdb.sql(sql_query).fetch_arrow_reader(batch_size)
duckdb.typing.DuckDBPyType
conn: duckdb.DuckDBPyConnection):
数据处理格式
parquet
import pyarrow as arrow
import pyarrow.parquet as parquet
import pandas as pd
import numpy as np
Numba是一个专为Python设计的即时编译器(Just-In-Time,JIT
数据类型
from typing import Iterable, List, Optional, Union
多线程
from concurrent.futures import ThreadPoolExecutor
zstandard 是一个致力于提供高效的Zstandard(zstd)压缩库与Python交互的开源项目。
workflow--工作流
Smallpond uses Ray Core as the task scheduler.
dolphinscheduler 调度编排工具
分布式计算领域的
Flyte专注于为机器学习和数据处理工作流提供编排、管理和版本控制功能,
支持复杂依赖关系和任务的复现,适合整个数据和模型生命周期的管理。强依赖K8S
Ray则侧重于高性能分布式计算框架,支持快速构建分布式应用,
如强化学习和大规模数据处理,提供低延迟的任务调度和弹性扩展能力
Ray核心组件
由Ray Core(基本分布式能力)、
Ray Data(数据处理)、Ray Train(训练)、Ray Tune(超参数调整)、
Ray Serve(推理)、Ray RLlib(强化学习)以及Ray AIR(上层机器学习API)等模块组成。
强调无依赖的并行任务
Ray Ray Cluster包括一个Head Node多个Worker Node,
Ray Cluster可以部署在云虚拟机、K8S集群或者本地的物理机上
Ray client
分布式对象存储: Ray提供了分布式对象存储功能
并行任务执行: Ray允许开发者将任务并行地执行在多个节点上 Actor模型: Ray支持Actor编程模型
提供分布式任务工作流能力:Ray Workflow,可以把任务编写为工作流方式,并提供工作流持久化存储能力。
初始化Ray:在初始化访问Ray,使用ray.init(
2. 定义远程任务:使用@ray.remote装饰器定义可在Ray集群中远程执行的函数
3. 执行远程任务:通过调用远程函数并使用ray.get()获取结果
日志
loguru 是Python中一个简易且强大的第三方日志记录库,
在通过添加一系列有用的功能来解决标准记录器的注意事项,从而减少Python日志记录的痛苦
graphviz Python中使用graphviz库来创建图形(例如,有向图和无向图)是一种非常直观和强大的方式
数据类型 udf
duckdb.list_type
duckdb.typing.DuckDBPyType
duckdb.typing.SQLNULL
duckdb.typing.BOOLEAN
duckdb.typing.TINYINT
duckdb.typing.UTINYINT
duckdb.typing.SMALLINT
duckdb.typing.USMALLINT
duckdb.typing.INTEGER
duckdb.typing.UINTEGER
duckdb.typing.BIGINT
duckdb.typing.UBIGINT
duckdb.typing.HUGEINT
duckdb.typing.UUID
duckdb.typing.FLOAT
duckdb.typing.DOUBLE
duckdb.typing.DATE
duckdb.typing.TIMESTAMP
duckdb.typing.TIMESTAMP_MS
duckdb.typing.TIMESTAMP_NS
duckdb.typing.TIMESTAMP_S
duckdb.typing.TIME
duckdb.typing.TIME_TZ
duckdb.typing.TIMESTAMP_TZ
duckdb.typing.VARCHAR
duckdb.typing.BLOB
duckdb.typing.BIT
duckdb.typing.INTERVAL
DuckDBPyConnection
list_type | array_type
struct_type | row_type
duckdb.map_type
duckdb.__version__
dataset
row = duckdb.sql(sql_query).fetchone()
num_rows = duckdb.sql( f"select count(*) as num_rows from {self.sql_query_fragment()}" ).fetchall()
duckdb.sql(sql_query).fetch_arrow_table()
duckdb.sql(sql_query).fetch_arrow_reader(batch_size)
node
self.udfs[name] = DuckDbExtensionContext(name, extension_path)
elif udf.endswith(".duckdb_extension"):
name = ctx.create_duckdb_extension(udf)
Task
duckdb.OutOfMemoryException as ex:
with duckdb.connect(
database=":memory:", config={"allow_unsigned_extensions": "true"}
) as conn:
ray
Ray 在分布式环境中执行任务时,需要特别注意变量作用域和上下文信息的传递
初始化 ray.init()
数据操作:ray.put() 和 ray.get()
任务管理:ray.wait() ray.shutdown()
Ray用于计算,Celery用于分布式定时任务,异步队列,
Dask用于代替pandas处理不下数据时使用,Luigi用于数据的ETL转换之类,
Airflow和Prefect是工作流任务。
函数将被安排为无状态任务执行,而类将是一个有状态的远程服务
无状态的 Task 不同
Task(任务):通过 @ray.remote 装饰器,可以将普通 Python 函数转换为分布式任务
###框架 ray
import ray
# 初始化 Ray 集群,设置 2 个 CPU 核心
ray.init(num_cpus=2)
# 使用 @ray.remote 装饰器定义分布式任务
@ray.remote
def add(x, y):
return x + y
# 异步提交任务,立即返回 future 对象(对象引用)
future1 = add.remote(1, 2)
# 等待任务完成并获取结果
results = ray.get([future1, future2])
# 关闭 Ray
ray.shutdown()
有状态的Actor
# 使用 @ray.remote 将类转换为分布式 Actor
@ray.remote
class Counter:
pass
# 创建 Actor 实例(在远程工作进程中)
counter = Counter.remote()
Actor 更适合需要维护状态的长期运行的计算任务,如模型训练、参数更新等场景
组件架构
一个开源的分布式计算框架 Ray “A Distributed Framework for Emerging AI Applications”
Node: 节点,主要是head和worker, head可以认为是Master,worker是执行任务的单元
scheduler:有两个调度器,每个节点都有本地的调度器,
在提交任务时,Local Scheduler会判断是否需要提交给 Global Scheduler 分发给其他 worker来执行
GCS:全局状态控制记录了Ray中各种对象的状态信息,可以认为是meta数据,是Ray容错的保证
object store:一个内存对象存储,允许Node之间进行通信
Ray是通过生成DAG图的方式来确定依赖关系,
集群部署
集群部署
Ray的架构遵循master-slave的模式。
Head Node 可以认为是Master,
其他的Node为worker。
在集群部署时,Head Node需要首先启动ray start --head, 其他机器依次启动worker,
注意需要指定head Node的地址确定关系,ray start --address 10.8.xx.3:6379。
关闭服务,需要每一台机器执行 ray.stop
提交任务 任何一台worker机器都可以提交任务, 先通过init连接Head Node就可以remote起来了
调度架构
业界系统的调度架构主要分为四类:单体调度、两层调度、共享调度和混合调度
单体调度即只有一个调度器,调度器拥有全局资源视图的架构,
Google Borg 和 K8s 都采用这个架构
两层调度拥有多个调度器,Apache Mesos 和 Hadoop YARN 都采用这个架构。
两层调度中,每个应用的调度器首先向中心节点获取资源,再将其分配给应用中的各个任务
共享调度拥有多个调度器,每个调度器拥有全局资源视图, Omega 采用了这个架构
Google的论文Omega:flexible,scalable schedulers for large compute clusters中把调度分为3代:
第一代是独立的集群;第二代是两层调度(Mesos,YARN);第三代是共享状态调度
微信内AI 计算平台:AstraRay
分布式调度的挑战
Ray 是 UC Berkeley 的 RISElab 实验室在 2017 年前后发起的一个基于内存共享的分布式计算框架。
基于Kubernetes微服务部署平台,
通过自动化编排和弹性扩缩容机制,很好的解决了在线高实时的后台服务运维自动化问题
基于Kubernetes 的大数据平台
适合处理离线大规模的数据清洗和模型训练
业界使用社区成熟的 KubeRay 方案,通过 Ray 和 K8s 结合,
提供了易用、高可用、高伸缩的云原生 Ray 集群服务,可以满足中小规模 AI 应用的需求
参考
https://duckdb.org/docs/stable/sql/data_types/overview.html
Flyte工作流(Workflow)平台调研(六)——跟Ray框架对比 https://zhuanlan.zhihu.com/p/18014018764
分类:
SQL_数据仓库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧