元数据存储选型与分层模型

元数据架构设计,说白了就是回答两个问题:元数据放哪,以及怎么组织。

我在过去几年参与过好几个数据平台的建设,从早期的 Hive 数仓到后来的湖仓一体,元数据存储选型踩过不少坑。今天咱们就聊聊这块的核心思路。

元数据存储选型:三大主流方案

目前业界主流的元数据存储方案,我归纳为三类。它们各有各的适用场景,没有银弹。

方案 核心定位 适用场景 我个人的评价
Hive Metastore 传统 Hadoop 生态的元数据中心 Hive、Spark、Presto 等离线/交互式查询 成熟稳定,但扩展性有限
AWS Glue 云原生 Serverless 元数据服务 AWS 生态、自动爬取、ETL 集成 运维省心,但厂商锁定
Apache Atlas 企业级数据治理与血缘平台 数据血缘、分类、合规审计 功能全面,但部署较重

Hive Metastore:老牌选手,依然能打

Hive Metastore(HMS)是 Hadoop 生态里最经典的元数据存储方案。它用关系型数据库(MySQL/PostgreSQL)存储表结构、分区、列信息等元数据,对外提供 Thrift 接口。

我记得在 2018 年做一个离线数仓项目时,团队直接用了 HMS。当时觉得这东西太简单了——不就是存个表结构吗?后来发现,HMS 的瓶颈往往不在功能,而在性能。

避坑指南: 我曾经遇到过一个场景,HMS 里存了上万张表,每天凌晨调度任务集中读取元数据,导致 Metastore 连接池被打满,任务大面积超时。后来我们做了两件事:一是给 HMS 加了一层本地缓存(Hive MetaCache),二是把分区数控制在单表 5 万以内。

HMS 的优势是生态兼容性极好。Spark、Flink、Presto、Trino 都能直接对接。但它的短板也很明显:不支持血缘追踪,没有数据分类能力。说白了,它就是个「元数据字典」,不是治理平台。

AWS Glue:云原生的省心之选

AWS Glue 是亚马逊推出的 Serverless 元数据服务。它的核心卖点是自动爬取——你给它一个 S3 路径,它能自动识别数据格式、推断 schema,然后注册到 Glue Catalog 里。

我在一个云原生项目里用过 Glue。说实话,真香。你不需要自己搭数据库,不需要操心高可用,Glue 自动搞定。而且它和 Athena、Redshift Spectrum、EMR 无缝集成,查询体验很流畅。

但要注意,Glue 的厂商锁定问题。一旦你的元数据全部进了 Glue Catalog,想迁出来就比较麻烦。我建议:如果团队确定长期用 AWS,Glue 是首选;如果未来可能多云,还是谨慎点。

小技巧: Glue 的爬取策略可以配置。我习惯把爬取频率设为「按需触发」,而不是定时全量扫描。这样可以避免不必要的费用,也能控制元数据更新的节奏。

Apache Atlas:企业级治理的「重武器」

Apache Atlas 是 Hadoop 社区推出的企业级数据治理平台。它不仅能存元数据,还能做血缘分析、数据分类、合规审计。

Atlas 的架构比 HMS 复杂得多。它用 JanusGraph 作为图存储后端,用 Solr 做索引,用 Kafka 做事件总线。说白了,它把元数据当成一张图来管理——表、列、ETL 任务、报表都是节点,它们之间的关系就是边。

我参与过一个金融客户的项目,他们要求全链路血缘追踪——从业务系统到数据湖,再到报表,每一步都要能追溯。这种场景下,Atlas 几乎是唯一的选择。

但 Atlas 的部署和维护成本不低。我见过不少团队把 Atlas 搭起来后,发现性能跟不上,最后又拆回 HMS + 自研血缘的方案。所以我的建议是:先想清楚你到底需不需要血缘和治理,别为了「大而全」盲目上 Atlas。

元数据分层模型:从混乱到有序

存储选型定下来后,下一步就是设计元数据的组织方式。我个人习惯把元数据分成三个层次:基础层、逻辑层、应用层。

为什么要分层?说白了,不同角色关心的元数据不一样。运维关心存储位置和分区信息,数据工程师关心表结构和血缘,业务分析师关心指标定义和数据质量。混在一起,谁都找不到想要的。

