DataHub Hive 数据源:HiveServer2 元数据采集、认证配置与存储血缘实战指南
2026/9/18 23:34:05 网站建设 项目流程

DataHub Hive 数据源:HiveServer2 元数据采集、认证配置与存储血缘实战指南

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

本文基于 DataHub 官方文档 Hive Pre-Sync 及其配套源码展开,完整讲解hive采集器如何通过 PyHive/Thrift 从 Hive 抽取数据库、表与列元数据,覆盖最小权限授予、六种典型认证配置(BASIC/LDAP/Kerberos/TLS/HDInsight/Databricks)及可选的存储血缘(storage lineage)能力,并深入源码印证各配置项在HiveSource中的实际解析行为,帮助你在生产环境中稳定配置并运行 Hive 元数据采集任务。

一、Hive 采集器概述与提取内容

hive模块是 DataHub 中面向 Hive 元数据的生产级采集入口,通过 PyHive 连接库与 HiveServer2 建立 Thrift 连接(默认 10000 端口,TLS 下为 10001 端口),拉取整个 Hive 集群的元数据并转换为 DataHub 工作单元。

该插件提取的内容(与源码 hive_source.py 中HiveSource类文档字符串一致):

  • 数据库、schema 与表的元数据
  • 每张表关联的列类型
  • 详细的表与存储信息(表属性、位置等)
  • 表、行与列级统计信息(通过可选的 SQL profiling 获得)

相关文档:

  • Hive 源配置示例
  • Hive Metastore 连接器:直连 metastore 的替代方案
  • 底层连接库为 PyHive(安装acryl-datahub[hive]时自动引入)

二、前置条件(Prerequisites)

  1. 网络访问:能够访问 HiveServer2 的 10000 端口(TLS 场景为 10001 端口);
  2. 用户账号:一个对目标数据库和表具备读权限的 Hive 用户;
  3. 依赖安装:安装 PyHive 连接依赖:
pip install 'acryl-datahub[hive]'

2.1 最小权限要求(仅元数据)

DataHub 使用的 Hive 账号至少需要以下权限(官方文档建议只授予只读权限):

-- 授予要采集的所有数据库的 SELECT 权限 GRANT SELECT ON DATABASE <database_name> TO USER <datahub_user>; -- 授予表/视图的 SELECT 权限,用于 schema 抽取 GRANT SELECT ON TABLE <database_name>.* TO USER <datahub_user>;

2.2 启用存储血缘时的额外权限

若计划启用存储血缘(emit_storage_lineage),连接器还需要读取表的 location 信息:

-- 授予 SELECT 以读取存储位置 GRANT SELECT ON <database_name>.* TO USER <datahub_user>;

2.3 权限建议

  • 只读访问:DataHub 只需要读权限,切勿授予INSERTUPDATEDELETEDROP
  • 按库过滤:如果只需要采集特定数据库,用database配置参数限定范围,从而减少所需权限。

从源码可以印证这一"按库过滤"行为:get_schema_names 方法中,若配置了self.config.database,采集会被直接限制到该数据库;否则回退到父类TwoTierSQLAlchemySource的全库枚举逻辑。

三、认证方式与配置示例

Hive 连接器通过 PyHive 支持多种认证方式,统一通过 recipe 参数配置。以下各示例均继承自官方文档与 hive_recipe.yml。

3.1 基础认证(用户名/密码)

最简单的认证方式,直接使用用户名和密码:

source: type: hive config: host_port: hive.company.com:10000 username: datahub_user password: ${HIVE_PASSWORD} # 敏感信息使用环境变量

完整的本地 recipe 示例(摘自 hive_recipe.yml):

