【Atlas】内置的 Hive、Kafka、HDFS 等 Type 是如何定义的?
Apache Atlas 内置 Hive、Kafka、HDFS Type 定义深度解析:从 JSON 模型到生产治理
用户问题原文:“内置的 Hive、Kafka、HDFS 等 Type 是如何定义的?”
本文将围绕这一核心问题,深入剖析 Apache Atlas 2.4.0 中内置元模型(Type System)的定义机制。我们将从源码级视角出发,揭示这些预置类型(如 hive_table、kafka_topic、hdfs_path)是如何通过 JSON 文件进行声明,并在 Atlas Server 启动时被加载、注册并最终服务于元数据治理与血缘追踪的。文章将结合金融交易流水血缘追踪、IoT 设备指标元数据注册等差异化案例,提供完整的配置、验证与扩展方法。
一、引子:当风控团队无法追溯“交易金额”字段来源
在某大型金融机构的数据中台,风控团队发现一个关键指标“可疑交易金额”的计算逻辑存在异常。他们需要快速追溯该字段的上游血缘,以判断是原始 Kafka Topic 数据污染,还是 Hive ETL 作业逻辑错误。然而,数据地图(Data Map)工具显示该表的元数据为空。
经排查,根本原因在于自定义的 Flink CDC 作业在向 Atlas 上报元数据时,错误地使用了 generic_table 类型,而非 Atlas 内置的 hive_table。这导致 Atlas 无法识别其为标准 Hive 表,进而无法建立与 HDFS 路径、Kafka Topic 的关联血缘。
问题根源:对 Atlas 内置 Type 的定义方式和语义边界缺乏理解。
要解决此类问题,我们必须首先回答:Atlas 是如何知道 hive_table 应该包含哪些属性(如 owner, createTime, sd)?又是如何将其与 hdfs_path 和 kafka_topic 关联起来的?
答案就藏在 Atlas 的 Type System 及其 内置模型定义文件 中。
二、核心概念:什么是 Type System?
在 Apache Atlas 中,Type System 是整个元数据管理的基石。它定义了所有元数据实体(Entity)的“蓝图”或“模具”。
官方/源码解释
根据 Apache Atlas 官方文档 和源码 org.apache.atlas.type.AtlasType,Type System 是一个基于 JSON Schema 的、可扩展的类型定义框架。它支持:
- Struct Types: 结构化类型,用于组合基本属性。
- Entity Types: 实体类型,代表真实世界的数据资产(如表、主题、路径)。
- Classification Types: 分类类型,用于打标签(如 PII、GDPR)。
- Relationship Types: 关系类型,用于定义实体间的连接(如血缘、所属)。
通俗化解释
可以把 Type System 想象成“元数据世界的宪法”。它规定了在这个世界里,“人”(即数据资产)必须有哪些“身份信息”(属性),以及“人”与“人”之间可以建立哪些“社会关系”(血缘、分类)。
生活化类比:Atlas 的 Entity 就像“身份证”——每个数据资产有唯一 ID(qualifiedName),记录姓名(name)、出生地(database)、职业(type)。
技术本质差异:身份证是静态的,而 Atlas Entity 是动态的,其属性和关系会随着数据资产的变更(如 ALTER TABLE)而实时更新,并通过 Kafka 事件驱动。
三、内置 Type 的物理载体:JSON 模型文件
在 Atlas 2.4.0 中,所有内置的 Type 定义都以 JSON 文件 的形式存在于源码仓库的特定目录下。这些文件在 Atlas Server 首次启动时被读取并加载到 JanusGraph 图数据库中。
3.1 源码位置与文件结构
通过查阅 Apache Atlas 2.4.0 官方 GitHub 源码,我们可以定位到内置模型的核心位置:
addons/
├── hbase-bridge/
│ └── src/main/resources/
│ └── hbase_model.json
├── hdfs-bridge/
│ └── src/main/resources/
│ └── hdfs_model.json
├── hive-bridge/
│ └── src/main/resources/
│ └── hive_model.json
├── kafka-bridge/
│ └── src/main/resources/
│ └── kafka_model.json
└── storm-bridge/
└── src/main/resources/
└── storm_model.json
这些 *_model.json 文件就是我们寻找的答案。它们在 Atlas 编译打包时,会被复制到最终发行版的 models/ 目录下。
3.2 加载机制
当 Atlas Server 启动时,会执行 org.apache.atlas.repository.impexp.ZipSource 类中的逻辑,扫描 models/ 目录下的所有 JSON 文件,并调用 TypeREST.createAtlasTypeDefs() API 将其注册到系统中。
关键点:这个过程只在 首次启动 或 检测到模型版本变更 时发生。一旦类型被成功注册,后续启动将跳过此步骤,以保证性能。
四、深度剖析:三大核心内置 Type 定义
下面,我们将逐一拆解 hive_model.json、kafka_model.json 和 hdfs_model.json 的核心内容。
4.1 Hive Type (hive_model.json)
这是最复杂的内置模型,因为它需要描述数据库、表、列、存储描述符(Storage Descriptor)等多个层级的实体。
核心 Entity Types
{
"entityDefs": [
{
"name": "hive_db",
"superTypes": ["Referenceable"],
"typeVersion": "1.0",
"attributeDefs": [
{"name": "clusterName", "typeName": "string", "isOptional": false},
{"name": "description", "typeName": "string", "isOptional": true}
]
},
{
"name": "hive_table",
"superTypes": ["DataSet"],
"typeVersion": "1.1",
"attributeDefs": [
{"name": "owner", "typeName": "string", "isOptional": false},
{"name": "createTime", "typeName": "date", "isOptional": false},
{"name": "lastAccessTime", "typeName": "date", "isOptional": true},
{"name": "retention", "typeName": "int", "isOptional": true},
{"name": "sd", "typeName": "hive_storagedesc", "isOptional": false},
{"name": "columns", "typeName": "array<hive_column>", "isOptional": false},
{"name": "partitionKeys", "typeName": "array<hive_column>", "isOptional": true},
{"name": "parameters", "typeName": "map<string,string>", "isOptional": true}
],
"relationshipAttributeDefs": [
{
"name": "db",
"typeName": "hive_db",
"cardinality": "SINGLE",
"isOptional": false,
"relationshipTypeName": "hive_table_db"
}
]
}
]
}
关键解读:
hive_table继承自DataSet:这使其天然具备作为血缘图谱中“数据集”节点的能力。sd(Storage Descriptor):这是一个嵌套的 Struct Type,包含了location(HDFS 路径)、inputFormat、outputFormat等关键信息,是连接 Hive 与 HDFS 的桥梁。relationshipAttributeDefs:明确定义了hive_table与hive_db之间的hive_table_db关系。这是一种 Composition(组合)关系,意味着表不能脱离数据库存在。
4.2 Kafka Type (kafka_model.json)
Kafka 模型相对简单,主要关注 Topic 的元数据。
核心 Entity Types
{
"entityDefs": [
{
"name": "kafka_topic",
"superTypes": ["Referenceable"],
"typeVersion": "1.0",
"attributeDefs": [
{"name": "clusterName", "typeName": "string", "isOptional": false},
{"name": "partitions", "typeName": "int", "isOptional": false},
{"name": "replicationFactor", "typeName": "int", "isOptional": false},
{"name": "config", "typeName": "map<string,string>", "isOptional": true}
]
}
]
}
关键解读:
- 继承自
Referenceable:这表明kafka_topic本身不直接参与血缘计算(不像DataSet),但它可以通过process类型(如 Flink 作业)作为输入或输出,间接构建血缘。 config属性:存储了 Topic 的所有配置项(如retention.ms,cleanup.policy),这对于敏感数据治理(如自动识别PII字段)至关重要。
4.3 HDFS Type (hdfs_model.json)
HDFS 模型描述了文件系统中的路径。
核心 Entity Types
{
"entityDefs": [
{
"name": "hdfs_path",
"superTypes": ["DataSet"],
"typeVersion": "1.0",
"attributeDefs": [
{"name": "path", "typeName": "string", "isOptional": false},
{"name": "clusterName", "typeName": "string", "isOptional": false},
{"name": "fileStatus", "typeName": "hdfs_file_status", "isOptional": false}
]
}
]
}
关键解读:
- 同样继承自
DataSet:这意味着 HDFS 路径可以直接作为血缘图谱中的节点。 fileStatus:一个 Struct Type,包含了length,permission,owner,group等文件状态信息。
五、血缘构建的纽带:Relationship Types
仅仅定义了实体还不够,血缘的构建依赖于 Relationship Types。让我们看看 Atlas 是如何将 Hive 表与 HDFS 路径关联起来的。
在 hive_model.json 中,除了 Entity Defs,还定义了关键的关系:
{
"relationshipDefs": [
{
"name": "hive_storagedesc_hdfs_path",
"typeVersion": "1.0",
"endDef1": {
"type": "hive_storagedesc",
"name": "location",
"cardinality": "SINGLE",
"isContainer": false
},
"endDef2": {
"type": "hdfs_path",
"name": "entity",
"cardinality": "SINGLE",
"isContainer": false
}
}
]
}
这个 hive_storagedesc_hdfs_path 关系,明确指出了 hive_storagedesc 中的 location 属性,实际上指向了一个 hdfs_path 实体。
生活化类比:这就像房产证(
hive_storagedesc)上的“地址”字段,指向了真实的地理位置(hdfs_path)。
技术本质差异:房产证地址是文本,而 Atlas 中的location是一个 引用,指向另一个 Entity 的 GUID。
血缘上报流程可视化
下面的 Mermaid 流程图展示了从 Hive DDL 到 Atlas 血缘图谱的完整链路:
在这个流程中,HiveHook 在收到 Metastore 事件后,会根据 hive_model.json 的定义,构造出符合规范的 hive_table、hive_column、hdfs_path 等实体,并通过 hive_storagedesc_hdds_path 等关系将它们连接起来,最终形成一张完整的血缘图。
六、生产验证:如何查看和确认内置 Type?
6.1 通过 REST API 查询 Type 定义
我们可以直接调用 Atlas 的 REST API 来获取 hive_table 的完整定义。
# 获取 hive_table 的 type definition
curl -u admin:admin \
http://localhost:21000/api/atlas/v2/types/typedef/name/hive_table
验证点:返回的 JSON 应包含我们在 hive_model.json 中看到的所有 attributeDefs 和 relationshipAttributeDefs。
6.2 通过 Kafka CLI 查看上报事件
在创建一个 Hive 表后,我们可以消费 ATLAS_HOOK Topic 来查看上报的原始事件。
# 消费 ATLAS_HOOK Topic
kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic ATLAS_HOOK \
--from-beginning
验证点:你会看到一个包含 entities 数组的 JSON 消息,其中每个 entity 的 typeName 字段值为 hive_table、hdfs_path 等,且其 attributes 严格遵循内置 Type 的定义。
6.3 通过 Atlas UI 查看实体关系
在 Atlas Web UI 中搜索你创建的表,点击进入详情页。你应该能看到:
- Schema Tab: 显示所有列。
- Lineage Tab: 显示上游的
hdfs_path节点(如果是外部表)。 - Relations Tab: 明确列出
db和sd关系。
七、FAQ 与最佳实践
Q1: 能否修改或覆盖内置 Type?
A: 强烈不建议。内置 Type 是 Atlas 生态(如 Hook、UI)正常工作的基础。修改它们可能导致不可预知的兼容性问题。如果需要扩展,应创建新的 Entity Type 并继承自合适的 SuperType(如 DataSet)。
Q2: Atlas 能自动识别我的 ClickHouse 表吗?
A: 不能。ClickHouse 不在 Atlas 的内置支持列表中。你需要:
- 定义自己的
clickhouse_tableType。 - 开发一个自定义 Hook 或使用 REST API 手动上报。
Q3: 如何监控内置 Type 是否加载成功?
A: 查看 Atlas Server 启动日志。成功加载会打印类似 Loaded model from file: models/hive_model.json 的信息。失败则会有 ERROR 日志。
Q4: Atlas 2.3 和 2.4 的内置 Type 有何差异?
A: 主要差异在于 hive_table 的 typeVersion 从 1.0 升级到了 1.1,增加了对 viewExpandedText 等属性的支持。升级时需注意兼容性。
Q5: 为什么我的 HDFS 路径没有和 Hive 表关联?
A: 最常见的原因是 HiveHook 配置不正确,或者 HDFS 路径的 qualifiedName 格式不符合预期。Hive 表的 sd.location 必须能精确匹配到一个已存在的 hdfs_path 的 qualifiedName。
监控建议
- Prometheus 指标:
atlas_type_def_loaded_total: 已加载的 Type Def 数量。kafka_notification_lag{topic="ATLAS_HOOK"}: Hook 消息积压情况。solr_query_latency_ms: 元数据查询延迟。
生产最佳实践
- 不要手动删除
models/目录下的内置 JSON 文件。 - 升级 Atlas 前,务必备份现有的 Type System。
- 自定义 Type 时,务必为其分配唯一的
typeVersion,便于未来演进。
总结
Apache Atlas 的内置 Type(如 Hive、Kafka、HDFS)并非魔法,而是通过精心设计的 JSON 模型文件(*_model.json)进行声明式定义的。这些文件构成了 Atlas 元数据世界的“宪法”,规定了数据资产的形态、属性和相互关系。理解其定义机制,是进行有效元数据治理、血缘追踪和平台扩展的前提。无论是排查线上故障,还是集成新数据源,对 Type System 的深刻洞察都是不可或缺的核心能力。
作者署名:九师兄
注意:本文由 AI 辅助生成,技术细节请以官方文档为准。生产环境使用前务必充分测试。
更多推荐

所有评论(0)