2026/9/18 10:05:19

DataHub SAP HANA 连接器实战指南:从元数据采集、计算视图血缘到查询使用率的完整实现

DataHub SAP HANA 连接器实战指南:从元数据采集、计算视图血缘到查询使用率的完整实现 DataHub SAP HANA 连接器实战指南从元数据采集、计算视图血缘到查询使用率的完整实现【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahubSAP HANA 作为 SAP S/4HANA 等系统的内存列式数据库其元数据形态表、视图、计算视图、存储过程比一般关系型数据库更复杂。DataHub 的hanasource 基于标准 SQL 抽取路径扩展出三条 HANA 专属管线——计算视图列级血缘、存储过程血缘、计划缓存查询使用率挖掘。本文完整覆盖其概念映射、权限配置、Recipe 参数、血缘与使用率计算机制、限制与排障并深入 hana source 源码 印证实现细节帮助你在生产环境中正确落地这一连接器。连接器总览它在 DataHub 中做什么SAP HANA 是支撑 SAP Business Suite、SAP S/4HANA 以及各类自定义分析的内存、列式关系数据库。DataHub 对该平台的集成覆盖核心元数据实体数据集表、普通视图、计算视图、Schema 字段、容器Schema 作为 SCHEMA 类型 Container血缘来自计算视图的表级与列级血缘、来自存储过程的表级血缘与过程间procedure-to-procedure血缘数据剖析profiling、有状态删除检测stateful deletion detection、查询使用率统计。从源码结构看连接器架构与文档描述一致HanaSource 继承自SQLAlchemySource因此表、普通视图、schema 反射、剖析、分类、有状态删除、容器层级、连接测试均走其他 SQLAlchemy 系 source 共用的标准路径其上的三类 HANA 专属能力分别由include_calculation_views、include_stored_procedures、include_query_usage控制。在 hana.py 中可以看到该平台注册为platform_name(SAP HANA, idhana)当前支持级别标注为SupportStatus.ALPHA。三条专属管线的工作方式管线开关数据来源产出计算视图include_calculation_views: true默认关_SYS_REPO.ACTIVE_OBJECT中的已激活计算视图 XMLDatasetCalculation View子类型 列级血缘存储过程include_stored_procedures: true默认开SYS.PROCEDURES/SYS.PROCEDURE_PARAMETERS每 schema 一个 DataFlowProcedures Container每个过程一个 DataJob表级血缘查询使用率include_query_usage: true默认关_SYS_STATISTICS.HOST_SQL_PLAN_CACHE观测查询 → 查询血缘 DatasetUsageStatistics 读操作记录概念映射SAP HANA 概念如何落到 DataHub 实体下表完整继承官方文档的 Concept Mapping是理解 URN 结构的前提SAP HANA 概念DataHub 实体子类型说明租户数据库Tenant databasePlatform Instance顶层作用域所有 URN 均包含所配置的 platform instanceSchemaContainerSCHEMA租户数据库内的顶层命名空间表行存 / 列存 / 虚拟表DatasetTABLE包含列存、行存与虚拟表抽取 schema、描述与若可用标签普通视图Regular ViewDatasetVIEW标准 SQL 视图视图定义被捕获用于血缘计算视图Calculation ViewDatasetCalculation View需include_calculation_views: true已激活的计算视图取自_SYS_REPO.ACTIVE_OBJECT列级血缘从其 XML 解析SqlScriptView型计算视图DatasetCalculation View主体为 HANA SQLScript 的计算视图表级血缘从过程体提取SQLScript 列级血缘不在支持范围内存储过程SQLScriptDataFlowProcedures Container DataJobStored Procedure默认开启include_stored_procedures每 schema 一个 DataFlow每个过程一个 DataJob表级血缘从过程体解析列 / 字段SchemaField抽取原生类型、可空性计算视图还抽取注释表级与列级血缘Lineage edges从视图定义与计算视图 XML 中提取列级血缘经由SqlParsingAggregator流转与 Snowflake / Redshift 路径相同查询历史 / 使用率DatasetUsageStatistics Operations 查询推导血缘需include_query_usage挖掘_SYS_STATISTICS.HOST_SQL_PLAN_CACHE依赖 statistics service 与MONITORING角色前置条件驱动、网络与权限数据库驱动连接器使用 SAP 官方hdbcli驱动经由sqlalchemy-hana接入。安装hanaextra 时两者自动安装。pyproject.toml 中对这两个依赖都带有platform_machine ! aarch64 and platform_machine ! arm64的环境标记constraints.txt 将版本锁定为hdbcli2.27.24、sqlalchemy-hana3.0.3。架构限制hdbcli仅提供x86_64预编译 wheel。在aarch64/arm64Apple Silicon、AWS Graviton上必须以 x86_64 Python 解释器运行摄入进程如通过 Rosetta 或 x86_64 容器。SQLAlchemy 连接串 scheme 默认值为hanahdbcli见 hana_config.py 中scheme字段定义。网络连通性hdbcli驱动的默认端口为30015单容器实例或多租户部署中 HANA Cockpit 展示的租户端口。需保证摄入进程可在该端口到达目标租户。注意配置字段host_port的代码默认值是localhost:39041见 hana_config.py实际部署时应显式写成形如myhost.example.com:30015的值与 hana_recipe.yml 示例一致。权限按能力分层的 GRANT 脚本以下 DDL 需由 HANA 管理员持有ROLE ADMIN与USER ADMIN执行创建 DataHub 专用角色与用户。授权按能力分层——对不打算启用的功能注释掉对应小节即可-- 1. 角色 用户 CREATE ROLE DATAHUB_ROLE; CREATE USER DATAHUB_USER PASSWORD your-strong-password NO FORCE_FIRST_PASSWORD_CHANGE; GRANT DATAHUB_ROLE TO DATAHUB_USER; -- 2. 基础元数据表、普通视图、schema 反射。 -- 对每个要摄入的 schema 重复执行。 GRANT SELECT ON SCHEMA YOUR_SCHEMA TO DATAHUB_ROLE; -- 3. 存储过程include_stored_procedures: true 时必需默认开启。 GRANT SELECT ON SYS.PROCEDURES TO DATAHUB_ROLE; GRANT SELECT ON SYS.PROCEDURE_PARAMETERS TO DATAHUB_ROLE; -- 4. 计算视图 —— 仅限本地部署 / 自管 HANA。 -- 依赖 SAP HANA XS-classic 仓库_SYS_REPO。 -- SAP HANA Cloud / 纯 HDI 部署请整块跳过。 GRANT SELECT ON _SYS_REPO.ACTIVE_OBJECT TO DATAHUB_ROLE; GRANT SELECT ON SYS.VIEW_COLUMNS TO DATAHUB_ROLE; GRANT SELECT ON SCHEMA _SYS_BIC TO DATAHUB_ROLE; -- 5. 查询使用率include_query_usage: true 时必需 -- 来源 _SYS_STATISTICS.HOST_SQL_PLAN_CACHE。 -- MONITORING 是覆盖它的最小权限角色亦可使用更宽的 -- CATALOG READ 系统权限。 GRANT MONITORING TO DATAHUB_ROLE; -- 或等价地 -- GRANT CATALOG READ TO DATAHUB_ROLE; -- 6. 剖析仅 profiling.enabled: true 时需要。 -- 剖析读取被检视表的样本数据继承第 2 步的 SELECT 授权 -- 无需额外权限。能力与授权对应矩阵能力必需授权备注表、普通视图、schema 反射对每个待摄入 schema 的SELECT按 schema 逐一授权缺此授权时 schema 对 SQLAlchemy 反射不可见存储过程include_stored_procedures: true默认开SYS.PROCEDURES、SYS.PROCEDURE_PARAMETERS的SELECT过程体与签名读自SYS.PROCEDURES参数签名用SYS.PROCEDURE_PARAMETERS计算视图include_calculation_views: true_SYS_REPO.ACTIVE_OBJECT、SYS.VIEW_COLUMNS的SELECT以及SCHEMA _SYS_BIC仅限本地 / 自管 HANA。_SYS_BIC是已激活计算视图物化所在的运行时 schema查询使用率include_query_usage: trueMONITORING角色 或CATALOG READ系统权限两者均授予对_SYS_STATISTICS.HOST_SQL_PLAN_CACHE的读访问statistics service 也必须在运行默认即开启剖析profiling.enabled: true继承每 schema 的SELECT剖析查询与元数据抽取可见的表相同无额外授权MONITORING角色包含在 HANA 标准角色目录中若授权后_SYS_STATISTICS仍为空可参照 SAP note 2147247 做诊断。Recipe 配置逐参数解析 hana_recipe.yml官方示例 Recipe 全文如下可直接作为生产起点source: type: hana config: # 连接坐标 host_port: hana.example.com:30015 # 可选指定查询某个 HANA 租户数据库 # database: TENANT_DB # 凭据 username: ${HANA_USER} password: ${HANA_PASS} # 可选取消注释并修改以过滤要摄入的 schema # schema_pattern: # allow: # - ^REPORTING$ # - ^SAPABAP1$ # 启用后摄入已激活计算视图依赖 # _SYS_REPO.ACTIVE_OBJECT即 XS-classic 仓库内容。 include_calculation_views: true # 可选按 package_id.view_name 过滤计算视图。 # 继承来的 view_pattern 只过滤普通 SQL 视图 # 对计算视图不生效。 # calculation_view_pattern: # allow: # - ^acme\\.analytics\\..* # 存储过程默认开启——若不希望其成为 DataJob 实体可关闭。 # include_stored_procedures: false # 可选从 _SYS_STATISTICS.HOST_SQL_PLAN_CACHE 取查询使用率。 # 要求摄入用户具有 MONITORING或 CATALOG READ权限 # 且租户上 statistics service 正在运行。默认关闭。 # include_query_usage: true # include_usage_stats: true # include_operational_stats: true # usage_max_queries: 10000 # bucket_duration: DAY # start_time: -7 days profiling: enabled: true turn_off_expensive_profiling_metrics: true # 默认 sink 为 datahub-rest无需配置结合 HanaConfig 的定义关键参数默认值与语义如下参数代码默认值说明host_portlocalhost:39041HANA 主机与端口如myhost.example.com:30015。HANA Cloud 需 TLS——驱动未自动启用时可经options.connect_args传encrypttruedatabase继承自BasicSQLAlchemyConfig指定查询的特定租户数据库可选schema_pattern拒绝DEFAULT_DENY_SCHEMAS中的 SAP 管理 schema正则 allow/deny 过滤。从源码 constants.py 看默认拒绝SYS、_SYS_AUDIT、_SYS_BI、_SYS_REPO、_SYS_STATISTICS等 SAP 管理 schema但_SYS_BIC保持允许——它是已激活计算视图的运行时入口也是计算视图血缘的起点include_calculation_viewsfalse为true时从_SYS_REPO.ACTIVE_OBJECT摄入计算视图并从 XML 解析列级血缘仅限本地 / 自管 HANAcalculation_view_patternallow all正则匹配package_id.view_name如acme.analytics.SalesOverview注意不能用继承的view_pattern过滤计算视图include_stored_procedurestrue为true时存储过程作为DataJob实体摄入表级血缘从其过程体解析procedure_patternallow all正则匹配schema.procedure_nameinclude_query_usagefalse为true时从_SYS_STATISTICS.HOST_SQL_PLAN_CACHE挖掘查询历史需MONITORING角色或CATALOG READ系统权限include_usage_statsfalse为true时输出DatasetUsageStatisticsaspect代码中通过 model_validator 强制校验未同时开启include_query_usage会直接抛ValueErrorinclude_operational_stats继承自BaseUsageConfig与include_query_usage同开时从观测查询派生读操作Operationsusage_max_queries10000单次摄入从HOST_SQL_PLAN_CACHE拉取的离散(statement_hash, last_execution_timestamp)行数上限与限制每桶汇总条目的top_n_queries不同bucket_duration/start_time/end_time继承自BaseUsageConfig与 Snowflake / Redshift 行为一致时间窗默认为 UTC 最近完整一天profiling.enabledfalse启用标准剖析器另可用profile_table_level_only或profile.sample_size为超宽 / 大表限制采样规模在 HanaSource 构造函数 中可以验证配置到行为的接线方式父类SQLAlchemySource.__init__总是构造一个使用率关闭的聚合器HanaSource随后用带generate_usage_statistics/generate_operations钩子的SqlParsingAggregator替换它并且仅在include_calculation_views为真时才实例化HanaCalculationViewExtractor。部署兼容性本地部署 vs HANA Cloud多数能力在所有受支持的 HANA 租户上可用但计算视图抽取仅限本地部署 / 自管租户能力本地 / 自管HANA 1.0 SPS12、HANA 2.0、HANA ExpressSAP HANA Cloud / 纯 HDI 部署表、普通视图、schema 反射✅✅存储过程include_stored_procedures✅✅查询使用率include_query_usage✅✅剖析✅✅计算视图include_calculation_views✅❌ —— HANA Cloud 不提供 XS-classic 仓库_SYS_REPO计算视图经 HDI 容器部署不暴露可解析的 XML 载荷若在 HANA Cloud 上误开include_calculation_views: true计算视图抽取器会记录告警并降级为 no-op而不是让整次摄入失败其余元数据照常完成。血缘计算四类来源各自的解析机制普通视图血缘从每个视图的CREATE VIEW定义中提取经由SqlParsingAggregator并采用 sqlglot 的postgresdialectHANA SQL 对视图定义而言与 ANSI 足够接近。计算视图列级血缘主力列级血缘从_SYS_REPO.ACTIVE_OBJECT中计算视图的 XML 解析。从 constants.py 中CalcViewNodeType枚举可以看到解析器处理的六类节点ProjectionView、JoinView、AggregationView、UnionView、RankView与SqlScriptView。解析器实现集中在 hana_calculation_view_parser.py其 XML 元素/属性名集中定义在CalcViewXmlElement/CalcViewXmlAttribute两个枚举中对应 SAP 的BiModelCalculation.ecoreschema并保留attribute维度属性与measure可聚合度量两种输出绑定的区分。对于SqlScriptViewcalculationScenarioTypeSCRIPT_BASED节点解析器还会从内嵌 HANA SQLScript 主体中提取表级上游SQLScript 的列级血缘不在范围内。SQLScript 血缘的抽取由 hana_script_lineage.py 承担。计算视图数据集上还会写入customPropertiesview_type、package_id、runtime_view_name见 CalcViewProperty便于下游检索与过滤。存储过程每个存储过程的过程体被解析出表级读/写以及过程间血缘结果挂载到该过程的DataJob上作为输入/输出数据集。每 schema 对应一个DataFlowProcedures Container。观测查询include_query_usage: true时_SYS_STATISTICS.HOST_SQL_PLAN_CACHE中的查询历史以ObservedQuery条目送入聚合器。每行代表一次(statement_hash, last_execution_timestamp)观测——即一个已缓存计划在某快照窗口内被执行的一次不同时刻。聚合器据此派生查询驱动的血缘并在include_usage_stats: true时产出按bucket_duration分桶的DatasetUsageStatistics汇总。查询挖掘逻辑见 hana_query.py。查询使用率去重、过滤与语义边界include_query_usage: true时的具体行为快照去重连接器按(statement_hash, last_execution_timestamp)对计划缓存快照去重避免被多次 statistics service 快照观测到的稳态查询被重复计数。其副作用是落入同一快照窗口的多次执行会被观测为单次事件因此绝对执行次数是下界floor而非精确值系统流量过滤系统用户SYS及任何_SYS_*用户以及对SYS/_SYS_*schema 的监控流量在 SQL 层被过滤行数上限usage_max_queries限制每次摄入返回的离散观测数分桶与时间窗bucket_duration、start_time、end_time来自BaseUsageConfig行为与 Snowflake / Redshift 一致。频率类结论Top 表、Top 用户保持准确绝对总量偏保守。剖析HANA 列存下的低成本统计剖析复用SQLAlchemySource的标准剖析器需显式开启profiling.enabled: true。HANA 列存使多数剖析查询开销较低但超宽 / 大表仍可用profile_table_level_only或profile.sample_size限制每表采样量。剖析只读取被检视表的样本数据因此权限上继承每 schema 的SELECT授权无需额外 GRANT。已知限制hdbcli在aarch64/arm64上不可用SAP 未发布该架构 wheelApple Silicon 与 Graviton 主机上必须以 x86_64 解释器运行摄入进程计算视图仅限本地 / 自管依赖 XS-classic 仓库_SYS_REPOHANA Cloud / 纯 HDI 部署上该抽取器告警并跳过而非失败包裹存储过程的计算视图主体只CALL另一过程的SqlScriptView没有可解析的FROM/JOIN引用不会产出表血缘。被调用的过程本身若include_stored_procedures开启仍会被摄入并可经过程血缘触达SQLScript 列级血缘不在范围内sqlglot 对 HANA 的支持不足以可靠追踪列级故计算视图SqlScriptView节点与存储过程中的 SQLScript 只做表级解析使用率执行次数是下界HOST_SQL_PLAN_CACHE每数分钟快照一次同一窗口内的多次执行合并为一次观测另外STATEMENT_STRING在 HANA 侧按sql_text_length参数默认 5000 字符截断超长语句可能只能部分解析。排障手册[89018] _SYS_REPO.ACTIVE_OBJECT not found租户没有 XS-classic 仓库内容。关闭计算视图抽取include_calculation_views: false或迁移到有该仓库的租户。[258] insufficient privilege针对SYS.PROCEDURES或_SYS_REPO.ACTIVE_OBJECT为摄入用户授予相应系统视图的SELECT。连接器会记告警并继续其余抽取路径此处的失败永不中断摄入。计算视图列级血缘缺失按顺序排查确认视图已激活在_SYS_BIC中可见未激活的设计期对象会被跳过检查摄入日志中的Failed to parse calculation view——指向解析失败源 XML 可能畸形或是不支持列级血缘的SqlScriptView对SqlScriptView视图确认主体使用完全限定且双引号包裹的引用FROM SCHEMA.TABLEHANA SQLScript 表变量T_FREQ SELECT …被有意跳过。hdbcli导入错误ImportError: dlopen(...) ... incompatible architecture说明正在使用aarch64Python 解释器切换为 x86_64 解释器Rosetta 或 x86_64 容器。[258] insufficient privilege针对_SYS_STATISTICS.HOST_SQL_PLAN_CACHE授予MONITORING角色或CATALOG READ系统权限。连接器记告警并继续——使用率抽取降级为 no-op其余摄入正常完成。使用率抽取返回零条查询确认 statistics service 正在运行SELECT * FROM SYS.M_SERVICES WHERE SERVICE_NAME statisticsserver完整诊断见 SAP note 2147247确认缓存非空SELECT COUNT(*) FROM _SYS_STATISTICS.HOST_SQL_PLAN_CACHE新开通的租户需要数分钟才能产生首个快照放宽时间窗——默认是 UTC 最近完整一天可设start_time: -7 days拉长回溯。源码导读如何继续深入hanasource 的全部实现位于 metadata-ingestion/src/datahub/ingestion/source/sql/hana/各文件职责可从命名与引用关系得到印证文件职责hana.pyHanaSource入口能力注册、聚合器装配、计算视图抽取器条件实例化hana_config.pyHanaConfig全部配置字段、默认值与校验规则constants.py计算视图 XML 元素/属性名、节点类型、默认拒绝 schema 列表、HANA 伪表DUMMY等集中常量hana_calculation_view_parser.py计算视图 XML → 列级血缘 DAG 的解析器hana_script_lineage.pySQLScript 过程体 /SqlScriptView主体的表级血缘抽取hana_query.py_SYS_STATISTICS.HOST_SQL_PLAN_CACHE挖掘与ObservedQuery组装hana_schema_gen.py计算视图实体与 schema 生成HanaCalculationViewExtractorhana_data_dictionary.pyHANA 数据字典SYS.VIEW_COLUMNS等访问封装hana_utils.py标识符构建HanaIdentifierBuilder等工具配套文档位于 metadata-ingestion/docs/sources/hana/本指南对应的原文、权限与部署兼容矩阵hana_pre.md、能力与排障细节hana_post.md、可运行 Recipehana_recipe.yml。落地建议先以最小配置host_port 凭据 默认 schema 过滤跑通表与视图摄入再按功能矩阵逐层开启include_query_usage、profiling.enabled只有在本地 / 自管 HANA 上才开启include_calculation_views。每一步开启前对照能力-授权矩阵补齐对应 GRANT即可在摄入日志中验证各管线是否如预期降级或生效。【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考