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-TimeJIT
数据类型 
   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 NodeRay 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
posted @   辰令  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示