
DataHub APIs 与 SDK 全览在 GraphQL、OpenAPI、Python/Java SDK 与 CLI 之间做出正确选择【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub本篇技术指南以 docs/api/datahub-apis.md 为核心系统梳理 DataHub 面向元数据管理的全部接口家族——GraphQL API、OpenAPI v3 接口、Python/Java SDK 以及底层事件写入通道并给出官方推荐的选型原则、完整的能力对比矩阵、异步写入的验证边界与可运行的实操示例。读完本文你将能够根据自身用例UI 驱动的交互查询、批量元数据注入、自定义实体建模、程序化管线快速锁定正确的接口并掌握各接口的认证、容错与条件写入等关键细节。一、DataHub API 全景四种接口的定位与取舍DataHub 在平台之上提供了多套用于操作元数据的接口。核心关联文档给出了一张直观的选型表我们在此基础上补充了实现细节与仓库佐证汇总如下API定义优势局限Python SDKSDK高度灵活适合批量执行需要理解元数据变更事件MCPJava SDKSDK高度灵活适合批量执行需要理解元数据变更事件MCPGraphQL APIGraphQL 接口直观与 UI 能力镜像对齐灵活性低于 SDK需要掌握 GraphQL 语法OpenAPI面向高级用户的底层 API最强大、最灵活对简单用例而言上手门槛偏高无配套 SDK但产品内会生成 OpenAPI 规范总体而言Python 与 Java SDK 是官方最推荐用于扩展和定制 DataHub 实例行为的工具尤其适合程序化使用场景。这一点在文档中多次被强调也是后续各节选型讨论的基调。值得补充的是除了上表中的四类接口DataHub 还保留了经典的Rest.li API如ingestProposal它是 GMS 最早期的写入通道SDK 底层仍会与其兼容交互。此外官方文档还提示用户关注 CLI 命令如 docs/cli-commands/dataset.md作为运维侧的补充手段。SDK官方推荐的首选程序化方案Python 与 Java SDK 提供了完整的 CRUD 能力以及构建在 DataHub 之上的任意复杂功能官方建议大多数用例直接使用 SDK。常见的高价值场景包括在数据实体之间定义血缘lineage关系执行批量操作例如为多个数据集批量打标签创建自定义元数据实体。SDK 的本质是围绕MetadataChangeProposalMCP事件构建的发射器Emitter封装。以 Python 为例acryl-datahub包同时提供REST Emitter与Kafka Emitter两套 API分别面向“确认写入”与“高吞吐解耦”两种诉求REST Emitter基于requests模块的轻量封装提供阻塞式接口适合需要确认元数据已持久化、以及存在“写后读”场景的使用方式Kafka Emitter基于confluent-kafka的SerializingProducer提供非阻塞接口适合希望利用 Kafka 作为高可用消息总线、在 DataHub 元数据服务宕机时仍能持续采集元数据的场景。需要特别注意的是Kafka Emitter 使用Avro序列化元数据事件更换序列化器将导致事件不可被处理。Python 端两个 Emitter 的核心实现分别位于 rest_emitter.py 与 kafka_emitter.py。Java 端则由io.acryl:datahub-client包提供 REST、Kafka 与 File 三类 Emitter其中 File Emitter 可将 MCP 写入 JSON 文件随后通过 Metadata File source 离线导入适用于生产系统无法直连 GMS 或 Kafka 的场景。Python REST Emitter 实操示例import datahub.emitter.mce_builder as builder from datahub.emitter.mcp import MetadataChangeProposalWrapper from datahub.metadata.schema_classes import DatasetPropertiesClass from datahub.emitter.rest_emitter import DatahubRestEmitter # 创建指向 DataHub GMS 的 REST Emitter emitter DatahubRestEmitter(gms_serverhttp://localhost:8080, extra_headers{}) # DataHub Cloud 场景则指向托管域的 GMS 端点并携带 token # emitter DatahubRestEmitter(gms_serverhttps://your-domain.acryl.io/gms, tokenyour token, extra_headers{}) # 测试连接 emitter.test_connection() # 构造数据集属性对象 dataset_properties DatasetPropertiesClass( descriptionThis table stored the canonical User profile, customProperties{governance: ENABLED}, ) # 构造 MetadataChangeProposalWrapper 对象 metadata_event MetadataChangeProposalWrapper( entityUrnbuilder.make_dataset_urn(bigquery, my-project.my-dataset.user-table), aspectdataset_properties, ) # 阻塞式发射元数据 emitter.emit(metadata_event)发射模式Emit Mode吞吐与一致性的权衡emit()与emit_mcp()接受可选的emit_mode: EmitMode参数控制调用等待时间与一致性保证。Emitter 默认使用SYNC_PRIMARY可逐次调用覆盖也可在 Emitter 上一次性设置default_emit_mode。EmitMode调用返回时机适用场景SYNC_WAITSQL与Elasticsearch 均已更新写入后必须立即可搜索一致性最强但最慢SYNC_PRIMARY默认SQL 已更新ES 异步索引低量写入且需要“写后读”直接实体获取ASYNC变更已入队立即返回高吞吐或批量摄取可容忍最终一致ASYNC_WAIT已确认排队变更持久化希望异步批处理/并行但仍需持久化确认选型建议低量写入且需要回读或调用点即时报错 → 保持SYNC_PRIMARY若写入后必须立即可搜索则用SYNC_WAIT高吞吐或批量摄取 → 显式设置为ASYNC。默认的SYNC_PRIMARY并不适合高吞吐场景——每次写入都做同步主存储提交会给 GMS 及其底层 SQL 存储带来沉重负载。使用ASYNC需注意两个后果其一emit()不会对被拒绝或无效的写入抛出异常——调用在变更入队后即成功返回校验或持久化失败会稍后出现在 Failed-MCP topic 与消费端日志中其二不保证“写后读”任何“先写后立即读同一实体”的流程都必须容忍最终一致性。Java SDK 快速上手Java SDKV1以io.acryl:datahub-client提供Gradle 依赖声明如下implementation io.acryl:datahub-client:__version__Maven 方式则添加dependency groupIdio.acryl/groupId artifactIddatahub-client/artifactId version__version__/version /dependencyREST Emitter 采用 lambda 风格的可变构造器模式配置参数与 Python Emitter 大体镜像RestEmitter emitter RestEmitter.create(b - b .server(http://localhost:8080) // Auth token for DataHub Cloud // .token(AUTH_TOKEN_IF_NEEDED) // Override default timeout of 10 seconds // .timeoutSec(OVERRIDE_DEFAULT_TIMEOUT_IN_SECONDS) // Add additional headers // .extraHeaders(Collections.singletonMap(Session-token, MY_SESSION)) );发射 MCP 支持阻塞式Future.get()与回调式两种写法官方文档的完整示例见 as-a-library.md。值得注意的是仓库中 Java SDK 相关文档已推荐新项目优先使用Java SDK V2as-a-library-v2.md它提供类型安全的实体构造器、简化的 CRUD 操作与基于 Patch 的高效元数据更新。二、GraphQL API与 UI 能力对齐的高级查询接口graphqlAPI 是 DataHub 前端所使用的主 API。它默认带有缓存、同步操作以及其他面向 UI 的预期行为因此在程序化抓取与更新时需要谨慎——其操作在范围上被有意限制定位是简化最常见操作的高级 API。GraphQL API 很适合刚接触 DataHub 的用户尤其是配合 GraphiQL 使用时更友好、更直接。典型用例包括带条件地搜索数据集查询实体之间的关系。查询Queries读取实体以下 GraphQL 查询获取指定数据集的urn与properties.name{ dataset(urn: urn:li:dataset:(urn:li:dataPlatform:kafka,SampleKafkaDataset,PROD)) { urn properties { name } } }除 URN 与属性外还可获取某资产的所有者、标签、域、术语等元数据。相关查询指南包括查询数据集的所有者查询数据集的标签查询数据集的域查询数据集的术语查询数据集的弃用状态查询 DataFlow 下所有 DataJob搜索Search全文检索使用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 } } } } }input参数指定实体类型、查询词、起始索引与返回数量。query支持通配模式*搜索全部实体*[string]搜索方面aspect以指定字符串开头的实体[string]*搜索方面以指定字符串结尾的实体*[string]*搜索方面匹配指定字符串的实体[string]搜索方面包含指定字符串的实体。:::note 默认情况下 Elasticsearch 只允许通过 search API 分页浏览 10,000 个实体。如需更多可调整 ES 的index.max_result_window配置或使用 scroll API 直接读取索引。 :::变更Mutations更新实体变更实体元数据的 Mutations 受 DataHub Access Policies 约束服务端会校验请求方 actor 是否被授权执行该操作。同时官方明确提示GraphQL mutations 主要面向 UI 交互设计程序化用例应避免使用——它们不适合数据集成工作流中的高吞吐或批量场景。程序化元数据管理、数据摄取与批量操作请使用 Python SDK。以更新 Dashboard 实体为例mutation updateDashboard { updateDashboard( urn: urn:li:dashboard:(looker,baz), input: { editableProperties: { description: My new description } } ) { urn } }更多变更操作指南添加标签 / 移除标签添加术语 / 移除术语添加域 / 移除域添加所有者 / 移除所有者更新弃用状态编辑数据集/列的描述文档软删除错误处理检查 data 与 errors 两个字段GraphQL 请求出错时并不总是返回非 200 的 HTTP 响应体。错误会出现在响应体顶层的errors字段中这允许客户端优雅地处理应用服务器返回的部分数据。因此每次请求后必须同时检查data与errors字段。错误对象包含 message、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 } } ] }官方支持的错误码如下CodeTypeDescription400BAD_REQUEST查询或变更格式错误403UNAUTHORIZED当前 actor 未被授权执行请求的操作404NOT_FOUND资源不存在500SERVER_ERROR发生内部错误请检查服务器日志或联系 DataHub 管理员三、OpenAPI面向高级用户的底层 REST 接口OpenAPI 标准是广泛使用的 REST 风格 API 文档化与设计方法。DataHub 基于此发布了一套 OpenAPI 端点方便第三方系统深度集成。详细的使用指南见 openapi-usage-guide.md。定位 OpenAPI 端点OpenAPI 端点当前隔离在 GMS 上的一个独立 Servlet 中随 GMS 自动部署。该 Servlet 内建自动生成的 OpenAPI UI即 Swagger访问路径为GMS_SERVER_HOST:GMS_PORT/openapi/swagger-ui/index.html本地 Quickstart 对应 http://localhost:8080/openapi/swagger-ui/index.html。前端也会以代理方式暴露同一端点将 GMS 主机与端口替换为前端 URL本地 Quickstart 对应 http://localhost:9002/openapi/swagger-ui/index.html并可在用户头像右上角下拉菜单中直接打开。原始 JSON/YAML 格式的 OpenAPI 规范可通过BASE_URL/openapi/v3/api-docs或BASE_URL/openapi/v3/api-docs.yaml获取可喂给 codegen 系统生成任意语言的客户端代码不同语言 codegen 成熟度不一可能需要定制。UI 中的请求/响应对象 Schema 均在构建期由 PDL 模型自动生成。从仓库源码看metadata-service/openapi-servlet模块中的 SpringWebConfig.java 按包名划分了 v1/v2 等不同版本的端点集合印证了 OpenAPI Servlet 是随 GMS 统一装配的独立 REST 层。主要端点分类端点用途/entities对元数据图进行读写。整个 DataHub 元数据模型都可以以“实体 方面aspect”的形式写入或按需读取单个实体的元数据/relationships查询图结构从一个实体导航到其他实体的关系/timeline查询指定实体的版本化历史例如数据集的所有 Schema 变更或文档变更记录详见 timeline 指南/platform更底层的 API允许以标准格式将元数据事件写入 DataHub 平台实体端点实操UPSERT / CREATE / GET / DELETEUPSERTPOST不带额外 URL 参数的 POST 执行方面 UPSERT实体不存在则创建、存在则更新curl --location --request POST localhost:8080/openapi/entities/v1/ \ --header Content-Type: application/json \ --header Accept: application/json \ --header Authorization: Bearer token \ --data-raw [ { aspect: { __type: SchemaMetadata, schemaName: SampleHdfsSchema, platform: urn:li:dataPlatform:platform, platformSchema: { __type: MySqlDDL, tableSchema: schema }, version: 0, created: { time: 1621882982738, actor: urn:li:corpuser:etl, impersonator: urn:li:corpuser:jdoe }, lastModified: { time: 1621882982738, actor: urn:li:corpuser:etl, impersonator: urn:li:corpuser:jdoe }, hash: , fields: [ { fieldPath: county_fips_codefg, jsonPath: null, nullable: true, description: null, type: { type: { __type: StringType } }, nativeDataType: String(), recursive: false }, { fieldPath: county_name, jsonPath: null, nullable: true, description: null, type: { type: { __type: StringType } }, nativeDataType: String(), recursive: false } ] }, entityType: dataset, entityUrn: urn:li:dataset:(urn:li:dataPlatform:platform,testSchemaIngest,PROD) } ]CREATEPOST createEntityIfNotExiststrue仅当实体不存在时写入实体已存在则返回错误而非覆盖curl --location --request POST localhost:8080/openapi/entities/v1/?createEntityIfNotExiststrue \ --header Content-Type: application/json \ --header Accept: application/json \ --header Authorization: Bearer token \ --data-raw see previous example实体已存在时返回如下 422 错误422 ValidationExceptionCollection{EntityAspect:(urn:li:dataset:(urn:li:dataPlatform:platform,testSchemaIngest,PROD),schemaMetadata) Exceptions: [com.linkedin.metadata.aspect.plugins.validation.AspectValidationException: Cannot perform CREATE if not exists since the entity key already exists.]}GET读取最新方面curl --location --request GET localhost:8080/openapi/entities/v1/latest?urnsurn:li:dataset:(urn:li:dataPlatform:platform,testSchemaIngest,PROD)aspectNamesschemaMetadata \ --header Accept: application/json \ --header Authorization: Bearer tokenDELETE软删除curl --location --request DELETE localhost:8080/openapi/entities/v1/?urnsurn:li:dataset:(urn:li:dataPlatform:platform,testSchemaIngest,PROD)softtrue \ --header Accept: application/json \ --header Authorization: Bearer token其中softtrue默认表示软删除softfalse则为硬删除。官方使用指南中还附带了一份完整的 Postman Collection含 POST/GET/DELETE 与 SchemaMetadata 方面的示例可直接导入调试。关系端点实操GET示例——查询与用户datahub具有IsPartOf入向关系的实体curl -X GET \ http://localhost:8080/openapi/relationships/v1/?urnurn%3Ali%3Acorpuser%3AdatahubrelationshipTypesIsPartOfdirectionINCOMINGstart0count200 \ -H accept: application/json示例响应{ start: 0, count: 2, total: 2, entities: [ { relationshipType: IsPartOf, urn: urn:li:corpGroup:bfoo }, { relationshipType: IsPartOf, urn: urn:li:corpGroup:jdoe } ] }程序化使用Java Rest EmitterOpenAPI 模型的程序化使用可通过包含生成模型的 Java Rest Emitter 完成。最小 Java 项目需要以下依赖Gradle 格式dependencies { implementation io.acryl:datahub-client:DATAHUB_CLIENT_VERSION implementation org.apache.httpcomponents:httpclient:APACHE_HTTP_CLIENT_VERSION implementation org.apache.httpcomponents:httpasyncclient:APACHE_ASYNC_CLIENT_VERSION }通过构造UpsertAspectRequest列表向/platform/entities/v1端点批量发射元数据事件import io.datahubproject.openapi.generated.DatasetProperties; import datahub.client.rest.RestEmitter; import datahub.event.UpsertAspectRequest; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; public class Main { public static void main(String[] args) throws IOException, ExecutionException, InterruptedException { RestEmitter emitter RestEmitter.createWithDefaults(); ListUpsertAspectRequest requests new ArrayList(); UpsertAspectRequest upsertAspectRequest UpsertAspectRequest.builder() .entityType(dataset) .entityUrn(urn:li:dataset:(urn:li:dataPlatform:bigquery,my-project.my-other-dataset.user-table,PROD)) .aspect(new DatasetProperties().description(This is the canonical User profile dataset)) .build(); UpsertAspectRequest upsertAspectRequest2 UpsertAspectRequest.builder() .entityType(dataset) .entityUrn(urn:li:dataset:(urn:li:dataPlatform:bigquery,my-project.another-dataset.user-table,PROD)) .aspect(new DatasetProperties().description(This is the canonical User profile dataset 2)) .build(); requests.add(upsertAspectRequest); requests.add(upsertAspectRequest2); System.out.println(emitter.emit(requests, null).get()); System.exit(0); } }四、OpenAPI v3 进阶特性条件写入、批量读取与通用 Patch条件写入Conditional Writes所有方面的 create/POST 端点都在 POST body 中支持headers以支撑批量 API。这些 header 用于实现条件写入语义详细文档见 MetadataChangeProposal 与 MetadataChangeLog 事件。其核心机制包括If-Version-Match方面每次更新都会递增一个version并存入SystemMetadata。写入方可在请求中携带期望版本若不匹配则写入失败从而防止覆盖其他进程已修改的方面。若方面尚不存在其版本为-1可借此实现“仅创建”语义。If-Modified-Since/If-Unmodified-Since基于时间的条件写入日期须符合 ISO-8601 标准防止目标方面在读取后被修改时仍执行写入。Change TypeCREATE/CREATE_ENTITY分别表示“方面不存在才创建”与“实体无任何方面才创建”。默认违反约束会抛出校验异常若希望丢弃该写入而不视为异常可附加 headerIf-None-Match: *。批量读取Batch Get所有实体都存在/v3/entity/{entityName}/batchGet形式的批量读取端点可一次获取实体及其多个方面默认返回最新版本结合If-Version-Matchheader 可检索指定版本。该接口目前每个实体/方面仅返回单一版本但不同实体之间可指定不同版本。示例请求——携带systemMetadatatrue以查看方面当前版本[ { urn: urn:li:dataset:(urn:li:dataPlatform:hive,fct_users_deleted,PROD), globalTags: {}, datasetProperties: {} }, { urn: urn:li:dataset:(urn:li:dataPlatform:hive,fct_users_created,PROD), globalTags: {}, datasetProperties: {} } ]响应中systemMetadata会携带每个方面的version。当对第二个 URN 的globalTags追加一个新标签后该方面的版本会从1递增为2随后使用If-Version-Match: 1的 headers 即可回读前一版本。完整往返示例见 openapi-usage-guide.md。通用 Patching基于 RFC 6902 的数组主键扩展OpenAPI v3 的 PATCH 端点消除了以往 Patch 对后端专用代码的依赖它基于 JSON Patch 标准RFC 6902并针对数组操作做了显著增强。为保持向后兼容默认仍使用传统 Patch 模板当arrayPrimaryKeys非空或forceGenericPatch为true时启用通用 Patch。标准 JSON Patch 对数组只支持基于索引的操作add/[index]、remove/[index]、replace/[index]在数组顺序不可预测、多客户端并发修改或客户端不知道当前索引时会产生问题。DataHub 通过arrayPrimaryKeys字段将数组操作转换为类 Map 操作数组在概念上被视为 Map每个元素可由其主键寻址主键可以是复合的多个字段组合路径表达式使用这些键而非数字索引后端负责在 Map 式操作与实际数组修改之间转换。这带来了幂等与数组顺序无关、定向修改无需知道当前数组状态、并发无冲突修改不同数组元素时以及更直观的 API 使用体验。主键定义与路径构造示例——为globalTags方面添加带来源attribution归属的标签{ arrayPrimaryKeys: { tags: [attribution␟source, tag] }, patch: [ { op: add, path: /tags/urn:li:platformResource:source1/urn:li:tag:tag1, value: { tag: urn:li:tag:tag1, attribution: { source: urn:li:platformResource:source1, actor: urn:li:corpuser:user, time: 0 } } } ] }其中tags是被 Patch 的数组字段主键是attribution.source与tag的复合␟Unit SeparatorU241F分隔符表示第一个键分量中的嵌套路径。路径/tags/urn:li:platformResource:source1/urn:li:tag:tag1中系统将urn:li:platformResource:source1作为attribution.source的值、urn:li:tag:tag1作为 tag 的值据此匹配数组元素。当前实现支持的标准 JSON Patch 操作OperationDescriptionadd添加新元素若键匹配的元素已存在则替换remove按键移除匹配的元素remove操作示例{op: remove, path: /tags/urn:li:platformResource:source1/urn:li:tag:tag1}它会仅移除匹配复合键的元素即使其他元素存在部分匹配的键也会被保留。五、深入理解 MCP/MCL所有写入通道的共同底层无论是 SDK、OpenAPI 还是 Rest.li所有元数据写入最终都会落到MetadataChangeProposalMCP事件流上由 GMS 校验后产生MetadataChangeLogMCL供下游消费。理解这一层是“为什么 SDK 需要理解元数据变更事件”这一局限的根源其完整模型见 mcp-mcl.md。MCP 的核心字段包括entityType实体类型如 dataset、chart、entityUrn实体 URN与entityKeyAspect二选一、changeType变更类型UPSERT、CREATE、CREATE_ENTITY、UPDATE、DELETE、PATCH当前仅支持前五者与PATCH、aspectName、aspectGenericAspect含value与contentType目前仅支持application/json以及systemMetadata与headers。写入的原子单元是单个方面。异步 GMS 写入的验证边界官方重点警告关联文档特别强调了一个容易混淆的关键点——GMS 的异步写入asynctrue与直连 Kafka 生产事件有着本质区别GMS 异步接受 ≠ 跳过校验当你通过 GMS APIRest.liingestProposal、OpenAPI 实体写入以及针对这些端点的 SDK 客户端以asynctrue提交 MCP 时GMS 会在接受请求之前运行完整的提案校验管线包括 Schema 检查、实体级授权isAPIAuthorized以及已注册的方面负载校验器例如标签权限约束、logicalParent等特定方面的授权。未授权或无效的提案会以 403/422 被同步拒绝不会发布到 Kafka。异步仅指主存储提交延迟asynctrue只表示 GMS 不在接受时把写入提交到主存储而是将 MCP 发布到MetadataChangeProposaltopic之后由 MCE consumer 以asyncfalse应用。此阶段发生的失败如预提交校验或存储错误会进入Failed MCP topic不会回传给最初的 API 调用方。不要混淆异步 GMS 摄取与直接 Kafka 生产直接向MetadataChangeProposaltopic 写入 MCP 会绕过GMS 接受时的授权与校验。MCE consumer 在系统上下文下处理这些消息并非第二道用户授权闸门。因此必须对 Kafka 的访问权限加以限制。这一边界也解释了 Python SDK 中ASYNC发射模式的语义调用成功只代表“变更已入队”校验/持久化失败将稍后在 Failed-MCP topic 与消费端日志中显现。条件写入与同步索引更新除上述If-Version-Match、If-Modified-Since等条件写入 header 外MCP 还支持X-DataHub-Sync-Index-Update: true默认 Elasticsearch 更新是异步的添加该 header 可对特定 MCP 启用同步索引更新方面大小校验可通过环境变量与datahub.validation.aspectSize配置prePatch/postPatch两阶段warnSizeBytes仅告警不阻断maxSizeBytes默认 16MB 并配合IGNORE/DELETE补救策略用于防护超大方面的写入。相关 Kafka Topic 一览Topic作用MetadataChangeProposal_v1异步摄取到 GMS 的提案流失败会产出 Failed MCPFailedMetadataChangeProposal_v1摄取失败的提案MetadataChangeLog_Versioned_v1版本化方面的变更日志默认保留 7 天MetadataChangeLog_Timeseries_v1时间序列方面的变更日志默认保留 90 天可回放备份六、DataHub API 能力对比矩阵下表源自关联文档的官方对比最后更新2024-02-16覆盖 GraphQL、Python SDK 与 OpenAPI 三类接口在常见元数据操作上的能力差异。最显著的模式是凡是涉及“创建/新增”的操作GraphQL 大多不支持而 Python SDK 与 OpenAPI 均支持✅——这与“GraphQL 面向 UI 交互、SDK/OpenAPI 面向程序化写入”的定位完全一致。FeatureGraphQLPython SDKOpenAPICreate a Dataset✅ [Guide]✅Delete a Dataset (Soft Delete)✅ [Guide]✅ [Guide]✅Delete a Dataset (Hard Delete)✅ [Guide]✅Search a Dataset✅ [Guide]✅✅Read a Dataset Deprecation✅✅✅Read Dataset Entities (V2)✅✅✅Create a Tag✅ [Guide]✅ [Guide]✅Read a Tag✅ [Guide]✅ [Guide]✅Add Tags to a Dataset✅ [Guide]✅ [Guide]✅Add Tags to a Column of a Dataset✅ [Guide]✅ [Guide]✅Remove Tags from a Dataset✅ [Guide]✅ [Guide]✅Create Glossary Terms✅ [Guide]✅ [Guide]✅Read Terms from a Dataset✅ [Guide]✅ [Guide]✅Add Terms to a Column of a Dataset✅ [Guide]✅ [Guide]✅Add Terms to a Dataset✅ [Guide]✅ [Guide]✅Create Domains✅ [Guide]✅ [Guide]✅Read Domains✅ [Guide]✅ [Guide]✅Add Domains to a Dataset✅ [Guide]✅ [Guide]✅Remove Domains from a Dataset✅ [Guide]✅ [Guide]✅Create / Upsert Users✅ [Guide]✅ [Guide]✅Create / Upsert Group✅ [Guide]✅ [Guide]✅Read Owners of a Dataset✅ [Guide]✅ [Guide]✅Add Owner to a Dataset✅ [Guide]✅ [Guide]✅Remove Owner from a Dataset✅ [Guide]✅ [Guide]✅Add Lineage✅ [Guide]✅ [Guide]✅Add Column Level (Fine Grained) Lineage✅ [Guide]✅Add Documentation (Description) to a Column of a Dataset✅ [Guide]✅ [Guide]✅Add Documentation (Description) to a Dataset✅ [Guide]✅ [Guide]✅Add / Remove / Replace Custom Properties on a Dataset✅ [Guide]✅Add ML Feature to ML Feature Table✅ [Guide]✅Add ML Feature to MLModel✅ [Guide]✅Add ML Group to MLFeatureTable✅ [Guide]✅Create MLFeature✅ [Guide]✅Create MLFeatureTable✅ [Guide]✅Create MLModel✅ [Guide]✅Create MLModelGroup✅ [Guide]✅Create MLPrimaryKey✅ [Guide]✅Read MLFeature✅ [Guide]✅ [Guide]✅Read MLFeatureTable✅ [Guide]✅ [Guide]✅Read MLModel✅ [Guide]✅ [Guide]✅Read MLModelGroup✅ [Guide]✅ [Guide]✅Read MLPrimaryKey✅ [Guide]✅ [Guide]✅Create Data Product✅ [Code]✅Create Lineage Between Chart and Dashboard✅ [Code]✅Create Lineage Between Dataset and Chart✅ [Code]✅Create Lineage Between Dataset and DataJob✅ [Code]✅Create Finegrained Lineage as DataJob for Dataset✅ [Code]✅Create Finegrained Lineage for Dataset✅ [Code]✅Create DataJob with Dataflow✅ [Code]✅Create Programmatic Pipeline✅ [Code]✅注表中 Python SDK 一列的原版链接指向 GitHub 上metadata-ingestion/examples/library/目录下的示例脚本本文已按当前仓库结构转换为对应的仓库相对路径便于读者直接查看可运行的示例代码。七、选型决策建议与深入学习路径综合上述 API 定位、能力矩阵与底层事件模型给出如下选型建议UI 能力范围内的交互式查询与更新搜索、关系查询、软删除、打标/术语/域/所有者等→ 优先考虑GraphQL API其能力与前端镜像对齐、上手直观且天然支持 UI 场景的缓存与同步语义程序化批量写入、数据摄取、自定义实体建模、血缘注入、列级精细血缘→ 使用Python SDK / Java SDK官方最推荐并配合ASYNC发射模式换取吞吐需要最底层、最强灵活的写入能力如直接 UPSERT/CREATE 任意实体方面、批量读取、版本化回读、通用 Patch→ 使用OpenAPI v3其规范可自动生成客户端代码离线/解耦场景→ 使用Kafka Emitter或 JavaFile Emitter将元数据先写入消息总线或 JSON 文件再异步导入安全红线任何情况下都不要绕过 GMS 直接向 Kafka 写入 MCP以免失去授权与校验保护。继续深入的学习路径Python SDK / Emitter 完整指南Java SDK / Emitter 完整指南 与 Java SDK V2GraphQL 入门指南、GraphQL 最佳实践 与 GraphQL 端点开发指南OpenAPI 使用指南MCP/MCL 事件模型详解API 分场景教程合集数据集、标签、术语、域、所有者、血缘、描述、自定义属性、ML 实体等【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考