Daft 连接腾讯云 COS 完整实践:cos:// 协议、CosConfig 鉴权配置与 OpenDAL 底层实现解析

发布时间:2026/11/5 20:11:57

Daft 连接腾讯云 COS 完整实践:cos:// 协议、CosConfig 鉴权配置与 OpenDAL 底层实现解析 Daft 连接腾讯云 COS 完整实践cos:// 协议、CosConfig 鉴权配置与 OpenDAL 底层实现解析【免费下载链接】DaftHigh-performance data engine for AI and multimodal workloads. Process images, audio, video, and structured data at any scale项目地址: https://gitcode.com/GitHub_Trending/da/DaftDaft 将腾讯云对象存储Tencent Cloud COS作为一等存储后端接入其 I/O 层原生识别cos://与cosn://Hadoop CosN 兼容两种 URL 协议支持基于区域region或自定义 endpoint 的自动推导、永久密钥与 STS 临时凭证、匿名访问等多种鉴权方式。本文基于当前仓库的连接器文档与 Rust/Python 源码覆盖从凭证配置、读写操作到参数默认值的完整实操路径并剖析CosConfig如何被翻译成 OpenDAL 后端配置、URL 如何被路由到 COS 存储源帮助你在 Daft 上把 COS 数据真正跑起来并理解其底层行为。数据寻址cos:// 与 cosn:// 两种协议在腾讯云 COS 中数据按以下层级组织Bucket存储桶数据容器的顶层命名空间Object Key对象键桶内某份数据的唯一标识。因此 COS 上的数据 URL 形式为cos://{BUCKET}/{OBJECT_KEY}Daft 同时支持cos://和cosn://两种 URL 协议——后者用于兼容 Hadoop 生态中广泛使用的 CosN 协议两者在 Daft 内部被同等对待。这一点在源码中有直接依据URL 协议路由 中cos与cosn两个 scheme 都被映射到同一个SourceType::OpenDAL { scheme: cos }存储源cos | cosn Ok(( SourceType::OpenDAL { scheme: cos.to_string(), }, fixed_input, )),这意味着从 Hadoop CosN 环境迁移过来的既有cosn://路径可以原样用于 Daft 的read_parquet、read_csv等 API无需改写。鉴权方式一依赖环境变量最省事的方式是让 Daft 从环境变量自动发现凭证。CosConfig支持两组前缀的环境变量环境变量说明COS_ENDPOINTCOS 服务端点COS_REGION或TENCENTCLOUD_REGIONCOS 服务所在区域COS_SECRET_ID或TENCENTCLOUD_SECRET_IDCOS 鉴权 SecretIdCOS_SECRET_KEY或TENCENTCLOUD_SECRET_KEYCOS 鉴权 SecretKeyCOS_SECURITY_TOKEN或TENCENTCLOUD_SECURITY_TOKEN临时凭证STS安全令牌其中TENCENTCLOUD_前缀与腾讯云 SDK 的通用环境变量命名保持一致便于与既有云原生工具链复用同一套凭证。分布式环境的注意事项在 Ray 等分布式运行时下Daft 会从各 worker 机器上读取这些环境变量因此每台 worker 都需要被正确注入凭证如果你希望统一使用driver上的凭证则应改用下面的手动指定方式。CosConfig.from_env()的这条凭证发现路径有专门的测试覆盖tests/io/test_cos_config.py 中分别验证了COS_前缀与TENCENTCLOUD_前缀两种变量被from_env()正确读取的行为。鉴权方式二手动指定 CosConfig通过daft.io.CosConfig配置对象可以把凭证显式传入 Daft 的 I/O 调用。有两种注入粒度全局默认daft.set_planning_config(default_io_configio_config)将一份IOConfig设为后续所有 Daft 方法调用的默认 I/O 配置逐操作覆盖在每个读取/写入函数的io_config关键字参数中传入配置同一进程内不同操作可以使用不同的 COS 配置。以下示例完整继承自官方连接器文档可直接复制运行替换为你自己的凭证。使用永久密钥from daft.io import IOConfig, CosConfig io_config IOConfig( cosCosConfig( regionap-guangzhou, secret_idyour-secret-id, secret_keyyour-secret-key, ) ) # 全局设置默认 IOConfig作用于后续所有 I/O 调用 daft.set_planning_config(default_io_configio_config) # 执行 I/O 操作 df daft.read_parquet(cos://my-bucket/my_path/**/*)使用 STS 临时凭证临时凭证额外需要security_token字段from daft.io import IOConfig, CosConfig io_config IOConfig( cosCosConfig( regionap-guangzhou, secret_idyour-tmp-secret-id, secret_keyyour-tmp-secret-key, security_tokenyour-security-token, ) ) # 逐操作传入 io_config df daft.read_parquet(cos://my-bucket/my_path/**/*, io_configio_config)使用自定义 Endpoint当你使用私有化部署或非默认域名时可以直接提供endpoint区域会从 endpoint 自动推导from daft.io import IOConfig, CosConfig # 使用自定义 endpointregion 将从 endpoint 自动推导 io_config IOConfig( cosCosConfig( endpointhttps://cos.ap-beijing.myqcloud.com, secret_idyour-secret-id, secret_keyyour-secret-key, ) ) df daft.read_parquet(cos://my-bucket/data/**/*, io_configio_config)匿名访问公开桶from daft.io import IOConfig, CosConfig # 无需凭证访问公开桶 io_config IOConfig(cosCosConfig(anonymousTrue)) df daft.read_parquet(cos://public-bucket/data/**/*, io_configio_config)使用 CosN 协议from daft.io import IOConfig, CosConfig io_config IOConfig( cosCosConfig( regionap-guangzhou, secret_idyour-secret-id, secret_keyyour-secret-key, ) ) # 使用 cosn:// 协议Hadoop CosN 兼容 df daft.read_parquet(cosn://my-bucket/my_path/**/*, io_configio_config)逐操作覆盖配置io_config参数使得同一脚本中不同路径可以使用不同的桶、区域或凭证这是官方文档强调的高灵活性用法from daft.io import IOConfig, CosConfig io_config IOConfig( cosCosConfig( regionap-guangzhou, secret_idyour-secret-id, secret_keyyour-secret-key, ) ) # 执行 I/O 操作并覆盖默认 IOConfig df2 daft.read_csv(cos://my-bucket/my_other_path/**/*, io_configio_config)写入 COS写入与读取共用同一套CosConfig。下面示例从 Python 字典构造 DataFrame 并以 Parquet 格式写入 COSimport daft from daft.io import IOConfig, CosConfig io_config IOConfig( cosCosConfig( regionap-guangzhou, secret_idyour-secret-id, secret_keyyour-secret-key, ) ) df daft.from_pydict({a: [1, 2, 3], b: [x, y, z]}) # 以 Parquet 格式写入 COS df.write_parquet(cos://my-bucket/output/, io_configio_config)CosConfig 全参数说明daft.io.CosConfig支持的完整选项如下与 daft/daft/__init__.pyi 中的类型声明及 Rust 侧 Default 实现 一致参数类型默认值说明regionstrNone区域名如ap-guangzhou、ap-beijing、ap-shanghaiendpointstrNone自定义 endpoint URL如https://cos.ap-guangzhou.myqcloud.com。未提供时由 region 推导secret_idstrNone腾讯云 SecretIdsecret_keystrNone腾讯云 SecretKeysecurity_tokenstrNone临时凭证STS安全令牌anonymousboolFalse是否使用匿名访问公开桶max_retriesint3失败请求的最大重试次数retry_timeout_msint30000重试的总超时时长毫秒connect_timeout_msint10000建立连接的超时时间毫秒read_timeout_msint30000读取首字节的超时时间毫秒max_concurrent_requestsint50最大并发请求数max_connectionsint50每个 IO 线程的最大连接数此外CosConfig还提供replace()方法返回替换字段后的新实例与from_env()静态方法方便在已有配置基础上做派生。Region 与 Endpoint 的自动推导规则region与endpoint只需提供其一Daft 会自动推导另一个。endpoint_and_region 实现 定义了四种情况的精确行为仅提供regionendpoint 推导为https://cos.{region}.myqcloud.com仅提供endpoint从 endpoint URL 中解析出 region。解析逻辑见 extract_region 函数它剥离协议头后按.切分主机名匹配以ap-、na-、eu-、sa-开头的段作为区域标识因此https://cos.na-siliconvalley.myqcloud.com或虚拟主机风格https://bucket.cos.ap-shanghai.myqcloud.com都能正确提取两者都提供按原样使用两者都不提供回退到默认区域ap-guangzhouDEFAULT_REGION 常量并记录告警日志。以上每种分支都有对应的单元测试tests 模块例如endpoint 无法解析出区域时回退默认区域、只给 region 时推导出正确 endpoint等场景均已固化在测试中。底层实现CosConfig 如何桥接到 OpenDAL从源码结构看Daft 并没有为 COS 编写独立的客户端而是复用通用的OpenDAL 存储源。调用链如下URL 路由cos:///cosn://被解析为SourceType::OpenDAL { scheme: cos }src/daft-io/src/lib.rs#L655-L660配置翻译创建存储客户端时从 URL 的 host 部分取出 bucket调用CosConfig::to_opendal_config(bucket)把友好的CosConfig翻译成 OpenDAL 的键值配置src/daft-io/src/lib.rs#L296-L303OpenDAL 执行OpenDALSource 持有Operatorcos在其 available_schemes 列表中实际的 GET/PUT/LIST 请求由 OpenDAL 的 COS 服务完成URL 中的路径部分通过 url_to_opendal_path 剥离出bucket/path中的相对路径后交给 operator 处理。to_opendal_config 实现 中有两个值得注意的细节匿名模式的安全语义当anonymousTrue时配置会写入disable_config_loadtrue即跳过凭证转发、同时阻止 OpenDAL 再从环境变量加载凭证避免匿名访问公开桶时意外拾取进程里残留的密钥非匿名模式下则写disable_config_loadfalse允许 OpenDAL 从环境变量补齐未显式提供的凭证凭证脱敏secret_key与security_token在 Rust 结构体中用ObfuscatedString包装其Display实现固定输出***multiline_display()同样只打印Secret key ***、Security token ***。这意味着配置对象在日志、错误信息或repr中不会泄露密钥——test_cos_config_display 测试专门断言了脱敏行为。这套友好配置 API 通用 OpenDAL 后端的设计让 COS 得以支持官方文档列出的全部操作同时保持与 OSS、TOS、Obs 等其他 OpenDAL 系存储源一致的 I/O 行为读read_parquet、read_csv、read_json等文件读取器写write_parquet、write_csv、write_json含分片上传 multipart upload列举支持 glob 模式匹配的对象列举删除对象删除。验证与回归配置行为的测试覆盖对 COS 配置层的断言集中存放在 tests/io/test_cos_config.py涵盖默认值校验重试 3 次、各类超时 30000/10000/30000ms、并发 50、全参数构造、replace()语义、from_env()对COS_与TENCENTCLOUD_双前缀的读取、匿名模式、仅指定 region 时 endpoint 的自动推导以及repr中密钥被掩码等。若你在使用中遇到配置解析类问题这份测试文件是快速确认当前实现约定行为的参照。小结Daft 对腾讯云 COS 的支持可以概括为三条主线URL 层面cos://与cosn://双协议同构、认证层面环境变量 / 永久密钥 / STS 临时凭证 / 匿名访问四路可选且支持全局或逐操作注入、实现层面CosConfig经 region-endpoint 自动推导后翻译为 OpenDAL 后端配置并统一承接读写、列举与删除。配合上文给出的默认值参数表与源码定位你可以在生产环境中按数据规模与凭证形态选择最合适的接入方式。【免费下载链接】DaftHigh-performance data engine for AI and multimodal workloads. Process images, audio, video, and structured data at any scale项目地址: https://gitcode.com/GitHub_Trending/da/Daft创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/4 21:28:50

