背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索,在接下来的系列文章中,会将经验与收获和读者们进行分享。
元数据系列文章:
[1] - 使用Atlas进行元数据管理之Glossary(术语)
[2] - 使用Atlas进行元数据管理之Type(类型)
0. 当我们谈论数据治理/元数据管理的时候,我们究竟在讨论什么?
谈到数据治理,自然离不开元数据。元数据(Metadata),用一句话定义就是:描述数据的数据。元数据打通了数据源、数据仓库、数据应用,记录了数据从产生到消费的全过程。因此,数据治理的核心就是元数据管理
。
数据的真正价值在于数据驱动决策,通过数据指导运营。通过数据驱动的方法判断趋势,帮住我们发现问题,继而推动创新或产生新的解决方案。随着企业数据爆发式增长,数据体量越来越难以估量,我们很难说清楚我们到底拥有哪些数据,这些数据从哪里来,到哪里去,发生了什么变化,应该如何使用它们。因此元数据管理(数据治理)成为企业级数据湖不可或缺的重要组成部分。
可惜很长一段时间内,市面都没有成熟的数据治理解决方案。直到2015年,Hortonworks终于坐不住了,约了一众小伙伴公司倡议:咱们开始整个数据治理方案吧。然后,包含数据分类、集中策略引擎、数据血缘、安全和生命周期管理功能的Atlas应运而生。(PS:另一个应用的较多的元数据开源项目是Linkedin 在2016年新开源的项目:WhereHows
)Atlas目前最新的版本为2018年9月18日发布的1.0.0
版本。
1. Atlas介绍
Atlas 是一个可伸缩和可扩展的核心基础治理服务集合 ,使企业能够有效地和高效地满足 Hadoop 中的合规性要求,并允许与整个企业数据生态系统的集成。
Apache Atlas为组织提供开放式元数据管理和治理功能,用以构建其数据资产目录,对这些资产进行分类和管理,并为数据科学家,数据分析师和数据治理团队提供围绕这些数据资产的协作功能。
关于Atlas的背景讲完了,接下来我们依次来讲Atlas中的几个概念,首先是今天的主角:Glossary
。
1.1 Glossary(术语表) 介绍
Atlas的术语表(Glossary)提供了一些适当的“单词”,这些“单词”能彼此进行关连和分类,以便业务用户在使用的时候,即使在不同的上下文中也能很好的理解它们。此外,这些术语也是可以映射到数据资产中的,比如:数据库,表,列等。
术语表抽象出了和数据相关的专业术语,使得用户能以他们更熟悉的方式去查找和使用数据。
1.2 术语表功能
- 能够使用自然语言(技术术语和/或业务术语)定义丰富的术语词汇表。
- 能够将术语在语义上相互关联。
- 能够将资产映射到术语表中。
- 能够按类别划分这些术语。这为术语增加了更多的上下文。
- 允许按层次结构排列类别,能展示更广泛和更精细的范围。
- 从元数据中独立管理术语表。
1.3 术语(Term)
对于企业来说术语作用的非常大的。对于有用且有意义的术语,需要围绕其用途和上下文进行分组。 Apache Atlas中的术语必须具有唯一的qualifiedName,可以有相同名称的术语,但它们不能属于同一个术语表。具有相同名称的术语只能存在于不同的术语表中。
术语名称可以包含空格,下划线和短划线(作为引用单词的自然方式)但不包含“。”或“@”,因为qualifiedName的格式为:<术语>@<术语限定名>
。限定名称可以更轻松地使用特定术语。
术语只能属于单个术语表,并且它们的生命周期也是相同的,如果删除术语表,则术语也会被删除。术语可以属于零个或多个类别,这允许将它们限定为更小或更大的上下文。
可以在Apache Atlas中为一个或多个实体分配/链接一个术语。可以使用分类(classifications
,类似标签的作用)对术语进行分类,并将相同的分类应用于分配术语的实体。
1.4 类别(Category)
类别是组织术语的一种方式,以便可以丰富术语的上下文。
类别可能包含也可能不包含层次结构,即子类别层次结构。类别的qualifiedName是使用它在术语表中的分层位置导出的,例如:<类别名称>.<父类别限定名>
。当发生任何层级更改时,此限定名称都会更新,例如:添加父类别,删除父类别或更改父类别。
2. Atlas Web UI
Apache Atlas UI提供了友好的用户界面,可以使用术语表相关的功能,其中包括:
- 创建术语表,术语和类别
- 在术语之间创建各种关系: synonymns(同义词),antonymns(反义词),seeAlso(参考)
- 调整类别的层次结构中
- 为实体分配实体(entities)
- 使用关联术语搜索实体
与术语表相关的UI都可以在GLOSSARY
的Tab下找到。
2.1 Glossary Tab
Apache Atlas UI提供了两种使用术语表的方法: 术语(Terms)视图
和类别(Category)视图
。
(1) 术语视图(Terms)
术语视图允许用户执行以下操作:
- 创建,更新和删除术语
- 添加,删除和更新与术语关联的分类
- 添加,删除和更新术语的分类
- 在术语之间创建各种关系
- 查看与术语关联的实体
(2) 类别视图(Category)
类别视图允许用户执行以下操作:
- 创建,更新和删除类别和子类别
- 将术语与类别相关联
用户可以使用术语表选项卡中提供的切换在术语视图和类别视图之间切换。
2.2 术语视图(Terms)
- 创建一个新术语
单击术语表名称旁边的省略号(...)会显示一个弹出式菜单,允许用户在术语表中创建术语或删除术语表 - 如下所示。
- 删除一个术语
单击术语名称旁边的省略号(...)会显示一个弹出式菜单,允许用户删除该术语 - 如下所示。
2.2.1 术语详情
选择术语表UI中的术语,可以查看对应术语的各种详细信息。详细信息页面下的每个选项卡提供该术语的不同详细信息。
-
Entities(实体)
选项卡:显示分配给所选术语的实体 -
Classifications(分类)
选项卡:显示与所选术语关联的分类 -
Related terms (相关术语)
选项卡:显示与所选术语相关的术语
2.2.2 给术语添加分类(classification)
单击分类标签旁边的+
可为术语添加分类。
2.2.3 与其他术语建立术语关联
查看术语详细信息时,单击Related Terms(相关术语)
选项卡。单击+
将术语与当前术语链接。
2.2.4 对术语进行分类
单击类别标签旁边的+
可对术语进行分类。将提供模态对话框以选择类别。
2.3 类别视图(Category)
当切换开关处于Category
时,左侧面板将列出所有术语表以及类别层次结构。
2.3.1 类别菜单(Category)
单击Category
旁边的省略号...
将显示类别上下文菜单。
- 创建新类别
- 创建子类别或删除类别
2.3.2 类别详情
选择Category
后,详细信息将显示在右侧窗口中。
2.3.3 术语分类
单击详情页中Terms
标签旁边的+
链接所选类别下的术语。
3. 术语分配流程
可以在搜索结果页和Glossary-Terms
实体详情页中给entity(实体)
分配术语。
3.1 分配术语
在搜索结果页面,点击terms
列下的+
点击terms
标签旁边的+
这两个操作都将显示下面的结果,按照屏幕上的提示完成术语分配。
3.2 分类传播(Propagated classification)
如果一个术语具有分类,则该术语下的实体继承相同的分类。
3.3. 使用术语搜索
Apache Atlas基本搜索API和UI已更新,以支持术语作为搜索条件。允许用户查找与给定术语相关联的实体。
4. REST API
Atlas支持以下操作,可在这里找到REST接口的详细信息。
5.1 JSON结构
- Glossary
{
"guid": "2f341934-f18c-48b3-aa12-eaa0a2bfce85",
"qualifiedName": "SampleBank",
"displayName": "Banking",
"shortDescription": "Glossary of bank",
"longDescription": "Glossary of bank - long description",
"language": "English",
"usage": "N/A",
"terms": [
{
"termGuid": "502d34f1-b85f-4ad9-9d9f-fe7020ff0acb",
"relationGuid": "6bb803e4-3af6-4924-aad6-6ad9f95ecd14",
"displayText": "A savings account"
}, {
"termGuid": "e441a540-ee55-4fc8-8eaf-4b9943d8929c",
"relationGuid": "dbc46795-76ff-4f68-9043-be0eff0bc0f3",
"displayText": "15-30 yr mortgage"
}, {
"termGuid": "998e3692-51a8-47fe-b3a0-0d9f794437eb",
"relationGuid": "0dcd31b9-a81c-4185-ad4b-9209a97c305b",
"displayText": "A checking account"
}, {
"termGuid": "c4e2b956-2589-4648-8596-240d3bea5e44",
"relationGuid": "e71c4a5d-694b-47a5-a41e-126ade857279",
"displayText": "ARM loans"
}],
"categories": [{
"categoryGuid": "dd94859e-7453-4bc9-b634-a17fc14590f8",
"parentCategoryGuid": "e6a3df1f-5670-4f9e-84da-91f77d008ce3",
"relationGuid": "a0b7da02-1ccd-4415-bc54-3d0cdb8857e7",
"displayText": "Accounts"
}, {
"categoryGuid": "e6a3df1f-5670-4f9e-84da-91f77d008ce3",
"relationGuid": "0e84a358-a4aa-4bd3-b806-497a6962ae1d",
"displayText": "Customer"
}, {
"categoryGuid": "7f041401-de8c-443f-a3b7-7bf5a910ff6f",
"parentCategoryGuid": "e6a3df1f-5670-4f9e-84da-91f77d008ce3",
"relationGuid": "7757b031-4e25-43a8-bf77-946f7f06c67a",
"displayText": "Loans"
}]
}
- Term
{
"guid": "e441a540-ee55-4fc8-8eaf-4b9943d8929c",
"qualifiedName": "fixed_mtg@SampleBank",
"displayName": "15-30 yr mortgage",
"shortDescription": "Short description",
"longDescription": "Long description",
"examples": ["N/A"],
"abbreviation": "FMTG",
"anchor": {
"glossaryGuid": "2f341934-f18c-48b3-aa12-eaa0a2bfce85",
"relationGuid": "dbc46795-76ff-4f68-9043-be0eff0bc0f3"
},
"categories": [{
"categoryGuid": "7f041401-de8c-443f-a3b7-7bf5a910ff6f",
"relationGuid": "b4cddd33-7b0c-41e2-9324-afe549ec6ada",
"displayText": "Loans"
}],
"seeAlso" : [],
"synonyms" : [],
"antonyms" : [],
"replacedBy" : [],
"replacementTerms" : [],
"translationTerms" : [],
"translatedTerms" : [],
"isA" : [],
"classifies" : [],
"preferredTerms" : [],
"preferredToTerms": [ {
"termGuid" : "c4e2b956-2589-4648-8596-240d3bea5e44",
"displayText": "ARM Loans"
}]
}
- Category
{
"guid": "7f041401-de8c-443f-a3b7-7bf5a910ff6f",
"qualifiedName": "Loans.Customer@HortoniaBank",
"displayName": "Loans",
"shortDescription": "Loan categorization",
"anchor": {
"glossaryGuid": "2f341934-f18c-48b3-aa12-eaa0a2bfce85",
"relationGuid": "7757b031-4e25-43a8-bf77-946f7f06c67a"
},
"parentCategory": {
"categoryGuid": "e6a3df1f-5670-4f9e-84da-91f77d008ce3",
"relationGuid": "8a0a8e11-0bb5-483b-b7d6-cfe0b1d55ef6"
},
"childrenCategories" : [],
"terms": [{
"termGuid": "e441a540-ee55-4fc8-8eaf-4b9943d8929c",
"relationGuid": "b4cddd33-7b0c-41e2-9324-afe549ec6ada",
"displayText": "15-30 yr mortgage"
}, {
"termGuid": "c4e2b956-2589-4648-8596-240d3bea5e44",
"relationGuid": "8db1e784-4f04-4eda-9a58-6c9535a95451",
"displayText": "ARM loans"
}]
}
5.2 CURD
5.2.1 创建操作(CREATE)
- 创建术语表
- 创建一个术语
- 创建分类术语
- 用关系创建术语
- 创建一个类别
- 创建具有层次结构的类别
- 创建类别并对术语进行分类
- 为实体分配术语
注意:
- 在创建操作期间,术语表,术语和类别将获得自动分配的GUID和qualifiedName。
- 要创建包含子项的类别,必须事先创建子项。
- 要创建属于某个类别的术语,必须事先创建该类别。
- 要创建关系术语,必须事先创建相关术语。
5.2.2 读操作(READ)
- 通过GUID获取术语表 - 提供属于术语表的所有术语和类别(标题)。
- 获取所有术语表 - 为所有术语表提供他们的术语和类别(标题)。
- 通过GUID获取术语 - 提供有关术语,其所属类别(如果有)以及任何相关术语的详细信息。
- 通过GUID获取类别 - 提供有关类别,类别层次结构(如果有)和属于该类别的术语的详细信息。
- 获取给定术语表的所有术语 - 提供属于给定术语表的所有术语(具有#3中提到的详细信息)。
- 获取给定术语表的所有类别 - 提供属于给定术语表的所有类别(具有#4中提到的详细信息)。
- 获取与给定术语相关的所有术语 - 提供与给定术语相关/链接的所有术语。
- 获取与给定类别(父母和子女)相关的所有类别
- 获取给定类别的所有条款
5.2.3 更新操作(UPDATE)
- 局部更新术语表
- 局部更新术语
- 局部更新类别
- 更新给定的词汇表
- 更新给定的术语
- 更新给定的类别
注意:
- 局部更新仅处理词汇表模型文件中定义的原始属性。
- 分配后,无法更改GUID和qualifiedName。唯一的方法是删除并重新创建所需的对象。
- 在任何更新中都无法删除锚点
- 更新API期望在GET调用之后就地修改JSON。任何缺失的属性/关系都将被删除。
- 对类别层次结构的任何更新都会导致对其下的层次结构进行级联更新,例如锚更改会影响所有子项,父项更改会影响self和children的qualifiedName。
5.2.4 删除操作(DELETE)
- 删除术语表 - 删除锚定到给定词汇表的所有类别和术语。如果已为实体分配任何术语,则会阻止此删除。
- 删除术语 - 仅当术语未与任何实体关联/分配时才删除该术语。
- 删除类别 - 仅删除给定类别,所有子项都成为*类别。
- 从实体中删除术语分配