- 数据工程
- 数据集成
- ETL
- 后端
- 大数据
【免费下载链接】airbyte
Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud.
Clazar 是 Airbyte 仓库中一个纯声明式(manifest-only)的源连接器,全程无需编写 Python 代码,仅靠一份 4600 余行的 YAML 清单即可完成从 Clazar API 到数据仓库的 ELT 同步。本文将以该连接器的 README.md 为骨架,结合其核心实现 manifest.yaml、发布元数据 metadata.yaml 与集成测试目录,逐层拆解其认证、分页、增量同步、数据流定义与本地开发流程。读完本文,你将理解 Airbyte 低代码(Low-Code/Declarative)连接器的整体工作原理,并能照着仓库实际配置上手调试和扩展一个声明式源连接器。
一、连接器概览:什么是声明式源连接器
在 Airbyte 生态中,连接器分为两类:一类是传统的编程式连接器(Python CDK 或 Java CDK 实现),另一类就是本文主角——基于 Connector Builder 构建的声明式连接器。声明式连接器不写业务代码,而是通过一份 YAML 清单(manifest)来描述"从哪个 API 拉什么数据、如何翻页、如何鉴权、如何做增量同步",底层由低代码 CDK(Low-Code CDK)统一解释执行。README 中明确指出,其底层 YAML 格式规范见官方 Low-Code CDK 概览文档,用户向的使用与配置指南则维护在官方集成文档中。
Clazar 连接器正是一个标准的声明式连接器,仓库结构非常精简:
- manifest.yaml —— 连接器唯一的核心实现,声明全部数据流、认证、分页与同步逻辑;
- metadata.yaml —— 连接器的发布元数据(定义 ID、镜像、发布阶段等);
- integration_tests/ —— 验收测试与示例配置;
- README.md —— 开发者向说明。
从 metadata.yaml 可以看到,该连接器的connectorSubtype为api,releaseStage为alpha,supportLevel为community,标签为cdk:low-code与language:manifest-only,docker 镜像为airbyte/source-clazar(版本0.4.67)。也就是说,这是一个由社区维护、处于 alpha 阶段、完全由 YAML 清单驱动的 API 类源连接器。
二、manifest.yaml 顶层结构:一份 YAML 如何定义整个连接器
打开 manifest.yaml 第 1 行即可看到清单版本号version: 4.5.4,随后声明type: DeclarativeSource,从顶层往下由六个核心区块构成:
| 区块 | 位置 | 作用 |
|---|---|---|
check | manifest.yaml | 定义连通性检查:通过CheckStream请求listings与analytics_aws_marketplace_disbursements两个流来验证凭据是否有效 |
definitions | manifest.yaml | 复用模板区:定义全部 20 个数据流、公共请求器base_requester、认证器等可复用的构件 |
streams | manifest.yaml | 导出区:把definitions中定义好的流通过$ref引用注册为对外暴露的数据流 |
spec | manifest.yaml | 连接器配置规格:声明用户需要在界面填写的client_id、client_secret |
metadata | manifest.yaml | 构建期元数据:记录每个流在测试环境中的响应状态、主键唯一性校验结果等 |
schemas | manifest.yaml | 内联 JSON Schema:为每个流定义字段结构与类型 |
这种"定义-引用-导出"的结构是低代码 CDK 的典型组织方式:definitions中可以用$ref互相引用(例如每个流都$ref到公共的base_requester),streams区则最终决定用户实际能看到哪些数据流。
三、认证机制:OAuth client_credentials 客户端凭据流
Clazar API 采用 OAuth 2.0 的client_credentials(客户端凭据)授权模式。在 manifest.yaml 的公共请求器base_requester中可以看到完整定义:
base_requester: type: HttpRequester url_base: https://api.clazar.io authenticator: type: OAuthAuthenticator client_id: '{{ config["client_id"] }}' grant_type: client_credentials client_secret: '{{ config["client_secret"] }}' refresh_request_body: {} token_refresh_endpoint: https://api.clazar.io/authenticate/几个关键点值得注意:
url_base: https://api.clazar.io是连接器的 API 根地址,与 metadata.yaml 中allowedHosts声明的api.clazar.io保持一致,这也是 Airbyte 平台做网络安全白名单校验的依据;client_id与client_secret通过{{ config["client_id"] }}这种 Jinja 模板语法从用户配置中注入,二者在spec区块中都被标记为airbyte_secret: true(manifest.yaml),意味着写入后会被加密存储、回显时脱敏;token_refresh_endpoint指向https://api.clazar.io/authenticate/,CDK 会先在这里换取访问令牌,再携带令牌访问各数据端点,令牌过期时会自动刷新。
这种"配置注入 + OAuth 客户端凭据"的组合,是绝大多数 API 型声明式连接器的标准鉴权写法。
四、分页机制:PageIncrement 逐页拉取
Clazar 的 API 使用基于页码(page)的分页方式。所有 20 个流都配置了DefaultPaginator,以buyers流为例(manifest.yaml):
paginator: type: DefaultPaginator page_size_option: type: RequestOption field_name: page_size inject_into: request_parameter page_token_option: type: RequestOption field_name: page inject_into: request_parameter pagination_strategy: type: PageIncrement page_size: 100 start_from_page: 1 inject_on_first_request: true工作机制一目了然:
page_size_option把每页大小以page_size参数注入请求 query;page_token_option把页码以page参数注入请求 query;pagination_strategy采用PageIncrement,从第 1 页(start_from_page: 1)开始,每页page_size条记录,翻页时页码自动 +1;inject_on_first_request: true表示第一页请求就携带分页参数,保证首次请求即受页大小约束。
两类流的页大小取值不同:业务实体流(buyers、listings、contracts、opportunities、private_offers)的page_size为100(例如 manifest.yaml),而所有analytics_*分析数据流的page_size为5000(例如 manifest.yaml),这是因为分析类报表数据集通常行数庞大,更大的页大小可以显著减少请求次数、提升同步吞吐。
五、增量同步:基于 last_modified_at 的时间游标
除了analytics_*分析流外,五个业务实体流都配置了增量同步能力,采用DatetimeBasedCursor时间游标机制。以buyers流为例(manifest.yaml):
incremental_sync: type: DatetimeBasedCursor cursor_field: last_modified_at start_datetime: type: MinMaxDatetime datetime: "2021-01-01T12:00:00.000000Z" datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ" datetime_format: "%Y-%m-%dT%H:%M:%S.%fZ" start_time_option: type: RequestOption field_name: last_modified_at_after inject_into: request_parameter cursor_datetime_formats: - "%Y-%m-%dT%H:%M:%S.%fZ"要点解析:
cursor_field: last_modified_at声明以记录的修改时间为游标字段,每次同步只拉取该时间点之后有变更的记录;start_datetime用MinMaxDatetime包裹并给出默认起点2021-01-01T12:00:00.000000Z,它的语义是"取用户配置值与默认值中的较晚者",防止用户把起始时间配置得早于 API 可回溯范围;start_time_option将游标时间以last_modified_at_after参数注入每次请求,实现服务端过滤;- 时间格式统一为
%Y-%m-%dT%H:%M:%S.%fZ(ISO 8601 微秒精度 UTC),并在cursor_datetime_formats中再次声明以兼容 CDK 解析。
与之呼应的是,五个业务流对应的 JSON Schema 都将id与last_modified_at标记为required字段(例如 manifest.yaml),确保主键与游标字段始终存在。而analytics_*流没有配置incremental_sync,只能全量刷新(full refresh),这一点与集成测试目录中的 configured_catalog.json 完全一致——该文件中业务流声明了source_defined_primary_key: [["id"]],分析流则source_defined_primary_key: []且只支持full_refresh。
六、数据流总览:20 个流覆盖业务实体与市场分析报表
streams区块(manifest.yaml)最终导出了 20 个数据流,可划分为两大类:
业务实体流(5 个),均带分页、增量同步、主键与字段清理转换:
| 流名 | API 端点 | 主键 | 字段清理 |
|---|---|---|---|
| buyers | /buyers | id | 移除registration_details、metadata |
| listings | /listings | id | 移除metadata |
| contracts | /contracts | id | 移除metadata |
| opportunities | /opportunities | id | 移除metadata |
| private_offers | /private_offers | id | 移除metadata |
分析报表流(15 个),端点统一为/analytics/datasets/...,全量刷新、无主键、页大小 5000:
| 流名 | 对应数据集 |
|---|---|
| analytics_aws_marketplace_revenue | aws_marketplace_revenue |
| analytics_aws_marketplace_disbursements | aws_marketplace_disbursements |
| analytics_aws_cosell_opportunities | aws_cosell_opportunities |
| analytics_azure_marketplace_orders | azure_marketplace_orders |
| analytics_azure_marketplace_revenue | azure_marketplace_revenue |
| analytics_azure_marketplace_customers | azure_marketplace_customers |
| analytics_azure_marketplace_metered_usage | azure_marketplace_metered_usage |
| analytics_azure_cosell_opportunities | azure_cosell_opportunities |
| analytics_gcp_marketplace_disbursements | gcp_marketplace_disbursements |
| analytics_gcp_marketplace_disbursements_summary | gcp_marketplace_disbursements_summary |
| analytics_gcp_marketplace_charges_and_usage | gcp_marketplace_charges_and_usage |
| analytics_gcp_marketplace_daily_insights | gcp_marketplace_daily_insights |
| analytics_gcp_marketplace_incremental_daily_insights | gcp_marketplace_incremental_daily_insights |
| analytics_gcp_marketplace_monthly_insights | gcp_marketplace_monthly_insights |
| analytics_gcp_marketplace_incremental_monthly_insights | gcp_marketplace_incremental_monthly_insights |
从流命名与端点结构可以推断:该连接器面向的是在 AWS Marketplace、Azure Marketplace、GCP Marketplace 上架 SaaS 产品的独立软件厂商(ISV),业务流覆盖买家、商品列表、合同、商机与私有报价等运营实体,分析流则直接对接三大云市场的数据报表数据集(收入、订单、客户、结算、用量、联合销售商机等),帮助厂商把市场运营数据统一汇入自己的数据仓库做分析。
记录提取与公共请求器
每个流都通过RecordSelector+DpathExtractor从响应中提取记录,字段路径统一指向results(例如 manifest.yaml),说明 Clazar API 将数据记录放在响应 JSON 的results数组中。业务实体流在请求时还会额外携带response_format: common参数(例如 manifest.yaml),用于向服务端请求统一格式的响应。
七、字段清理与 Schema:数据质量的第一道关卡
声明式连接器除了拉数,还支持在运行时做轻量转换。Clazar 连接器在五个业务流上统一配置了RemoveFields转换,例如buyers流(manifest.yaml):
transformations: - type: RemoveFields field_pointers: - - registration_details - type: RemoveFields field_pointers: - - metadata其作用是拉取记录后、写出之前,把registration_details(买家注册明细)与metadata(元数据对象)字段从记录中剔除,其余流则统一移除metadata字段。这通常是为了去掉体积大、价值低或含敏感信息的字段,降低写入目标端的存储开销。
schemas区块则为每个流定义了内联 JSON Schema。以buyers为例(manifest.yaml),其字段包括id、name、cloud、domain、status、listing_id、cloud_account_id、last_modified_at、cloud_identifiers、custom_properties、latest_contract_id、external_object_associations等,类型普遍采用[string, "null"]这类可空联合类型,并统一开启additionalProperties: true以兼容 API 新增字段。分析流的 Schema 字段则多达数十上百个,例如analytics_aws_marketplace_revenue定义了货币、发票、税费分成、批发成本、结算日期、订单金额等全套财务字段(manifest.yaml),可直接支撑收入与结算报表建模。
八、连接器配置:client_id 与 client_secret
连接器的spec区块(manifest.yaml)只要求两个配置项:
spec: type: Spec connection_specification: type: object $schema: http://json-schema.org/draft-07/schema# required: - client_id - client_secret properties: client_id: type: string order: 0 title: Client ID airbyte_secret: true client_secret: type: string order: 1 title: Client secret airbyte_secret: true additionalProperties: true两者都是必填(required)、字符串类型且标记为airbyte_secret: true的敏感字段,order决定在 UI 表单中的展示顺序。对应的示例配置见 integration_tests/sample_config.json:
{ "client_id": "<client_id>", "client_secret": "<client_secret>" }在本地验证时把占位符替换为真实凭据即可;而 integration_tests/invalid_config.json 与它结构相同但用于负向测试,验收测试会用它断言连接器对无效凭据返回合理的错误。
九、本地开发与测试:如何验证一个声明式连接器
README 指出,声明式连接器的本地开发与测试遵循 Airbyte 的标准流程,同时连接器特有的排查与测试建议记录在连接器目录下的CONTRIBUTING.md中。当前仓库中 Clazar 连接器未附带CONTRIBUTING.md,开发者可参考官方"本地连接器开发"指南进行。
仓库内已提供的测试资产集中在 integration_tests/ 目录:
- acceptance.py —— 验收测试入口,通过
pytest_plugins = ("connector_acceptance_test.plugin",)挂载 Airbyte 的 Connector Acceptance Test 框架,并提供一个空实现的connector_setupfixture 作为预留的外部资源初始化钩子(真实资源由 CI 环境注入); - configured_catalog.json —— 验收测试使用的目录清单,声明了 20 个流及其同步模式(业务流主键
[["id"]]、分析流无主键、全部full_refresh+overwrite); - sample_config.json / invalid_config.json —— 正/反向凭据样例。
此外,manifest.yaml 的metadata区块还保留了 Connector Builder 在测试环境中对每个流的质量快照(testedStreams):所有 20 个流均被标记为hasRecords: true、hasResponse: true、responsesAreSuccessful: true,业务流的主键还通过了唯一性与存在性校验(primaryKeysAreUnique/primaryKeysArePresent),同时记录每个流的响应哈希(streamHash)。autoImportSchema对所有流均关闭,表示 Schema 由人工维护而非自动导入。
十、发布元数据:从源码到镜像
连接器最终以 Docker 镜像形式发布,相关信息集中在 metadata.yaml:
- 定义 ID
d7df7b64-6266-45b5-ad83-e1515578f371是连接器在 Airbyte 注册表中的全局唯一标识; - 镜像
airbyte/source-clazar:0.4.67,构建基座为airbyte/source-declarative-manifest:7.28.4(metadata.yaml),即运行时由声明式清单解释器统一驱动,无需额外安装 Python 依赖,因此remoteRegistries.pypi被关闭; allowedHosts白名单api.clazar.io限制连接器只允许访问该域名;oss与cloud的registryOverrides.enabled均为true,表示同时开放给自托管(OSS)与云端用户;- 发布日期
2024-06-27,许可协议为 ELv2,状态为 alpha / community。
结语:从 YAML 到同步任务的完整链路
回顾整份 manifest.yaml,一个声明式连接器的全部能力被浓缩为清晰的配置语义:OAuthAuthenticator解决"如何认证",DefaultPaginator解决"如何翻页",DatetimeBasedCursor解决"如何增量",DpathExtractor解决"如何取数",RemoveFields解决"如何清洗",内联 Schema 解决"如何建模"。这套"零代码、可配置、可复用"的范式正是 Airbyte 低代码 CDK 的核心价值。对于需要快速接入同类 API 型数据源的团队,参照本连接器的结构编写自己的 manifest,再借助 integration_tests/ 中的验收测试资产进行验证,即可用极低的成本交付一个生产可用的源连接器。
- 数据工程
- 数据集成
- ETL
- 后端
- 大数据
【免费下载链接】airbyte
Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud.
相关推荐
Airbyte Cal.com 声明式连接器实战:基于 manifest.yaml 的调度数据同步方案
Airbyte Cal.com 声明式连接器实战:基于 manifest.yaml 的调度数据同步方案 本篇技术指南以 airbyte integrations
数据工程数据集成ETL后端大数据Airbyte PagerDuty 声明式连接器解析:基于 manifest.yaml 的低代码数据同步实践
Airbyte PagerDuty 声明式连接器解析:基于 manifest.yaml 的低代码数据同步实践 本篇技术指南以 Airbyte 仓库中 sourc
数据工程数据集成ETL后端大数据Unsloth-Gemma-4-E4B-it-QAT-oQ4部署指南:云端、边缘设备、移动端全攻略
Unsloth Gemma 4 E4B it QAT oQ4部署指南:云端、边缘设备、移动端全攻略 想要在云端、边缘设备还是移动端部署高效的多模态AI模型?Un
数据工程数据集成ETL后端大数据
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考