EasyCode:IDEA代码生成插件,带你告别手写CRUD

写代码这几年,最烦的一件事就是写重复的 CRUD 代码。每次新建一张表,都要手写一个 entity、一个 dao、一个 service、一个 controller,还要配一个 XML mapper。字段一多,光是 getter/setter 就够磨半天的。后来我在 IDEA 里接触到…

2026/11/5 20:11:56

Mac上VSCode报错includePath?一文搞定C/C++环境配置

“检测到 #include 错误,请更新 includePath”——只要你在 Mac 上用 VSCode 写过 C 语言,大概率见过这句话。前几天我帮一个大一学弟配环境,他照着教程敲完第一个 hello world,代码还没编译,编辑器里已经铺满红色波浪…

2026/10/28 4:22:40

Rerun 实战:使用 NV12 像素格式流式显示摄像头视频

Rerun 实战:使用 NV12 像素格式流式显示摄像头视频 【免费下载链接】rerun Visualize, query, and stream to train on multimodal robotics data. 项目地址: https://gitcode.com/GitHub_Trending/re/rerun 本篇技术指南围绕 Rerun 官方示例 examples/python…

2026/11/5 16:51:33

EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析

1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被…

2026/11/5 16:26:13

Rust原来很简单二:所有权系统

Part 2 核心篇 —— 所有权系统 本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理 6…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