news 2026/5/26 7:57:17

OpenMetadata社区贡献实战:我是如何为它新增Doris连接器并成功合并PR的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenMetadata社区贡献实战:我是如何为它新增Doris连接器并成功合并PR的

OpenMetadata社区贡献实战:从零实现Doris连接器的完整指南

第一次在GitHub上看到OpenMetadata项目时,我就被它优雅的元数据管理架构所吸引。作为一个长期与数据打交道的开发者,我深知统一元数据管理的重要性。然而当我尝试将公司使用的Apache Doris接入时,却发现1.2版本尚未支持这个新兴的OLAP引擎。这成为了我向OpenMetadata提交第一个PR的契机——下面我将完整分享这次技术贡献的全过程,包括技术实现细节和社区协作经验。

1. 理解OpenMetadata连接器架构

在动手编码前,我花了三天时间系统阅读OpenMetadata的文档和源码。这个项目采用模块化设计,每个数据源连接器都由四个核心部分组成:

  1. JSON Schema定义- 位于openmetadata-spec/src/main/resources/json/schema目录,定义连接参数的验证规则
  2. 前端UI组件- 在openmetadata-ui中实现数据源配置界面
  3. Python元数据提取逻辑- 位于ingestion/src/metadata/ingestion/source/database
  4. 测试用例- 包含连接测试和元数据提取测试

以MySQL连接器为参考,我梳理出需要实现的文件结构:

openmetadata-spec/ └── src/main/resources/json/schema/ ├── entity/services/connections/database/ │ └── dorisConnection.json └── entity/data/table.json ingestion/ ├── setup.py └── src/metadata/ingestion/source/database/ └── doris/ ├── __init__.py ├── connection.py ├── metadata.py └── queries.py openmetadata-ui/ └── src/main/resources/ui/src/ ├── assets/img/service-icon-doris.png └── utils/ServiceUtils/ └── ServiceUtil.tsx

提示:在开始编码前,务必仔细阅读项目的CONTRIBUTING.md文件,了解代码风格、提交规范等要求。我最初就因为没遵循提交信息规范而被要求修改。

2. 定义Doris连接规范

创建dorisConnection.json时,我参考了MySQL的实现但做了Doris特有的调整。关键配置项包括:

{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "DorisConnection", "type": "object", "properties": { "hostPort": { "description": "格式为host:port,Doris默认FE端口为9030", "type": "string" }, "httpPort": { "description": "HTTP API端口,默认为8030", "type": "integer", "default": 8030 }, "queryPort": { "description": "MySQL协议查询端口,默认为9030", "type": "integer", "default": 9030 } }, "required": ["hostPort", "queryPort"] }

Doris特有的数据类型需要在table.json中补充:

{ "definitions": { "dataType": { "enum": [ "HLL", "BITMAP", "QUANTILE_STATE", "LARGEINT", "AGG_STATE" ] } } }

3. 实现Python元数据提取层

在Python实现部分,核心是继承Source基类并实现以下方法:

# ingestion/src/metadata/ingestion/source/database/doris/connection.py from metadata.ingestion.source.database.common_db_source import CommonDbSource class DorisSource(CommonDbSource): @classmethod def create(cls, config_dict, metadata_config): return cls(config_dict, metadata_config) def get_schema_names(self) -> Iterable[str]: query = "SHOW DATABASES" results = self.engine.execute(query) return [row[0] for row in results if row[0] not in ('information_schema')]

Doris特有的元数据查询语句放在queries.py中:

# queries.py GET_TABLE_STATISTICS = """ SELECT COUNT(*) AS row_count, SUM(data_size) AS data_size FROM information_schema.tables WHERE table_schema = %(schema)s AND table_name = %(table)s """

4. 前端集成实战

UI部分需要新增Doris的Logo和配置表单。关键步骤:

  1. 将Doris图标放入src/assets/img目录
  2. ServiceUtil.tsx中注册新的服务类型:
// ServiceUtil.tsx export enum ServiceTypes { DORIS = 'Doris', // ...其他服务类型 } export const serviceTypesConfig = { [ServiceTypes.DORIS]: { label: 'Apache Doris', value: ServiceTypes.DORIS, logo: '/assets/img/service-icon-doris.png', docLink: 'https://doris.apache.org' } };
  1. 创建连接表单组件:
