DataHub MariaDB 数据源接入指南:元数据、血缘与使用统计的完整实践
DataHub MariaDB 数据源接入指南元数据、血缘与使用统计的完整实践【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahubMariaDB 是广泛用于存储与查询分析型或操作型数据的数据库平台。DataHub 的 MariaDB 集成以 MySQL Source 为基础实现用于抽取数据集/表/视图、Schema 字段、容器等核心元数据并支持表级与列级血缘、数据画像以及有状态删除检测。本文以仓库中的 MariaDB Source 文档 为主体结合 MariaDB 源码实现、MySQL 基类 与集成测试完整讲解配置方式、能力矩阵、使用统计与血缘提取原理帮助你用一份可复制的 recipe 将 MariaDB 接入 DataHub。概览DataHub 如何集成 MariaDBMariaDB 是一个用于存储和查询分析型或操作型数据的数据平台更多信息可参考官方 MariaDB 文档mariadb.org。DataHub 对 MariaDB 的集成覆盖了以下核心元数据实体datasets / tables / views将数据库中的表与视图作为 Dataset 实体入库schema fields抽取每张表/视图的字段与列级 Schema 信息containers按数据库/平台作用域组织资产形成容器层级lineage支持表级与列级血缘data profiling可选的表级数据画像行数、大小等统计stateful deletion detection有状态删除检测用于发现已删除的实体。从源码结构看MariaDBSource 直接继承自MySQLSource仅重写了get_platform()以返回平台标识mariadb其配置类复用了MySQLConfig见config_class(MySQLConfig)装饰器。也就是说MariaDB 的绝大多数行为、配置项与底层查询逻辑都与 MySQL 源共享这对熟悉 MySQL 接入的用户是显著优势。概念映射源概念到 DataHub 概念虽然 MariaDB 专属的概念映射仍在完善中但以下展示了 DataHub 的通用概念映射关系源概念DataHub 概念说明Platform/account/project scope平台/账号/项目作用域Platform Instance、Container在平台上下文内组织资产Core technical asset如表/视图/主题/文件Dataset主要的被采集技术资产Schema fields / columns字段/列SchemaField支持 Schema 抽取时包含Ownership and collaboration principals所有者与协作者CorpUser、CorpGroup由支持所有权与身份元数据的模块发出Dependencies and processing relationships依赖与处理关系Lineage edges血缘边当支持并启用血缘抽取时可用对于 MariaDB 源而言两张表表/视图会成为 Dataset列会成为 SchemaField数据库本身可作为 Container 组织资产。快速开始编写 MariaDB 采集 Recipe仓库在 metadata-ingestion/docs/sources/mariadb/mariadb_recipe.yml 中提供了一份完整的示例 recipe是实际接入的起点。完整内容如下source: type: mariadb config: # 连接坐标 host_port: localhost:3306 database: dbname # 凭据 username: root password: example # 可选从查询历史中推导使用统计与查询级血缘 # include_usage_statistics: true # usage_source: performance_schema # 默认值规范化摘要无需额外配置 # usage_source: general_log # 字面 SQL 按用户归因需要 general_logON, log_outputTABLE # 如果需要用 SSL 连接 MariaDB # options: # connect_args: # ssl_ca: path_to/server-ca.pem # ssl_cert: path_to/client-cert.pem # ssl_key: path_to/client-key.pem # sink configs写入目标例如 datahub-rest / file要点说明type: mariadb是 DataHub Ingestion 框架中的源类型标识对应 connector 注册表 中的mariadb条目host_port默认值为localhost:3306scheme固定为mysqlpymysql见 MySQLConnectionConfigdatabase指定目标库若留空则枚举全部数据库并可用database_pattern过滤。运行采集的命令为datahub ingest -c mariadb_recipe.yml集成测试中同样使用run_datahub_cmd([ingest, -c, f{config_file}])的方式执行采集可参考 test_mariadb.py。核心配置项详解以下配置继承自MySQLConfig定义于 mysql.py对 MariaDB 源完全适用。连接与认证配置项类型默认值说明host_portstringlocalhost:3306MariaDB 主机与端口usernamestring无连接用户名passwordstring无连接密码databasestring无目标数据库为空则枚举全部并受database_pattern过滤auth_modeenumPASSWORDPASSWORD标准账号密码或AWS_IAMAWS RDS IAM 认证aws_configobject默认AWS RDS IAM 认证配置仅在auth_modeAWS_IAM时使用optionsobject无透传给 SQLAlchemy 引擎的额外选项如connect_args中的 SSL 参数关于auth_modeAWS_IAM源码在初始化时通过parse_host_port解析主机与端口端口必填并通过RDSIAMTokenManager生成临时令牌在每次数据库连接时通过 SQLAlchemy 的do_connect事件监听器注入passwordPyMySQL 要求 RDS IAM 认证必须启用 SSL见 mysql.py 与 mysql.py。过滤模式database_patternAllowDenyPattern类型按数据库名过滤默认全部允许源码中系统库information_schema、performance_schema、mysql、sys会被无条件排除见 mysql.py 与_is_allowed_database。schema_pattern、table_pattern、view_pattern沿用 SQL 通用源的层级过滤模式。存储过程include_stored_proceduresboolean默认true是否采集存储过程procedure_patternAllowDenyPattern按database.schema.procedure_name全名匹配过滤例如Customer.public.customer.*匹配 Customer 库 public schema 下所有以 customer 开头的存储过程。采集存储过程时源码从information_schema.ROUTINES读取过程名、定义与语言对于原生 SQL 存储过程EXTERNAL_LANGUAGE为 NULL会默认设为QueryLanguageClass.SQL从而保证过程级血缘提取能够正常触发见 mysql.py。集成测试 mariadb_to_file.yml 演示了通过procedure_pattern只采集test_db.*并排除.*_temp$的过滤方式。数据画像Profilingprofiling配置复用GEProfilingConfig并额外提供两个 MariaDB/MySQL 特有的护栏参数见 MySQLProfilingConfig配置项默认值说明profiling.enabledfalse是否启用数据画像profiling.profile_table_row_limitnull仅对估算行数小于该值的表做画像。行数来自information_schema.tables.table_rows存储引擎统计可能过期设置为null表示不限profiling.profile_table_size_limitnull仅对大小小于指定 GB 数的表做画像大小取自information_schema.tables.data_lengthnull表示不限这两项护栏值必须大于 0否则配置校验会直接报错ValueError: profile_table_row_limit must be greater than 0 (or null to disable filtering)。源码在画像候选生成时读取_table_rows_cache与dataset_name_to_storage_bytes由information_schema.tables全表扫描填充超限的表会被记入profiling_skipped_row_limit/profiling_skipped_size_limit统计。源码还会在运行结束后给出画像耗时的表建议若某张表画像耗时超过 30 秒会提示设置profile_table_row_limit、profile_table_size_limit或调低profiling.max_workers并发全表扫描会倍增峰值内存建议例如max_workers5以缓解内存压力见 mysql.py。注意profile_if_updated_since_days对 MySQL/MariaDB 画像不生效会输出提示后被忽略。使用统计与查询血缘两种查询历史来源这是 MariaDB 集成最具特色的能力。开启include_usage_statistics: true后DataHub 会读取查询历史同时产出使用统计datasetUsageStatistics与查询级表血缘。查询历史的来源由usage_source控制二选一方式一performance_schema默认零配置source: type: mariadb config: host_port: localhost:3306 database: dbname username: root password: example include_usage_statistics: true usage_source: performance_schema # 默认值底层查询performance_schema.events_statements_summary_by_digest见 mysql.py每行是一个规范化语句摘要DIGEST_TEXT去除了字面量替换为?的语句文本COUNT_STAR自上次计数器重置以来服务器重启或表被 truncate的执行次数LAST_SEEN最近一次执行时间SCHEMA_NAME语句所在库。特点与注意点无需任何服务端配置只要 statements digest 消费者已启用、用户对 performance_schema 有 SELECT 权限即可无按用户归因摘要按语句聚合不携带执行者因此不会产生 per-user 使用统计集成测试断言userCounts为空见 test_mariadb.py首次采集可能产生峰值由于COUNT_STAR是累计值启用后第一次采集可能把历史全部归到一个时间戳上出现单日大峰值属预期现象每条摘要以usage_multipliercount计入聚合器。方式二general_log字面 SQL 按用户归因source: type: mariadb config: host_port: localhost:3306 database: dbname username: root password: example include_usage_statistics: true usage_source: general_log # 需要服务端开启 general log要求 MariaDB 服务端开启general_logON且log_outputTABLE并且连接用户对mysql.general_log表有 SELECT 权限。底层查询见 mysql.pySELECT event_time, user_host, thread_id, command_type, CONVERT(argument USING utf8mb4) AS argument FROM mysql.general_log WHERE command_type IN (Query, Init DB, Connect) AND event_time BETWEEN :start_time AND :end_time ORDER BY event_time, thread_id特点与注意点保留字面 SQL、执行用户与真实时间戳因此可以按用户归因使用统计由于 general_log 没有 schema 列源码通过跟踪每个会话thread_id的当前库来解析未限定表名Connect事件解析 userhost on db using protocol 中的初始库Init DB/USE db语句切换当前库会话映射采用 LRU 上限默认最多跟踪 10000 个会话见 mysql.py只解析SELECT、INSERT、UPDATE、DELETE、REPLACE、WITH、CALL、MERGE等 DML 语句见_DML_LEADING_KEYWORDSSET、SHOW、COMMIT等管理语句被跳过用户名取自user_host的priv_user[login_user] host [ip]格式若用户名不是邮箱形式可用email_domain配置项补全域名如 LDAP 登录名使其正确映射到 CorpUser例如email_domain: example.comConnect事件还用于记录会话初始默认库当客户端连接时未选择数据库db槽位为空则该会话在出现USE/Init DB前 schema 未知相关语句会被跳过调试日志提示 has no known database。两条来源路径均通过_usage_connection上下文管理器建立一个一次性、用完即释放NullPool dispose的 UTC 时区连接SET time_zone 00:00保证时间戳解析一致见 mysql.py。若读取查询历史失败如消费者未启用、权限不足仅记录 warning 并跳过使用统计不会中断已完成的元数据采集。血缘能力视图血缘与查询血缘根据 mariadb.py 的能力声明MariaDB 源的血缘能力分为两档能力默认状态说明LINEAGE_COARSE粗粒度默认开启视图表级血缘由include_view_lineage控制开启使用统计后还可从查询历史推导表级血缘LINEAGE_FINE细粒度/列级默认开启视图列级血缘由include_view_column_lineage控制开启使用统计后还可从查询历史推导列级血缘实现上MySQLSource._create_aggregator在开启include_usage_statistics时会构造一个查询 使用统计 血缘全功能的SqlParsingAggregator见 mysql.pygenerate_lineageTrue查询历史推导表血缘与include_view_lineage相互独立后者只控制视图定义血缘generate_queriesTrue、generate_query_usage_statisticsTrue、generate_usage_statisticsTrue同时产出查询与使用统计generate_operationsFalse两种来源均不产出操作operationaspect_is_allowed_table/_is_temp_table回调确保未被采集的表临时表、被过滤库的表、解析器误展开的db.db.table引用仅作为血缘中转节点不会产生幽灵数据集。另外源码会保存发现的 Schema 到解析器即使未启用视图血缘只要开启使用统计也需要见_save_schema_to_resolver保证未限定的表引用能被正确解析。能力矩阵小结以下能力来自 mariadb.py 的装饰器声明能力支持情况Platform Instance默认启用Domains通过domain配置字段支持Data Profiling数据画像可选通过配置启用Usage Stats使用统计可选通过include_usage_statistics开启读取 performance_schema 摘要默认或 mysql.general_logusage_source: general_log同时产出查询级表血缘Lineage - Coarse粗粒度视图默认启用include_view_lineage表级血缘可在开启使用统计后由查询历史推导Lineage - Fine列级视图默认启用include_view_column_lineage列级血缘可在开启使用统计后由查询历史推导MariaDB 源在 mariadb.py 中标注的 SupportStatus 为GA正式可用。测试验证集成测试与单元测试仓库为 MariaDB 源提供了完整的测试覆盖是理解行为边界的绝佳参照单元测试test_mariadb_source.py 验证MariaDBSource.platform mariadb确认平台标识正确设置集成测试test_mariadb.py 使用mariadb:11.4Docker 镜像见 docker-compose.yml执行三类场景元数据采集以mariadb_to_file.yml为配置将结果写入 MCE JSON与 golden 文件mariadb_mces_golden.json对比校验覆盖存储过程采集与过程级血缘performance_schema 使用统计断言生成了raw_customer_data的使用统计、无 per-user 归因、查询血缘存在见 test_mariadb.pygeneral_log 使用统计断言按用户归因urn:li:corpuser:root出现在 userCounts 中且查询血缘存在见 test_mariadb.py连接测试对可达与不可达的 host_port 分别验证test connection成功与失败。这些测试中执行的使用工作负载由tests/test_helpers/mysql_usage_helpers.py提供与 MySQL 源共享。常见问题与排障使用统计未生成检查include_usage_statistics是否开启performance_schema 场景需确认 digest 消费者已启用且用户对performance_schema有 SELECT 权限general_log 场景需确认general_logON、log_outputTABLE且用户对mysql.general_log有 SELECT 权限。读取失败仅告警不中断。general_log 场景下部分语句被跳过会话在出现USE/Init DB/Connect前 schema 未知的语句会被跳过属于预期行为。首次启用使用统计出现单日大峰值performance_schema 的COUNT_STAR为累计值首次采集会把历史全部归到一个时间戳属已知现象可等待计数器重置后再次采集。画像未覆盖大表确认profile_table_row_limit/profile_table_size_limit是否为null或误设为 0/负数会直接校验失败行数为information_schema估算值可能过期可执行ANALYZE TABLE刷新。存储过程血缘缺失确认include_stored_procedures为 true 且procedure_pattern未过滤掉目标过程原生 SQL 过程的语言默认按 SQL 处理以支持血缘提取。延伸阅读MariaDB 源文档本文的原始依据MariaDB 示例 Recipe可直接复制的配置模板MariaDB 源码实现能力声明与平台标识MySQL 基类实现全部配置项与查询历史/画像/存储过程逻辑MariaDB 集成测试 与 单元测试行为边界的可执行验证通用 SQL 源概念映射可参考 DataHub 文档中的 metadata-model 与概念说明docs/what 目录。【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考