DataHub GraphQL API 快速上手:查询、搜索、变更与错误处理实战指南
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
本文基于 DataHub 开源仓库中的 getting-started.md 编写,围绕 DataHub 提供的 GraphQL API 展开:你将掌握如何通过
/api/graphql端点读取实体(Query)、执行全文搜索(Search)、修改实体元数据(Mutation),以及如何正确解析 GraphQL 错误响应。文章结合仓库内datahub-graphql-core模块的源码实现(如SearchResolver、DataHubGraphQLErrorCode等)进行纵深讲解,让你不仅会用,更理解其底层机制。
DataHub 将组织的元数据统一建模为一张Metadata Graph(元数据图),其中的实体(Dataset、Dashboard、DataFlow 等)与关系(Ownership、Lineage、Tagging 等)均可通过其 GraphQL API 以强类型、文档化、层级化的方式编程访问。GraphQL API 的完整能力概览可先参阅 DataHub GraphQL API 总览,而端点的部署与连接方式(GraphiQL、CURL、Postman、认证)见 How To Set Up GraphQL。本文聚焦于如何使用该 API 完成三类核心操作:读、搜、写,以及错误处理。
读取实体:Queries
DataHub 为元数据图中的实体提供了一系列graphql查询字段(Query)。最典型的是按 URN 直接读取某个实体。
按 URN 查询实体
以下查询根据数据集(Dataset)的 URN 获取其urn与properties.name:
{ dataset(urn: "urn:li:dataset:(urn:li:dataPlatform:kafka,SampleKafkaDataset,PROD)") { urn properties { name } } }这是 DataHub GraphQL API 最基础的用法:以 URN 为键、以 GraphQL 选择集(Selection Set)为投影,只取你关心的字段。从源码角度看,dataset字段的解析由 DatasetType.java 承载,其中定义了读取一个 Dataset 时需要解析的 aspect 集合ASPECTS_TO_RESOLVE,包括datasetProperties、ownership、globalTags、institutionalMemory、upstreamLineage等核心元数据片段。这意味着一次dataset查询,底层会聚合多个 aspect 后再映射为 GraphQL 的Dataset对象返回,避免了客户端多次往返。
除 URN 与 properties 之外,你还可以在同一查询中获取实体的**所有者(Owners)、标签(Tags)、域(Domain)、术语(Glossary Terms)**等元数据。相关的专题教程如下:
- 查询 Dataset 的所有者
- 查询 Dataset 的标签
- 查询 Dataset 的域
- 查询 Dataset 的术语
- 查询 Dataset 的弃用状态
- 查询某个 DataFlow 下的所有 DataJob
按类型全文搜索:Search
当你不清楚目标实体的 URN,或需要按关键词检索时,应使用search(input: SearchInput!)查询字段对特定实体类型执行全文搜索:
{ search(input: { type: DATASET, query: "my sql dataset", start: 0, count: 10 }) { start count total searchResults { entity { urn type ...on Dataset { name } } } } }对上述查询的各字段含义说明如下:
search:表示执行一次搜索的查询字段;input:搜索条件,包括被搜索的实体类型(type)、搜索词(query)、结果起始下标(start)与返回条数(count);query:搜索词,可以是简单字符串,也可以是带通配符的复杂模式(见下表);searchResults.entity:命中的实体,可使用内联片段(...on Dataset)按类型取字段;total:命中的总条数,用于分页展示。
query支持的搜索模式(基于 Elasticsearch 索引的匹配语义):
| 模式 | 含义 |
|---|---|
* | 匹配所有实体 |
*[string] | 匹配所有以指定 string 开头的 aspect 命名的实体 |
[string]* | 匹配所有以指定 string 结尾的 aspect 命名的实体 |
*[string]* | 匹配所有包含指定 string 的 aspect 命名的实体 |
[string] | 匹配所有包含指定 string 的实体 |
注意:分页上限默认情况下,Elasticsearch 通过 search API 最多只能分页遍历10,000条实体。如果需要翻页更多数据,可以:
- 调整 Elasticsearch 的
index.max_result_window配置项;- 直接使用 scroll API 从索引中读取。
从源码实现看,search字段由 SearchResolver.java 解析,它定义了若干默认行为,与文档示例中的start: 0, count: 10一一对应:
- 默认
start = 0、count = 10(源码常量DEFAULT_START、DEFAULT_COUNT); - 默认开启
fulltext = true、skipCache = false、skipAggregates = false、skipHighlighting = false; - 会对查询词中的正斜杠
/做转义(ResolverUtils.escapeForwardSlash),因为它是 Elasticsearch 中的保留字符; - 底层通过
EntityClient.search(...)调用元数据服务,将结果经UrnSearchResultsMapper映射为 GraphQL 的SearchResults。
修改实体:Mutations
变更前的两个重要提醒
:::note权限校验:凡是修改实体元数据的 Mutation,都受 DataHub Access Policies 约束。DataHub 服务端会检查发起请求的 actor 是否被授权执行该操作,未授权将返回 403 类错误。 :::
:::note适用场景:DataHub 的 GraphQL Mutation主要为 UI 交互设计,在程序化使用场景中应尽量避免。Mutation 虽然已实现且可通过 API 调用,但不适用于高吞吐或批量操作(例如数据集成工作流)。
对于程序化元数据管理、数据摄取与批量操作,请改用Python SDK(随acryl-datahub包发布),其中包含了常见用例的完整示例。详细用法见 Python SDK 文档。 :::
更新已有实体
更新一个已存在的元数据实体,使用update<entityName>(urn: String!, input: EntityUpdateInput!)形式的 Mutation。例如更新一个 Dashboard 实体的描述:
mutation updateDashboard { updateDashboard( urn: "urn:li:dashboard:(looker,baz)", input: { editableProperties: { description: "My new description" } } ) { urn } }该 Mutation 携带两个核心参数:
urn:目标实体的唯一标识(String!,必填);input:EntityUpdateInput类型的变更载荷,本例中通过editableProperties.description更新用户可编辑属性(editable aspect)中的描述文本。
更多的写操作示例,请参考以下专题:
- 添加标签 / 移除标签
- 添加术语 / 移除术语
- 添加域 / 移除域
- 添加所有者 / 移除所有者
- 更新弃用状态
- 编辑 Dataset 的描述(文档)
- 编辑列的描述(文档)
- 软删除
如果你不确定某个操作该走 GraphQL 还是其他接口,可参考 DataHub API 对比与选型指南,它按使用场景给出了导航。
处理错误
GraphQL 与 REST 的一个显著差异在于:请求出错时,HTTP 状态码并不一定是非 200。错误会出现在响应体的顶层errors字段中。这种设计允许服务端在返回部分数据的同时携带错误信息,因此客户端在每次请求后都应同时检查data与errors两个字段,而不只是依赖 HTTP 状态码。
错误响应的结构
捕获 GraphQL 错误,只需检查响应中的errors字段。每个错误条目包含message、locations、path以及携带标准错误码的extensions:
{ "errors": [ { "message": "Failed to change ownership for resource urn:li:dataFlow:(airflow,dag_abc,PROD). Expected a corp user urn.", "locations": [ { "line": 1, "column": 22 } ], "path": ["addOwners"], "extensions": { "code": 400, "type": "BAD_REQUEST", "classification": "DataFetchingException" } } ] }各字段的作用:
message:人类可读的错误描述,可能附带根因(root cause)信息;locations:出错位置在请求中的行列号,便于定位问题查询;path:出错字段在查询中的路径,如["addOwners"]表示错误发生在addOwners这一级;extensions:扩展信息,其中code为标准错误码,type为错误类型名,classification为 GraphQL 层的异常分类。
官方支持的错误码
| Code | Type | Description |
|---|---|---|
| 400 | BAD_REQUEST | 查询或变更(query/mutation)格式错误(malformed)。 |
| 403 | UNAUTHORIZED | 当前 actor 未被授权执行所请求的操作。 |
| 404 | NOT_FOUND | 资源不存在。 |
| 500 | SERVER_ERROR | 服务端内部错误。请检查服务端日志或联系 DataHub 管理员。 |
错误码的源码级实现
错误码并非散落在各业务代码中,而是集中定义在 DataHubGraphQLErrorCode.java。从该枚举可以看到,仓库实现比文档表格还多了两个错误码:
CONFLICT(409):操作冲突;SERVICE_UNAVAILABLE(503):瞬时故障(transient failure),客户端可以重试(与 HTTP 503 对齐,注释中明确说明)。典型触发场景是数据库事务冲突。
也就是说,文档中列出的 400/403/404/500 是官方保证的稳定契约,而 409/503 在源码中同样存在,遇到时可按其语义处理(503 可重试)。
错误码的映射规则实现在 DataHubDataFetcherExceptionHandler.java 中。它按异常类型优先级(DataHubGraphQLException→ValidationException→IllegalArgumentException→DatabaseTransactionConflictException→IllegalStateException→RuntimeException→ 兜底)沿异常链(cause walk)匹配,然后映射到对应的DataHubGraphQLErrorCode:
DataHubGraphQLException:携带自身定义的错误码;ValidationException/IllegalArgumentException:→BAD_REQUEST(400);DatabaseTransactionConflictException:→SERVICE_UNAVAILABLE(503),提示可重试;IllegalStateException/RuntimeException/ 其他未知异常:→SERVER_ERROR(500),兜底消息为"An unknown error occurred."。
此外,该处理器在提取错误信息时会沿异常链收集所有 cause 的消息并拼接为"Root cause: ..."形式,方便定位真正的根因。这也是为什么实际返回的message往往比业务异常原文更详尽。
实战要点小结
- 连接端点:GraphQL 端点固定为
/api/graphql(仅支持 POST),浏览器调试器 GraphiQL 位于/api/graphiql。首次使用前请先完成 DataHub Quickstart 部署 并摄入一些元数据,详见 GraphQL 环境搭建指南。 - 认证方式:携带
Authorization: Bearer <access-token>请求头,Personal Access Token 会携带用户权限。令牌的创建与管理见 Access Token 管理 与 Personal Access Token 文档。 - 读操作用 Query,写操作用 Mutation,且写操作必须通过 Access Policies 授权。
- 批量与高吞吐场景请优先使用 Python SDK(
acryl-datahub),GraphQL Mutation 面向 UI 场景设计,不承担数据集成工作负载。 - 错误判断务必同时检查
data与errors,并依据extensions.code处理:400 修正请求、403 检查权限、404 核对 URN、500 查服务端日志、503(源码级)可安全重试。
至此,你已经掌握了 DataHub GraphQL API 的读、搜、写与错误处理全流程。更细粒度的 Schema 参考(Queries / Mutations / Objects / Input Objects / Enums 等)可继续翻阅 GraphQL Schema Reference 及 GraphQL 最佳实践。
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考