<Form.Item name={['config', 'queryPort']} label="Query Port" rules={[{ required: true }]} initialValue={9030} > <InputNumber min={1} max={65535} /> </Form.Item>

5. 测试与CI/CD挑战

编写测试用例时,我遇到了几个典型问题:

  1. 连接超时:发现Doris的默认连接超时太短,需要在测试配置中调整:
testConnection: timeout: 30000 # 30秒超时
  1. 类型映射问题:Doris的BITMAP类型需要特殊处理:
def get_column_type(self, column_type: str): if 'BITMAP' in column_type: return 'ARRAY<BIGINT>' return super().get_column_type(column_type)
  1. CI环境依赖:需要在.github/workflows中添加pydoris依赖:
- name: Install dependencies run: | pip install pydoris==0.1.0 pip install -e ".[doris]"

6. 社区协作经验

PR提交后,我与维护者进行了多轮有价值的讨论:

  1. 代码审查意见

    • 建议将HTTP端口配置改为可选参数
    • 要求补充完整的单元测试覆盖率
    • 提示需要更新文档中的支持数据源列表
  2. 有效沟通技巧

    • 对每个审查意见都给出明确回应
    • 复杂修改拆分为独立commit
    • 在PR描述中详细说明测试方案
  3. 解决冲突:当主干有更新时,使用rebase而非merge:

git fetch upstream git rebase upstream/main git push -f origin doris-connector

最终PR被合并时,我总结了几个关键收获:

  • 提前在GitHub Issue中讨论方案能减少返工
  • 保持小颗粒度的提交便于审查
  • 完善的测试用例是获得信任的关键
  • 及时响应社区反馈能加速合并流程

这次贡献经历让我深刻体会到,参与开源不仅是提交代码,更是学习工程规范和协作文化的过程。当看到自己的代码被合并到主干时,那种成就感远超预期。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 7:55:28

如何突破音乐格式限制?开源工具ncmdump完整解决方案

如何突破音乐格式限制&#xff1f;开源工具ncmdump完整解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐时代&#xff0c;格式限制成为制约音乐自由传播的主要障碍。网易云音乐采用的NCM加密格式虽能保护版权&…

作者头像 李华
网站建设 2026/4/4 8:14:54

MoveIt Servo 做机械臂路径规划

MoveIt Servo 做机械臂路径规划&#xff1a;工业上标准且唯一正确的路径。MoveIt Servo 本身不做路径规划&#xff01;MoveIt Servo 只做&#xff1a;实时末端速度控制&#xff08;执行&#xff09;路径规划 MoveIt / MoveItCpp / PlanningComponent执行路径 MoveIt Servo正确…

作者头像 李华
网站建设 2026/4/2 22:56:06

Nunchaku-flux-1-dev持续集成与部署:使用GitHub Actions自动化测试与发布

Nunchaku-flux-1-dev持续集成与部署&#xff1a;使用GitHub Actions自动化测试与发布 你是不是也遇到过这样的场景&#xff1f;团队里几个人一起开发一个项目&#xff0c;每次有人提交了新代码&#xff0c;都得手动去跑测试、打包镜像、上传仓库&#xff0c;最后再登录服务器去…

作者头像 李华
网站建设 2026/4/3 5:53:08

Qwen3.5-4B-Claude-Opus基础教程:llama.cpp后端参数与Web前端映射关系

Qwen3.5-4B-Claude-Opus基础教程&#xff1a;llama.cpp后端参数与Web前端映射关系 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型&#xff0c;重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该版…

作者头像 李华
网站建设 2026/4/2 14:15:54

SentrySearch:开启自然语言检索原生 MP4 视频新时代

平时想从一堆 MP4 视频里找个特定画面&#xff0c;真的是难上加难&#xff0c;翻来覆去地拖动进度条&#xff0c;眼睛都快看瞎了。但是&#xff01;最近我发现了个神器 ——SentrySearch&#xff0c;它直接开启了自然语言检索原生 MP4 视频的新时代&#xff01;想象一下&#x…

作者头像 李华