source: type: hive config: # 连接坐标 host_port: localhost:10000 database: DemoDatabase # 可选;不指定则采集所有数据库 # 凭据 username: user # 可选 password: pass # 可选 # 更多认证细节(LDAP、Kerberos 等)通过 options.connect_args 传递: #options: # connect_args: # auth: KERBEROS # kerberos_service_name: hive #scheme: 'hive+http' # Thrift 使用 HTTP 传输时设置 #scheme: 'hive+https' # Thrift 使用带 SSL 的 HTTP 传输时设置 #scheme: 'sparksql' # Spark Thrift Server 时设置 # 存储血缘配置(可选) #emit_storage_lineage: false #hive_storage_lineage_direction: upstream # 'upstream'(storage -> Hive)或 'downstream'(Hive -> storage) #include_column_lineage: true #storage_platform_instance: "prod-s3" sink: # sink 配置

3.2 LDAP 认证

source: type: hive config: host_port: hive.company.com:10000 username: datahub_user password: ${LDAP_PASSWORD} options: connect_args: auth: LDAP

3.3 Kerberos 认证

适用于 Kerberos 保护的 Hive 集群:

source: type: hive config: host_port: hive.company.com:10000 options: connect_args: auth: KERBEROS kerberos_service_name: hive

运行环境要求

  • 有效的 Kerberos 票据(运行采集前先用kinit换取);
  • Kerberos 配置文件(/etc/krb5.conf,或通过KRB5_CONFIG环境变量指定);
  • 已安装 PyKerberos 或 requests-kerberos 包。

3.4 TLS/SSL 安全连接

source: type: hive config: host_port: hive.company.com:10001 scheme: "hive+https" username: datahub_user password: ${HIVE_PASSWORD} options: connect_args: auth: BASIC

3.5 Azure HDInsight 集群

source: type: hive config: host_port: <cluster_name>.azurehdinsight.net:443 scheme: "hive+https" username: admin password: ${HDINSIGHT_PASSWORD} options: connect_args: http_path: "/hive2" auth: BASIC

3.6 Databricks(经 PyHive)

source: type: hive config: host_port: <workspace-url>:443 scheme: "databricks+pyhive" username: token # 或 Databricks 用户名 password: ${DATABRICKS_TOKEN} # 个人访问令牌或密码 options: connect_args: http_path: "sql/protocolv1/o/xxxyyyzzzaaasa/1234-567890-hello123"

注意:如需更完整的 Databricks 支持,官方建议改用专门的 Databricks Unity Catalog 连接器,它提供更强的功能;hive连接器对 Databricks 的支持是经由 PyHive 的轻量路径。

四、源码级实现剖析

4.1 配置模型:HiveConfig与 scheme 默认值

