十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DataHub Cube 连接器深度指南:语义层元数据、血缘与 Cloud 认证全解析

DataHub Cube 连接器深度指南:语义层元数据、血缘与 Cloud 认证全解析 DataHub Cube 连接器深度指南语义层元数据、血缘与 Cloud 认证全解析【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub本指南完整讲解 DataHub 官方 Cube 语义层连接器source.type: cube的元数据摄入能力它将 Cube Core / Cube Cloud 中的 cubes、views、measures、dimensions 建模为 DataHub 数据集与 Schema 字段并打通「数仓 → Cube → View → Chart → Dashboard」的完整血缘链路。读完本文你将掌握连接器的能力边界、Cloud 双端点认证与元数据合并机制、血缘配置的每一种开关以及常见故障的定位与修复方法。一、连接器概览Cube 是一个语义层semantic layer平台它在原始数仓表之上定义了一组数据模型data model把复杂 SQL 抽象为业务可读的cubes多维数据立方体与views视图并通过 measures度量与 dimensions维度对外提供一致的指标口径。DataHub 的 Cube 连接器读取这一数据模型并写入 DataHub让语义层资产纳入统一的数据目录。摄入后每一个 cube 和 view 都会成为一个 DataHub 数据集其 measures 与 dimensions 被建模为 Schema 字段并统一归入一个代表 Cube 部署deployment的容器container之下。连接器同时兼容两种部署形态详见 cube_pre.md 与 cube_recipe.ymlCube Coredeployment_type: CORE——自托管实例元数据来自GET /v1/metaREST 端点Cube Clouddeployment_type: CLOUD——启用use_metadata_api后额外读取 Cube Cloud 的 Metadata API/v1/entities、/v1/data-sources从而获得指向上游数仓表的血缘。在源码层面连接器由 cube.py 中的CubeSource类驱动其能力声明capability装饰器显示它默认支持容器Containers、Schema 元数据、描述Descriptions、连接测试TEST_CONNECTION并可通过meta_mapping支持所有权、标签、术语表、域以及粗粒度/细粒度血缘。需要注意的是该连接器当前标注为ALPHA支持状态见 cube.py。二、摄入的核心元数据能力1. Cubes 与 ViewsCubes 以数据集dataset形式摄入子类型subtype为CubeViews 默认以数据集形式摄入子类型为Semantic Model与 dbt 语义层模型相同的子类型设置emit_semantic_model_entities: true后每个 view 改而作为一等公民的semanticModel实体发出其包含的 cubes 变成逻辑数据集子类型Semantic Model Dataset与 Cube 数据集建立血缘且 view 的每个 measure 都会成为一个metric实体。该模式下不再发出 view 数据集本身因此需要用有状态摄入stateful ingestion重新摄入一次以清理旧的 view 数据集。该功能要求 DataHub 服务端注册semanticModel/metric实体Cloud ≥ 2.1.0或 OSS 设置METRICS_ENABLEDtrue所有 cubes 与 views 归入一个代表部署的容器容器外链指向部署 UI默认从api_url推导也可用deployment_url显式指定。容器与外链的实现在 cube.pyCubeDeploymentKey由 platform、platform instance、env 和 deployment 名组成其中 deployment 名默认取api_url的 hostname设置platform_instance时优先使用它。2. Schemameasures 与 dimensions 成为字段每个 measure 和 dimension 对应一个 Schema 字段measures 的 native data type 携带聚合类型如count、sum见 cube.py主键primary key维度被标记为字段 key 的一部分isPartOfKey字段会打上Measure或Dimension标签时间维度额外打上Temporal标签可用tag_measures_and_dimensions: false关闭。Cube 原生数据类型到 DataHub Schema 字段类型的映射定义在 constants.pystring→String、number→Number、time→Time、boolean→Boolean、date→Dategeo因没有对应 DataHub 原始类型而映射为 String。未知类型时measure 兜底为 Number、dimension 兜底为 String。3. 描述与属性titles、descriptions、segment 名称、源文件名fileName、以及模型中任意自定义的meta都会被摄入。数据集的自定义属性custom properties至少包含type、measures数量、dimensions数量可选地包含file_name、segments、hidden以及meta.*前缀的原始 meta 键值见 cube.py。4. 结构元数据emit_member_detailsjoins含 relationship、hierarchies含 levels、folders/嵌套 folders含 members、pre-aggregation 名称均作为数据集自定义属性捕获形如join.name、hierarchy.name、folder.name、pre_aggregations。用emit_member_details: false可整体关闭。5. Measure 展示提示每个 measure 的format、drill-down members 和 cumulative 标志以jsonProps的形式存储在 Schema 字段上见 cube.py为下游 UI 呈现提供素材。6. 隐藏成员hidden membersCube 中标记为public: false或isVisible: false的 cubes、views 和成员默认被跳过设置include_hidden: true后才会摄入。CubeEntity.visible_members()在 models.py 中实现_is_hidden()同时识别新旧两个标志位models.py。7. Tags、Glossary、Owners、Domains 与文档链接这些治理元数据通过meta_mapping作用于 cube/view 的meta和column_meta_mapping作用于成员meta从 Cube 模型中的meta块推导语法与 dbt 连接器一致。域名除了可由 meta 映射产生还可通过domain配置按名称正则匹配分配。在 cube.py 的_emit_entity_meta中可以看到OperationProcessor会依次处理 ADD_OWNER、ADD_TAG、ADD_TERM、ADD_DOC_LINK 四种操作并合并 meta 映射与 pattern 两种途径产生的 domain。单元测试 test_cube_source.py 中的test_meta_mapping_emits_owner_tag_and_term、test_datahub_meta_block_emits_domain、test_pattern_domain_assignment分别验证了这些行为。8. Reports 与 Workbooks仅 Cube CloudCube Cloud 中保存的 reports 会成为 DataHub 的charts并携带指向其所查询 cubes/views 的输入血缘workbooks 会成为 DataHub 的dashboards包含这些 charts。所有者与标题会一并带过来。可用include_reports: false/include_workbooks: false关闭或用report_pattern/workbook_pattern过滤。实现上report 的输入实体从jsonQuery中解析连接器遍历 measures、dimensions、segments、timeDimensions、filters取每个cube/view.member引用的前缀作为上游实体见 models.py 的_entities_from_query_members。三、血缘体系include_lineage默认开启血缘分三段构成实现在 cube_lineage.py1. View → Cube数据集模式下views 与构建它们的 cubes 建立血缘并包含由每个成员的aliasMember推导的列级血缘语义模型模式下这一跳变为metric→ 逻辑数据集 → Cube 数据集。2. Cube → 数仓Cube Cloud开启 Metadata API直接从 API 读取table_references/column_references表和列引用精确且无需 SQL 解析Cube Core从每个 cube 的 SQL 定义解析表级血缘前提是同时设置parse_sql_for_lineage默认 true与warehouse_platform。SQL 解析使用 sqlglot 驱动且以warehouse_platform决定方言如 mssql→tsql、athena→trino见 cube_lineage.pyCube Core 列级血缘是 best-effort因为/v1/meta不暴露每个成员背后的 SQL连接器按成员名与上游表的列名匹配依赖 DataHub 中已摄入的数仓 schema。因此数仓必须先摄入且成员名与底层列名不一致的情况如聚合 measure无法建立列级链接。3. Report/Workbook → ViewCube Cloud 上chartsreports携带指向其查询的 cubes/views 的输入血缘dashboardsworkbooks包含这些 charts从而延伸出完整链路warehouse → cube → view → chart → dashboard。当emit_semantic_model_entities开启时查询过 view 的 report 指向该 view 的逻辑数据集而非 view 数据集。4. 关闭列级血缘用include_column_lineage: false可只保留粗粒度表级血缘。CubeLineageBuilder.build()cube_lineage.py是所有血缘贡献的汇总点它聚合数仓表 URN、数仓列级血缘、cube 引用血缘去重后统一输出UpstreamLineageClass。一个值得注意的实现细节血缘 URN 的大小写处理。当连接到真实 DataHub 实例时连接器会通过SchemaResolver查询数仓在 DataHub 中已摄入的真实 schema把 Cube 报告的标识符如 Postgres/Redshift 的小写、Snowflake 的大写、BigQuery 的大小写敏感对齐到数仓连接器实际摄入的大小写当数仓尚未摄入无 graph 可查时则退回配置行为默认把上游表名与列名转小写见 cube_lineage.py 与_warehouse_urn/_warehouse_column。四、Cube Cloud 认证与元数据合并机制Cube Cloud 上连接器同时读取两个端点并合并结果/v1/meta提供结构化与展示性元数据——joins、hierarchies、folders、formats、visibilityMetadata API/v1/entities、/v1/data-sources提供数仓与列级血缘。合并逻辑在 cube_api.py 与 models.py 的merge_entities中以/v1/meta的结构为基底用 Metadata API 的血缘信息table_references、cube_references、成员的column_references、member_references覆盖上去/v1/meta遗漏的实体如public: false的 cube也会被并入。这样一次 Cloud 摄入得到两者之和。Metadata API 的 Token 供给方式Metadata API 需要 metadata 作用域的 JWT有两种途径在api_token中直接提供预生成的 metadata token让连接器自动铸造设置cloud_api_keyCube Cloud 控制台 Account → API keys 获取配合deployment_id与environment_id。连接器会调用 Control Plane 的tokens-for-meta-sync端点路径模板见 constants.py获得一个短期、仅限 metadata 的 token。cloud_api_url用于覆盖 Control Plane 主机默认取自api_url的 hostsecurity_context用于限定多租户可见范围meta_sync_token_expires_in默认 86400 秒控制铸造 token 的过期时间。铸造流程实现在 cube_api.py 的_mint_meta_sync_token向 Control Plane 发送POSTbody 携带security_context与expires_in以Bearer cloud_api_key认证。认证头细节见_auth_header_value——Cube REST API/v1/meta期望裸的 data JWT而 Cloud Metadata API 期望Bearer前缀的 metadata token。优雅降级若 Metadata API 不可达连接器只记录一条 warning 并继续以/v1/meta完成摄入保留结构化元数据与 view→cube 血缘但没有数仓血缘不会中断整个运行见 cube_api.py。API 客户端还内置了重试策略最多 3 次、退避因子 1对 429/500/502/503/504 重试见 constants.py。五、Reports 与 WorkbooksPlatform APIReports 与 Workbooks 来自 Cube Cloud 的Platform API用 Cube Cloud API key 以Bearertoken 认证。设置cloud_api_key与deployment_id即可启用environment_id对 reports/workbooks不是必需的——它只在铸造 Metadata API token 时需要。当二者缺失、或是 Cube Core 部署时report/workbook 摄入会被静默跳过Platform API 调用失败只记录 warning不会中止运行见 cube_api.py。Platform API 是 cursor 分页结构itemspageInfo每页 100 条连接器会流式翻页直到hasNextPage为 false。workbook 的 chart 归属来自publishedDashboard.reportSnapshots若 workbook 引用了 Reports API 未返回的 report_id连接器会给出 warning 并在 dashboard 中跳过该 chartcube.py。六、多租户与上下文变量Cube 的上下文变量COMPILE_CONTEXT、SECURITY_CONTEXT、FILTER_PARAMS、FILTER_GROUP、SQL_UTILS是数据模型创作期的构造不是 API 暴露的结构化元数据因此没有独立的东西可摄入。它们只对连接器产生间接影响COMPILE_CONTEXT多租户Cube 会按 security context 编译出不同的数据模型。连接器摄入的是与它携带的 token 的 security context 相匹配的那一份编译模型铸造 token 时设置security_context或依赖直接提供的api_token中内嵌的 claims。要编目多个租户需要每个租户跑一次摄入——但它们的 cubes/views 名称相同必须用platform_instance/env或cube_pattern/view_pattern加以区分避免 URN 冲突FILTER_PARAMS/SQL_UTILScube SQL 中/v1/meta返回的 SQL 已是编译后的FILTER_PARAMS渲染为默认值、COMPILE_CONTEXT已解析因此 Cube Core 的 SQL 血缘解析作用于已解析的 SQL且解析被防御性地包裹——若模板仍无法解析只会记录sql_parsing_failures并继续。Cube Cloud 上 Metadata API 直接返回解析好的table_references/column_references模板化问题在此不适用。七、完整配置参考最小可运行配置取自 cube_recipe.ymlsource: type: cube config: # Base URL of the Cube REST API, including the base path. api_url: https://your-deployment.cubecloud.dev/cubejs-api api_token: ${CUBE_API_TOKEN} # CORE (self-hosted) or CLOUD. deployment_type: CLOUD # Connect cubes to their upstream warehouse tables. Auto-detected on Cube # Cloud via the Metadata API; set explicitly for Cube Core. # warehouse_platform: snowflake # warehouse_database: ANALYTICS # Emit Cube views as first-class semanticModel / metric entities instead of # a view dataset. Cubes stay Cube datasets. Requires a server that registers # those entities (Cloud 2.1.0, or OSS with METRICS_ENABLEDtrue). # emit_semantic_model_entities: true # Cube Cloud only: ingest reports as charts and workbooks as dashboards, and # auto-mint a Metadata API token. cloud_api_key deployment_id are required; # environment_id is needed only for the Metadata API token. # cloud_api_key: ${CUBE_CLOUD_API_KEY} # deployment_id: 12345 # environment_id: production stateful_ingestion: enabled: true sink: type: datahub-rest config: server: http://localhost:8080前提条件方面详见 cube_pre.mdAPI tokenCube Core 用CUBEJS_API_SECRET签发的 JWTCube Cloud 的/v1/meta可从 Playground → API 复制或自行签名Cube Cloud Metadata API 则需 Control Plane 签发的 token或让连接器自动铸造api_urlCore 为http://localhost:4000/cubejs-apiCloud 为https://deployment.cubecloud.dev/cubejs-api默认 base path 为/cubejs-api见 constants.py数仓血缘可选设置warehouse_platform如snowflake、bigquery、postgres以及若已有数据集使用warehouse_platform_instance与warehouse_env。Cube Cloud 开启 Metadata API 后会自动检测数仓平台与数据库从/v1/data-sources的 data source type 映射映射表见 constants.py覆盖 Postgres、Redshift、Snowflake、BigQuery、MySQL、MSSQL、ClickHouse、Databricks、Athena、Trino、Presto、Druid、Oracle、Hive、DuckDB、Firebolt 等Cube Core 则设置parse_sql_for_lineage从 cube SQL 推导表级血缘。完整参数说明如下定义均见 config.py参数默认值说明api_url必填Cube REST API 基础 URL含 base path须以 http(s):// 开头api_token必填认证 tokenCore 为CUBEJS_API_SECRET签发的 JWTCloud Metadata API 则用 Control Plane 签发的 metadata tokendeployment_typeCORECORE或CLOUDuse_metadata_apitrue仅 Cloud启用 Metadata API/v1/entities获取数仓与列级血缘并与/v1/meta合并关闭则只用/v1/metacloud_api_key无Cloud Control Plane API keyAccount → API keys与deployment_id配合启用 Platform API 并支持自动铸造 Metadata tokencloud_api_url无Control Plane 基础 URL未设置时从api_url的 schemehost 推导deployment_id无Cloud deployment id用于铸造 Metadata token 与访问 Platform APIenvironment_id无Cloud environment id仅铸造 Metadata token 时需要security_context{}嵌入铸造 token 的 security context控制多租户可见范围meta_sync_token_expires_in86400铸造的 Metadata token 过期秒数默认 24 小时request_timeout_sec30单请求超时秒数超过 300 秒会告警include_cubes/include_viewstrue是否摄入 cubes / viewsinclude_reports/include_workbookstrue仅 Cloud是否摄入 reports 为 charts、workbooks 为 dashboards需cloud_api_keydeployment_idcube_pattern/view_pattern/report_pattern/workbook_patternallow all按名称正则过滤AllowDenyPatterninclude_lineagetrue是否发出血缘view→cube以及可用的数仓血缘include_column_lineagetrue是否发出列级细粒度血缘需include_lineage开启parse_sql_for_lineagetrue仅 Core解析 cube SQL 推导数仓表血缘需设置warehouse_platformwarehouse_platform无上游数仓的 DataHub 平台名如snowflake未设置时 Cloud 自动检测warehouse_platform_instance无上游数仓的 platform instance用于构建血缘 URNwarehouse_envPROD上游数仓数据集的环境warehouse_database无附加到无库名前缀的上游表引用前的数据库名未设置时取 data source 定义convert_lineage_urns_to_lowercasetrue构建血缘 URN 时是否将上游表/列名转小写须与数仓连接器的convert_urns_to_lowercase保持一致如 Snowflake 默认小写 URN以保证血缘可解析deployment_url无部署 UI 的基础 URL容器外链未设置时从api_url推导tag_measures_and_dimensionstrue是否给 Schema 字段打Measure/Dimension及时间维度Temporal标签emit_semantic_model_entitiesfalse是否将 views 作为semanticModel实体逻辑数据集 每 measure 一个metric发出需服务端注册相应实体文件 sink 亦支持include_hiddenfalse是否摄入public: false/isVisible: false的 cubes、views 与成员emit_member_detailstrue是否将成员展示提示format、drill-down、cumulative写入字段jsonProps并将结构元数据joins、hierarchies、folders、pre-aggregations写入数据集自定义属性enable_meta_mappingtrue是否处理meta_mapping/column_meta_mapping规则meta_mapping{}作用于 cube/viewmeta的映射规则派生 tags、terms、owners、domains、doc links语法同 dbt 连接器每条规则必须含operation与match键config.py 会校验column_meta_mapping{}作用于 measure/dimensionmeta的映射规则派生字段级 tags 与 termstag_prefix通过meta_mapping创建的标签的前缀strip_user_ids_from_emailfalse是否剥离meta_mapping派生 owner 的邮箱域名domain{}按 cube/view 名称正则匹配分配 DataHub 域键为 domain id 或 urnstateful_ingestion无有状态摄入配置stale entity removal配置校验方面config.py有两个强约束值得注意cloud_api_key、deployment_id、environment_id只在deployment_typeCLOUD时合法cloud_api_key与deployment_id必须成对出现Platform API 与 token 铸造的前提environment_id不能单独提供。八、限制连接器存在以下明确的边界均源自 Cube API 本身的限制/v1/meta不返回标记public: false的 cubes/views。Cube Cloud 上 Metadata API 可能仍会返回它们连接器会并入Cube Core 上这类 cubes 不会作为数据集摄入但指向它们的血缘边仍会发出Cloud 的数仓血缘依赖 Metadata API 的 metadata 作用域 token经api_token提供或由cloud_api_keydeployment_idenvironment_id自动铸造。缺失时降级为仅/v1/meta只有 view→cube 血缘Control Plane 的audit-logs 导出与Orchestration APIpre-aggregation 构建任务被有意不使用——它们是运维/治理面而非数据目录元数据且 audit-logs 导出是仅 Enterprise 的 CSV 流Cube Core 的列级血缘依赖成员名与数仓列名一致Cube 的默认约定且上游表 schema 已存在于 DataHub。被重命名或计算表达式支撑的成员如total_amount之于amount或任何聚合 measure无法建立列级链接因为 Core 的/v1/meta不暴露底层成员 SQLCloud 的 Metadata API 提供精确引用无此限制不使用统计与查询剖析usage statisticsCube 不通过拉取 API 暴露查询历史仅有 Query History export推送日志到外部 sink如 S3。摄入导出的数据属于另一条独立 pipeline而非 Metadata API 特性pre-aggregation 定义不被 Core 的/v1/meta暴露它只返回 measures、dimensions、segments、hierarchies、folders属于内部缓存关注点当 payload 恰好包含它们时其名称会被捕获为自定义属性。九、故障排查1. Required scope is missing / Metadata API 降级到/v1/meta说明配置的api_token是普通 REST/data token 而非 metadata 作用域 token。解决方式三选一设置cloud_api_keydeployment_idenvironment_id让连接器经 Control Plane API 铸造 metadata token在api_token中提供预生成的 metadata token设置use_metadata_api: false静默掉降级告警。2. 没有出现数仓血缘确认warehouse_platform已设置或已自动检测且上游数据集是以你这里配置的相同warehouse_platform_instance与warehouse_env摄入的。Cube Cloud 的自动检测逻辑见 cube.py优先选名为default的 data source无法识别类型时发出 warning 并跳过数仓血缘此时应显式设置warehouse_platform。3. 数仓血缘边无法连接到已有数据集有 DataHub 实例时常见情形连接器会把上游数仓表 URN 与列名的大小写对齐到数仓连接器实际摄入的结果——通过查询 DataHub 中已存在的真实 schema将 Cube 报告的标识符吸附过去。这可以无配置地处理不同平台的折叠差异Postgres/Redshift 小写、Snowflake 大写、BigQuery 大小写敏感上游 schema 尚未进入 DataHub 时数仓未摄入或 dry run 无服务端没有可对齐的对象连接器退回配置行为——默认将上游表与列名小写化。若数仓连接器配置了convert_urns_to_lowercase: false则在这里也要设置convert_lineage_urns_to_lowercase: false使兜底 URN 一致。最可靠的修复是先摄入数仓。十、源码导读若想深入理解实现推荐按以下路径阅读仓库配置与校验config.pyCubeSourceConfig全部参数、Cloud 凭据成对校验、meta_mapping 结构校验主流程与实体产出cube.pyCubeSource.get_workunits_internal的编排、_build_schema_field的字段建模、_emit_reports_and_workbooks的 chart/dashboard 产出、_custom_properties的属性构建API 客户端与双端点合并cube_api.pytoken 铸造、Platform API 分页、Metadata API 不可达时的降级与 models.pyCore/Cloud 原始模型的归一化、merge_entities合并、report 的 jsonQuery 解析血缘构建cube_lineage.pySQL 解析、schema-aware 的 URN 大小写对齐、成员-列名匹配语义模型模式cube_semantic_model.pyview→semanticModel 映射、join SQL 解析为正则{CUBE}.col {other}.col的列对、关系基数映射 many_to_one→N:1 等端点与常量constants.py全部 API 路径、类型映射、数仓平台映射表、标签名、重试策略测试验证test_cube_source.pymeta 映射、域分配、Temporal 标签、semantic-model 模式下的 chart 输入、结构属性、hidden 过滤、dashboard 组装等、以及同目录的test_cube_config.py、test_cube_api.py、test_cube_lineage.py、test_cube_models.py、test_cube_semantic_model.py。总体而言Cube 连接器是 DataHub 语义层资产入目录的完整方案它用「/v1/meta保结构、Metadata API 补血缘」的双端点策略同时覆盖 Cube Core 与 Cube Cloud用 sqlglot 解析与 schema-aware 对齐解决 Cube Core 的血缘推导难题并通过 stateful ingestion、meta_mapping 与 domain pattern 将治理元数据一并沉淀到 DataHub最终支撑起「数仓 → Cube → View → Chart → Dashboard」的端到端血缘可视化。【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表