DataHub Presto 元数据接入指南:Connector 配置、能力边界与 Presto-on-Hive 选型实践
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
本文以 DataHub 开源仓库中 Presto 数据源官方文档为主体,结合 presto.py 与 trino.py 源码实现展开,系统讲解如何将 Presto 的表、视图、字段 Schema 与数据画像(Profiling)摄入 DataHub,并重点厘清「Presto Connector」与「Hive Metastore Connector(presto 模式)」两条接入路径的能力差异与选型依据。读完本文,你将掌握 Presto 源的完整配置方式(含 LDAP、HTTPS、Kerberos 等认证)、目录/模式/表三级过滤、平台实例隔离、数据画像调优、stateful ingestion 增量摄入,以及从废弃的
presto-on-hive源迁移到hive-metastore源的具体步骤。
一、Presto 源概览
Presto 是一个用于查询和分析型/操作型数据的分布式 SQL 引擎。DataHub 的presto模块专门负责从 Presto 中提取元数据并写入 DataHub,面向生产环境中的元数据摄入工作流(production ingestion workflows)。
从仓库中的概念映射(README.md)可以看到,DataHub 对 Presto 的集成覆盖了以下核心元数据实体:
- Dataset(表/视图):核心摄入的技术资产;
- SchemaField(字段/列):随 Schema 提取一并摄入;
- Container(数据库/目录、Schema):用于在平台上下文内组织资产;
- Platform Instance:多集群场景下的平台实例隔离;
- Lineage(表级/列级):由支持并开启血缘提取的模块产出;
- Ownership(CorpUser/CorpGroup):由支持所有权与身份元数据的模块产出。
在源码层面,Presto 源定义于 presto.py:PrestoConfig继承自TrinoConfig,默认scheme为presto;PrestoSource继承自TrinoSource,并在__init__中显式传入platform="presto"(因为该源继承自 Trino 源,必须覆盖平台名)。该源当前标记为GA(General Availability)支持状态,并通过 capability 装饰器声明支持 DOMAINS(经由domain配置字段)与 DATA_PROFILING(可选启用)。
@platform_name("Presto", doc_order=1) @config_class(PrestoConfig) @support_status(SupportStatus.GA) @capability(SourceCapability.DOMAINS, "Supported via the `domain` config field") @capability(SourceCapability.DATA_PROFILING, "Optionally enabled via configuration") class PrestoSource(TrinoSource):重要说明:
presto模块从trino模块继承了绝大部分实现。因此,trino.py 中的配置字段(如catalog_to_connector_details、ingest_lineage_to_connectors、include_column_lineage、trino_as_primary等)同样适用于 Presto 源,阅读本文时可将 Trino 的底层机制视为 Presto 的共享实现细节。
二、两种接入路径:Presto Connector vs. Presto-on-Hive
将 Presto 元数据摄入 DataHub 有两条不同的路径,取决于你的使用场景:
方案一:Presto Connector(本文主角)
适用场景:需要直接连接 Presto,从所有 catalog(而不只是 Hive)提取元数据。
能力清单:
- 从所有 Presto catalog(Hive、PostgreSQL、MySQL、Cassandra 等)提取表和视图;
- 支持表与视图元数据;
- 支持数据画像(data profiling);
- 提取视图 SQL 定义;
- 不支持存储血缘(storage lineage)——因为无法访问底层存储位置;
- 对复杂的 Presto 特有 SQL,视图血缘支持有限。
最小配置:
source: type: presto # ← 本 Connector config: host_port: presto-coordinator.company.com:8080 username: datahub_user password: ${PRESTO_PASSWORD}方案二:Hive Metastore Connector(presto 模式)
适用场景:需要摄入使用 Hive metastore 的 Presto 视图,并且需要存储血缘。
能力清单:
- 提取存储在 Hive metastore 中的 Presto 视图;
- 支持存储血缘:从 S3/HDFS/Azure 到 Hive 表再到 Presto 视图的完整链路;
- 更好的 Presto 视图定义解析;
- 支持列级血缘;
- 提取速度更快(直接访问数据库);
- 仅适用于 Hive-backed catalog。
配置示例:
source: type: hive-metastore # ← 需要存储血缘时使用 config: host_port: metastore-db.company.com:5432 database: metastore scheme: "postgresql+psycopg2" mode: presto # ← 将 mode 设为 'presto' # 启用存储血缘 emit_storage_lineage: true hive_storage_lineage_direction: upstream完整细节参见 Hive Metastore Connector 文档(仓库路径:metadata-ingestion/docs/sources/hive-metastore)。
相关文档速查
- Presto 配置示例
- Hive Metastore Connector —— Presto-on-Hive 场景(含存储血缘)
- Trino Connector —— 面向 Trino(Presto 的继任者)的同类 Connector
- PyHive —— 底层连接库(
pip install pyhive,通过sqlalchemy_presto提供 Presto 方言支持)
源码印证:视图定义为何能提取
presto源之所以能提取视图 SQL 定义,是因为它在 presto.py 中覆写了 Presto 方言的两个反射方法:
get_view_names:由于 Presto 的information_schema.views不会返回视图,源码改为查询information_schema.tables中table_type = 'VIEW'的记录;get_view_definition:PyHive 的 Presto 驱动不返回视图定义,因此源码通过执行SHOW CREATE VIEW "<schema>"."<view_name>"显式获取。
这两个方法分别通过PrestoDialect.get_view_names = get_view_names与PrestoDialect.get_view_definition = get_view_definition挂载到 PyHive 的 SQLAlchemy 方言上(presto.py)。而表名获取(get_table_names,排除 VIEW 类型)、列信息(_get_columns)、表注释(get_table_comment)则直接复用 Trino 源在 trino.py 中的实现,统一通过information_schema查询完成。
注意:由于 Presto 方言会把
catalog_name作为一列返回,源码在 presto.py 中针对system.metadata.catalogs做了一个 workaround:生成 catalog → connector 的映射字典(值为空字符串),避免在读取 catalog 信息时失败。
三、前置条件(Prerequisites)
在配置 Presto 源之前,请确认以下三项前置条件:
网络可达性:能够访问 Presto coordinator 的 8080 端口(HTTPS 场景为 443);
用户账号:拥有查询元数据权限的 Presto 用户;
依赖安装:安装 PyHive 连接库:
pip install 'acryl-datahub[presto]'
最小权限建议
DataHub 使用的 Presto 账号只需最小权限:
-- Presto 使用 catalog 级权限 -- 用户需要对系统信息表具备 SELECT 权限 -- 该权限通常默认授予所有用户建议:使用一个只读服务账号(read-only service account),并授予其访问所有待摄入 catalog 的权限。
四、认证方式(Authentication)
4.1 基础认证(用户名/密码)
最常见的认证方式:
source: type: presto config: host_port: presto.company.com:8080 username: datahub_user password: ${PRESTO_PASSWORD} database: hive # 可选:默认 catalog4.2 LDAP 认证
source: type: presto config: host_port: presto.company.com:8080 username: datahub_user password: ${LDAP_PASSWORD} database: hive4.3 HTTPS/TLS 连接
source: type: presto config: host_port: presto.company.com:443 username: datahub_user password: ${PRESTO_PASSWORD} database: hive options: connect_args: protocol: https4.4 Kerberos 认证
适用于启用 Kerberos 的 Presto 集群:
source: type: presto config: host_port: presto.company.com:8080 database: hive options: connect_args: auth: KERBEROS kerberos_service_name: presto硬性要求:
- 运行摄入前需先获取有效的 Kerberos ticket(执行
kinit); - 需安装 PyKerberos 包。
以上认证参数均通过 SQLAlchemy 引擎的
connect_args透传给 PyHive 驱动。仓库中的最小可用示例见 presto_recipe.yml:host_port: localhost:5300、database: dbname、username: foo、password: password,可用作接入前的最小连通性验证。
五、Catalog / Schema / Table 三级过滤
Presto 可以连接多个 catalog(Hive、PostgreSQL、MySQL 等)。务必使用过滤来控制摄入范围,避免把system、information_schema等系统级内容摄入 DataHub。
Catalog(数据库)过滤
source: type: presto config: host_port: presto.company.com:8080 username: datahub_user # 只摄入指定 catalog database_pattern: allow: - "^hive$" - "^postgresql$" deny: - "system" - "information_schema"Schema 过滤
source: type: presto config: host_port: presto.company.com:8080 username: datahub_user database: hive # 默认 catalog # 过滤 catalog 内的 schema schema_pattern: allow: - "^production_.*" - "analytics" deny: - ".*_test$"Table 过滤
source: type: presto config: host_port: presto.company.com:8080 username: datahub_user # 过滤具体表 table_pattern: allow: - "^fact_.*" - "^dim_.*" deny: - ".*_tmp$" - ".*_staging$"从源码看,
TrinoConfig继承自BasicSQLAlchemyConfig(trino.py),因此database_pattern、schema_pattern、table_pattern等均来自通用的 SQL 源配置基类,语法与 DataHub 其他 SQL 源保持一致。
六、多集群场景:Platform Instances
当需要从多个 Presto 集群摄入元数据时,使用platform_instance进行隔离:
source: type: presto config: host_port: prod-presto.company.com:8080 platform_instance: "prod-presto"这会生成形如以下的 URN:
urn:li:dataset:(urn:li:dataPlatform:presto,catalog.schema.table,prod-presto)平台实例机制同样继承自PlatformInstanceConfigMixin(见 trino.py),确保不同集群的同名资产在 DataHub 中互不冲突。
七、数据画像(Data Profiling)
Presto Connector 支持可选的数据画像功能:
source: type: presto config: host_port: presto.company.com:8080 username: datahub_user # 启用画像 profiling: enabled: true profile_table_level_only: false # 是否仅做表级统计(false = 包含列级统计) # 限制画像范围 profile_pattern: allow: - "^production_.*"警告:在大型表上执行画像可能非常消耗资源。建议先用profile_table_level_only: true起步,再视需要逐步放开到列级统计。
数据画像与复杂类型的底层支持
从 trino.py 可以看到,Presto/Trino 源注册了若干自定义类型映射:
register_custom_type(datatype.ROW, RecordTypeClass) register_custom_type(datatype.MAP, MapTypeClass) register_custom_type(datatype.DOUBLE, NumberTypeClass) # 当 trino sqlalchemy 方言 >= 0.317.0 时 register_custom_type(datatype.JSON, RecordTypeClass)同时,TrinoSource.get_schema_fields_for_column(trino.py)针对ROW、ARRAY、MAP等复杂类型,会将列展开为带子字段的嵌套 SchemaField(通过 Avro 中间表示转换),使 Presto 的 struct/array/map 类型在 DataHub 的 Schema 面板中得以完整呈现。
八、性能优化与大规模部署
8.1 大型 Presto 部署的三种手段
对于 catalog 和表数量很多的 Presto 集群:
Catalog 过滤:将摄入限制到指定 catalog:
database_pattern: allow: - "hive" - "postgresql"关闭或收窄画像范围:
profiling: enabled: true profile_table_level_only: true启用 Stateful Ingestion(有状态摄入):后续运行只处理变更:
stateful_ingestion: enabled: true remove_stale_metadata: true
remove_stale_metadata: true还允许在源侧删除元数据时同步清理 DataHub 中已不存在的资产,避免幽灵资产。
8.2 查询性能注意点
- Connector 会查询 Presto 的
information_schema表; - 确保 Presto 集群有足够资源承载摄入查询;
- 大型部署建议在非高峰时段运行摄入任务。
九、从 deprecatedpresto-on-hive源迁移
如果你正在使用已废弃的presto-on-hive源:
旧配置:
source: type: presto-on-hive # ← 已废弃 config: host_port: metastore-db:3306 # ...新配置(推荐):
source: type: hive-metastore # ← 改用这个 config: host_port: metastore-db:3306 mode: presto # ← 将 mode 设为 'presto' emit_storage_lineage: true # ← 现在可用! # ...迁移收益:
- 获得存储血缘(storage lineage)能力;
- 更好的 Presto 视图解析;
- 性能提升;
- 处于活跃维护期、持续获得新特性。
十、选型对比:prestovs.hive-metastore(mode: presto)
| 特性 | prestoConnector | hive-metastore(mode: presto) |
|---|---|---|
| 连接方式 | 直连 Presto | 直连 metastore 数据库 |
| Catalog 覆盖 | 所有 Presto catalog | 仅 Hive-backed catalog |
| 存储血缘 | 不支持 | 支持 |
| 列级血缘 | 有限 | 完整支持 |
| 视图解析 | 基础 | 增强的 Presto 视图解析 |
| 性能 | 良好 | 更优(直接访问数据库) |
| 数据画像 | 支持 | 不支持 |
| 适用场景 | 多 catalog Presto | 需要血缘的 Presto-on-Hive |
血缘机制的源码补充
需要说明的是,prestoConnector 虽不提供存储血缘,但其底层 Trino 实现支持一种「Presto/Trino 数据集 ↔ 底层 Connector 数据集」的上游血缘与 Sibling 关联机制(trino.py):
- 通过查询
system.metadata.catalogs获取 catalog → connector 类型映射(如 hive、iceberg、mysql、postgresql、bigquery 等,见KNOWN_CONNECTOR_PLATFORM_MAPPING); - 由
catalog_to_connector_details配置字段补充 connector 侧的connector_database、connector_platform、platform_instance与env信息; - 对每个表/视图,通过
_emit_connector_lineage生成Siblings(兄弟资产)与UpstreamLineage(上游血缘)两类 WorkUnit; - 当
include_column_lineage: true且 Schema 可用时,会进一步生成fineGrainedLineages(列级血缘),将 Presto/Trino 侧每个字段 1:1 映射到 connector 侧数据集字段; - 可通过
ingest_lineage_to_connectors: false关闭该血缘摄入,或通过trino_as_primary控制兄弟资产的主从关系。
换言之:若你的 Presto 底层是 Hive/Iceberg 等 connector,且希望体现「Presto 视图/表读取自底层存储」的语义,除了文档推荐的hive-metastore路径外,也可以通过catalog_to_connector_details配置让presto源输出表级/列级上游血缘。这属于继承自 Trino 的实验性能力,建议在测试环境验证后再用于生产。
十一、最佳实践(Best Practices)
选对 Connector:
- 多 catalog Presto 部署 → 用
presto; - 需要存储血缘的 Hive-backed 表 → 用
hive-metastore(mode: presto)。
- 多 catalog Presto 部署 → 用
合理过滤:
- 排除系统 catalog:
system、information_schema; - 用 pattern 只纳入相关数据。
- 排除系统 catalog:
启用 Stateful Ingestion:
- 后续运行只处理变更;
- 缩短摄入时长、降低资源消耗。
先小范围测试:
- 先摄入一小部分 catalog/schema;
- 验证元数据质量后再扩大范围。
监控 Presto 负载:
- 摄入查询可能影响 Presto 性能;
- 大型部署尽量安排在非高峰时段。
十二、限制(Limitations)
Connector 行为受限于源端 API、权限及平台暴露的元数据,具体请以能力表为准:
存储血缘
不支持:Presto Connector 无法提取存储血缘,因为它无法访问底层存储位置。
解决方案:对 Hive 支撑的 Presto 视图,改用 Hive Metastore Connector 并设置mode: presto获取存储血缘。
视图定义
- 简单视图:完全支持,可提取 SQL;
- 复杂 Presto 视图:包含 Presto 特有 SQL 函数的视图,血缘提取可能受限;
- 跨 catalog 视图:引用多个 catalog 的视图受支持。
Connector 特有表
Presto 的各 catalog connector(Hive、PostgreSQL 等)暴露的元数据可能各不相同。本 Connector 提取的是对所有 connector 通用的公共元数据。
十三、故障排查(Troubleshooting)
13.1 常见问题速览
- Information Schema 延迟:Presto 的
information_schema可能延迟反映近期的 DDL 变更; - 结果集过大:catalog 含 10,000+ 张表时摄入可能缓慢;
- 视图血缘解析:含窗口函数、CTE 或 Presto 特有语法的复杂 SQL,血缘可能不完整;
- Connector 特有元数据:部分 Presto connector(如 Cassandra)通过
information_schema暴露的元数据有限。
13.2 连接问题
现象:Could not connect to Presto
排查:
- 确认
host_port正确并指向 Presto coordinator; - 检查防火墙规则是否放行 Presto 端口;
- 确认 Presto 服务运行中:
curl http://<host>:<port>/v1/info; - 查看 Presto 日志中的连接错误。
13.3 认证失败
现象:Authentication failed
排查:
- 核对用户名和密码是否正确;
- 确认认证方式与 Presto 配置匹配;
- Kerberos 场景:确保存在有效 ticket(
klist); - 查看 Presto coordinator 日志:
/var/log/presto/。
13.4 缺少 Catalog 或表
现象:部分 catalog/表没有出现在 DataHub 中
排查:
- 在 Presto 中执行
SHOW CATALOGS;确认用户是否有权限访问相关 catalog; - 检查是否被
database_pattern过滤; - 确认 Presto 中 catalog connector 配置正确;
- 查看 DataHub 摄入日志中的警告信息。
13.5 摄入缓慢
现象:元数据提取耗时过长
排查:
- 用 catalog/schema 过滤缩小范围;
- 关闭画像,或只对特定表画像;
- 启用 stateful ingestion;
- 确保 Presto 集群资源充足;
- 检查 Presto 查询队列与资源组(resource groups)。
13.6 视图血缘不出现
现象:Presto 视图没有血缘
排查:
- 复杂 Presto SQL 的血缘提取能力有限;
- 对 Hive-backed 视图,考虑改用 Hive Metastore Connector(
mode: presto); - 查看日志中的 SQL 解析警告;
- 条件允许时简化视图定义。
13.7 兜底排查顺序
如果摄入失败,先验证凭据、权限、连通性与范围过滤,再结合摄入日志中的 source 专属错误逐项调整配置。
十四、完整可运行配置模板
综合以上章节,一个生产级 Presto 摄入配置模板如下(可直接对照 presto_recipe.yml 扩展):
source: type: presto config: # 连接坐标 host_port: presto-coordinator.company.com:8080 # HTTPS 时为 443 database: hive # 默认 catalog # 凭据(建议通过环境变量注入) username: datahub_user password: ${PRESTO_PASSWORD} # 多集群隔离 platform_instance: "prod-presto" # 三级过滤 database_pattern: allow: ["^hive$", "^postgresql$"] deny: ["system", "information_schema"] schema_pattern: allow: ["^production_.*", "analytics"] deny: [".*_test$"] table_pattern: allow: ["^fact_.*", "^dim_.*"] deny: [".*_tmp$", ".*_staging$"] # 画像(视资源情况开启) profiling: enabled: true profile_table_level_only: true profile_pattern: allow: ["^production_.*"] # 增量摄入与过期清理 stateful_ingestion: enabled: true remove_stale_metadata: true # 可选:HTTPS / Kerberos # options: # connect_args: # protocol: https # # auth: KERBEROS # # kerberos_service_name: presto sink: # sink 配置(如 datahub-rest / datahub-kafka)总结
prestoConnector 是 DataHub 面向多 catalog Presto 部署的主力元数据源:它通过 PyHive 直连 Presto coordinator,基于information_schema提取表、视图与列 Schema,支持数据画像与完整的多级过滤,且因其继承自TrinoSource,天然共享 Trino 源的表属性、复杂类型展开与 connector 血缘等成熟能力。当业务需要存储血缘或更完整的视图解析时,则应切换到hive-metastore(mode: presto)路径。接入时请牢记三条主线:选对路径、配好过滤、控制画像范围,即可在数据规模增长时保持稳定高效的元数据摄入。
【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考