连接器实现位于 hive_source.py,其中配置类HiveConfig(第 144-154 行)继承自TwoTierSQLAlchemyConfig,关键实现细节:

  • scheme 默认值scheme: str = "hive",对应文档中hive+httphive+httpssparksqldatabricks+pyhive等可选取值;
  • host_port 自动清洗clean_host_port字段校验器会调用config_clean.remove_protocol去除用户误写的协议前缀(如http://hive:10000会被规范化为hive:10000),这解释了 recipe 中host_port只写"主机:端口"而无需协议的写法;
  • 能力声明HiveSource标注为SupportStatus.GA,声明了PLATFORM_INSTANCE(默认启用)、DOMAINS(经domain字段)等能力,LINEAGE_COARSE/LINEAGE_FINE能力则分别由include_view_lineage/include_view_column_lineage(视图血缘,默认开启)与emit_storage_lineage/include_column_lineage(存储血缘)驱动。

4.2 视图识别与视图定义提取

PyHive 的 SQLAlchemy 方言在get_table_names中会把视图当作表返回,因此HiveSource对视图做了专门处理(源码第 115-141 行、第 304-355 行):

  • 方言方法被替换为执行SHOW VIEWS [IN db]SHOW CREATE TABLE,并对多行返回的视图 DDL 做拼接还原;
  • _process_view为视图产出viewPropertiesaspect(viewLanguage: SQL)与SubTypes: VIEW
  • include_view_lineage开启时,视图定义被送入 SQL 血缘聚合器,抽取视图到上游表的列级血缘。

4.3 复杂类型展开(struct / map / array / uniontype)

Hive 的复杂类型在 DataHub 中会被展开为嵌套的 schema 字段树。get_schema_fields_for_column 通过正则^(struct|map|array|uniontype)匹配复杂类型,再借助 hive_schema_to_avro 将 Hive 列类型转换为 Avro schema,最终转为 DataHub 的 MCE schema 字段,保留nullabledescriptionisPartOfKey(分区键)信息。

此外,源码第 63-112 行对databricks_dbapiDatabricksPyhiveDialect.get_columns做了补丁:透传full_type(如decimal(10,1)的完整类型串)并过滤# Partition Information/# Partitioning头,这正是 3.6 节 Databricks 场景下列类型能完整保留的实现依据。

4.4 表属性与分区键

  • get_table_properties 会清洗 HiveDESCRIBE FORMATTED输出中尾部带冒号的属性键名,并透出表的location
  • get_partitions 通过inspector.get_indexes提取分区列,这些列随后在 schema 中标记为isPartOfKey

五、存储血缘(Storage Lineage):配置与源码印证

hive连接器独有的能力之一,是为 Hive 表与其底层存储位置(S3、Azure Blob、GCS、HDFS 等)之间生成血缘边。全部配置项定义在 storage_lineage.py 的HiveStorageLineageConfigMixin中:

配置项默认值说明
emit_storage_lineagefalse是否生成"存储 ↔ Hive 表"血缘;启用后为每张表与其 location 解析出的存储平台数据集之间建立血缘
hive_storage_lineage_directionupstream血缘方向:upstream表示存储是 Hive 的上游(数据从存储流向 Hive);downstream表示 Hive 是存储的上游
include_column_lineagetrueemit_storage_lineage同时启用时,抽取表列与存储位置字段之间的列级血缘
storage_platform_instancenull生成存储数据集 URN 时使用的 platform instance(如prod-s3

触发机制HiveSource.get_workunits_internal(hive_source.py 第 203-246 行)在父类产出每个工作单元后,从datasetProperties.customProperties["Location"]读取表位置,构造StorageDescriptor并交给HiveStorageLineage.get_lineage_mcp生成血缘 MCP;解析失败仅上报 warning 而不中断采集。存储位置可识别的平台包括 S3、Azure、GCS、本地filehdfs(见 storage_lineage.py 的平台名映射)。这也解释了第二节中"启用存储血缘需额外读取 location 权限"的原因。

六、与 hive-metastore 连接器的选择建议

官方文档将 hive-metastore 连接器 列为hive的替代方案,二者定位差异可概括为:

  • hive(本文):经 HiveServer2 的 Thrift 通道,认证方式与真实用户会话一致(BASIC/LDAP/Kerberos/TLS),支持视图定义、复杂类型展开与存储血缘,适合有标准 HS2 端点的生产环境;
  • hive-metastore:直连 Hive Metastore 服务,适合不便开放 HS2、或需要更高吞吐直读 metastore 的场景。

可按环境约束二选一;若目标实为 Databricks,则优先考虑 Unity Catalog 连接器。

七、总结与快速核对清单

配置一个可用的 Hive 采集任务前,建议按以下清单核对(全部依据本文引用的文档与源码):

  1. pip install 'acryl-datahub[hive]'是否完成,网络是否可达 HS2 的 10000/10001 端口;
  2. 采集账号是否为只读(GRANT SELECT),并按需配置database缩小范围与权限;
  3. 认证方式:options.connect_args.authBASIC/LDAP/KERBEROS,TLS 场景将scheme设为hive+https,Spark Thrift Server 设为sparksql
  4. 需要视图血缘时确认include_view_lineage(默认开启),需要存储↔表血缘时开启emit_storage_lineage并按需设置方向与storage_platform_instance
  5. 运行datahub ingest后,通过采集报告中的 warning(如Failed to generate storage lineage)定位单表级别的血缘抽取问题。

主要参考路径:文档 hive_pre.md、配置示例 hive_recipe.yml、实现 hive_source.py、存储血缘 storage_lineage.py。

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询