元数据分层模型 应用层 数据血缘 · 数据质量 · 数据分类 · 合规审计 指标定义 · 数据字典 · 业务术语 面向:数据分析师、数据治理团队、业务用户 逻辑层 表结构 · 列定义 · 分区信息 · 存储格式 视图 · 物化视图 · 数据模型 面向:数据工程师、ETL 开发、数据架构师 基础层 存储路径 · 文件格式 · 压缩方式 · 数据源连接 集群信息 · 资源队列 · 访问权限 面向:运维工程师、平台管理员

基础层:存储与基础设施元数据

基础层是最底层的元数据,描述数据「在哪」和「怎么存」。包括:

  • 物理路径:HDFS 路径、S3 桶路径、本地文件路径
  • 文件格式:Parquet、ORC、Avro、CSV、JSON
  • 压缩方式:Snappy、Gzip、Zstd、LZ4
  • 数据源连接:JDBC 连接串、Kafka 集群地址、API 端点
  • 集群与资源:YARN 队列、Spark 资源池、计算节点信息

这一层的数据,运维人员最关心。比如,某个表的数据存在哪个 S3 桶里,用了什么压缩格式,这些信息直接影响存储成本和查询性能。

我的经验: 基础层的元数据最好自动化采集,不要人工维护。我在一个项目里见过运维手动维护存储路径清单,结果漏掉了一个分区,导致数据管道跑飞。后来我们写了个定时脚本,每天凌晨扫描 HDFS 和 S3,自动更新基础元数据。

逻辑层:结构与模型元数据

逻辑层是数据工程师最常打交道的层次。它描述数据的「逻辑结构」:

  • 表结构:表名、列名、列类型、列注释
  • 分区信息:分区键、分区值、分区数量
  • 存储格式:表级别的文件格式和压缩方式
  • 视图与物化视图:SQL 定义、依赖关系
  • 数据模型:星型模型、雪花模型、宽表模型

逻辑层的元数据,直接决定了查询引擎能不能正确解析数据。比如,你在 Hive 里建了一张表,列类型定义错了,Spark 读的时候就会报错。所以,逻辑层的元数据必须保证准确性和一致性。

我建议逻辑层的元数据以 HMS 或 Glue Catalog 作为权威源,其他系统(比如 Spark、Presto)都通过 API 去拉,不要各自维护一份。

应用层:业务与治理元数据

应用层是离业务最近的层次。它描述数据的「业务含义」和「治理状态」:

  • 数据血缘:从源表到中间表到报表的完整链路
  • 数据质量:完整性、准确性、一致性、及时性指标
  • 数据分类:敏感数据、PII 数据、公开数据
  • 合规审计:数据访问记录、变更历史、审批流程
  • 业务术语:指标定义、维度定义、业务规则

这一层的元数据,业务分析师和数据治理团队最需要。比如,一个分析师想知道「近 30 天活跃用户数」这个指标是怎么算出来的,他需要看数据血缘,从报表一路追溯到原始埋点表。

实践建议: 应用层的元数据不要全部自动化,有些需要人工维护。比如业务术语的定义,最好由业务团队在数据字典里手动填写。我见过一个项目,完全依赖自动解析血缘来生成业务术语,结果一堆「user_id_1」「user_id_2」这样的垃圾定义,根本没法用。

分层模型与存储选型的匹配

不同层次的元数据,适合用不同的存储方案来承载。我整理了一个匹配矩阵:

层次 推荐存储 理由
基础层 HMS / Glue Catalog 存储路径、文件格式等结构化信息,关系型存储足够
逻辑层 HMS / Glue Catalog 表结构、分区信息,HMS 原生支持
应用层 Atlas / 自研图存储 血缘、分类、审计需要图模型和全文索引

当然,这不是的。小团队可能直接用 HMS 搞定所有层次,大企业可能用 Atlas 统一管理。关键看你的规模和治理需求。

注意: 不要为了分层而分层。如果你的团队只有 5 个人,数据量也不大,直接上 HMS 就够了。分层模型是为了解决大规模场景下的组织问题,不是银弹。

小结

元数据存储选型,没有标准答案。HMS 适合传统 Hadoop 生态,Glue 适合 AWS 云原生,Atlas 适合企业级治理。分层模型帮你把元数据组织得井井有条,但落地时要根据实际情况裁剪。