开源数据发现平台:Amundsen Metadata Service 元数据服务

Amundsen 是一个数据发现和元数据引擎,旨在提高数据分析师、数据科学家和工程师与数据交互时的生产力。目前,它通过索引数据资源(表格、仪表板、数据流等)并基于使用模式(例如,查询频率高的表格会优先于查询频率低的表格)提供页面排名式的搜索功能来实现这一目标。您可以将其视为数据版的 Google 搜索。该项目以挪威探险家罗尔德·阿蒙森 (Roald Amundsen) 的名字命名,他是第一个发现南极的人。

Amundsen Metadata Service

Amundsen 元数据服务

Amundsen 元数据服务提供 RESTful API,负责提供和更新元数据,例如表和列的描述信息以及标签。该服务可使用 Neo4j、Apache Atlas、AWS Neptune 或 MySQL RDS 作为持久层。

有关 Amundsen 及其他服务的信息,请参阅此 README.md。另请查看我们的快速入门指南(使用模拟数据启动 Amundsen)及架构概述

要求

  • Python >= 3.8

文档

从发行版启动元数据服务

bash 复制代码
$ venv_path=[虚拟环境路径]
$ python3 -m venv $venv_path
$ source $venv_path/bin/activate
$ pip3 install amundsen-metadata
$ python3 metadata_service/metadata_wsgi.py

# 在另一个终端验证返回 HTTP/1.0 200 OK
$ curl -v http://localhost:5002/healthcheck

从源代码启动元数据服务

bash 复制代码
$ git clone https://github.com/amundsen-io/amundsenmetadatalibrary.git
$ cd amundsenmetadatalibrary
$ python3 -m venv venv
$ source venv/bin/activate
$ pip3 install -e ".[all]" .
$ python3 metadata_service/metadata_wsgi.py

# 在另一个终端验证返回 HTTP/1.0 200 OK
$ curl -v http://localhost:5002/healthcheck

通过 Docker 启动服务

bash 复制代码
$ docker pull amundsendev/amundsen-metadata:latest
$ docker run -p 5002:5002 amundsendev/amundsen-metadata
# 替代方案:生产环境使用 Gunicorn(见下方官网链接)
$ ## docker run -p 5002:5002 amundsendev/amundsen-metadata gunicorn --bind 0.0.0.0:5002 metadata_service.metadata_wsgi

# 在另一个终端验证返回 HTTP/1.0 200 OK
$ curl -v http://localhost:5002/healthcheck

生产环境

默认情况下,Flask 使用 Werkzeug 开发服务器。生产环境请使用生产级 Web 服务器如 Gunicorn

bash 复制代码
pip install gunicorn
gunicorn metadata_service.metadata_wsgi

Gunicorn 配置文档

非本地环境配置

默认情况下,元数据服务使用 LocalConfig(查找运行在 localhost 的 Neo4j)。如需使用不同终端节点,需创建适合的 Config 类,并通过环境变量引用:METADATA_SVC_CONFIG_MODULE_CLASS

例如:为生产环境创建不同配置时,可继承 Config 类创建 ProdConfig,并通过环境变量传递。假设类名为 ProdConfig 且位于 metadata_service.config 模块,则设置如下:

METADATA_SVC_CONFIG_MODULE_CLASS=metadata_service.config.ProdConfig

此方式使元数据服务在生产环境使用生产配置。配置加载机制的更多信息参考 Flask 文档

Apache Atlas

Amundsen 元数据服务可使用 Apache Atlas 作为后端。相比 Neo4j 的优势包括:Atlas 提供多服务插件(如 Apache Hive/Spark)支持基于推送的更新,并通过 Apache Ranger 设置元数据访问/编辑策略。

Apache Atlas 是数据治理服务,提供管理界面便于访问元数据(主要面向管理员而非终端用户,建议终端用户使用 Amundsen UI)。

Atlas 是目前 Amundsen 中唯一同时支持推送/拉取元数据的代理:

  • 推送模式:利用 Atlas Hive Hook(作为事件监听器与 Hive Metastore 协同运行),将 Hive Metastore 事件转为 Atlas 实体并推送至 Kafka 主题,由 Atlas 内部处理
  • 拉取模式:利用 Amundsen Databuilder 与 Atlas 的集成,通过 Databuilder 提取器(如 PostgresMetadataExtractor)收集外部系统元数据,转换为 Amundsen 可消费格式发送至 Atlas

使用 Atlas 作为元数据服务后端时,需按前述方法创建 Config 并包含以下配置:

python 复制代码
PROXY_CLIENT = PROXY_CLIENTS['ATLAS'] # 或环境变量 PROXY_CLIENT='ATLAS'
PROXY_PORT = 21000          # 或环境变量 PROXY_PORT
PROXY_USER = 'atlasuser'    # 或环境变量 CREDENTIALS_PROXY_USER
PROXY_PASSWORD = 'password' # 或环境变量 CREDENTIALS_PROXY_PASSWORD

通过 Docker 启动 Atlas 服务时,请确保 DNS(或 docker-compose)中配置了 atlasserver

bash 复制代码
docker run -p 5002:5002 --env PROXY_CLIENT=ATLAS --env PROXY_PORT=21000 --env PROXY_HOST=atlasserver --env CREDENTIALS_PROXY_USER=atlasuser --env CREDENTIALS_PROXY_PASSWORD=password amundsen-metadata:latest

注意

Apache Atlas 支持细粒度访问控制,但 Amundsen 暂未实现此功能。

开发者指南

代码风格

API 文档

我们通过 Flasgger 提供符合 OpenApi 3.0.2 规范的 Swagger 文档。新增/修改 API 时请同步更新文档。本地运行应用后访问 localhost:5002/apidocs/ 查看文档(目前仅支持本地配置)。

代码结构

请查阅代码结构文档了解 Amundsen 元数据服务的模块组织方式。

往返测试

往返测试是新功能------通过实现 abstract_proxy_tests 和在 base_proxy 中添加测试端点,可针对实际数据存储验证代理代码。默认不运行这些测试,需通过 --roundtrip-[proxy] 参数触发(注意:需要完整配置的后端环境):

bash 复制代码
python -m pytest --roundtrip-neptune .

配置

大部分配置通过Flask Config Class设置。

徽章系统

要为资源添加徽章,需先将徽章名称和类别的组合添加到 WHITELIST_BADGES Config Class中。

示例:

python 复制代码
WHITELIST_BADGES: List[Badge] = [Badge(badge_name='beta',
                                 category='table_status')]

完成后,用户可通过以下命令添加白名单中的徽章:

curl -X PUT https://{amundsen metadata url}/table/"{table key}"/badge/{badge_name}?category={category}

用户详情方法 可选

此方法用于从第三方或自定义系统获取用户详情。该自定义函数接收user_id参数,返回符合UserSchema定义的字段字典。

示例:

python 复制代码
def get_user_details(user_id):
    user_info = {
        'email': 'test@email.com',
        'user_id': user_id,
        'first_name': 'Firstname',
        'last_name': 'Lastname',
        'full_name': 'Firstname Lastname',
    }
    return user_info

USER_DETAIL_METHOD = get_user_details

统计格式规范 可选

此变量用于重新格式化用户界面显示的统计信息。键为统计项名称,值为包含以下可选键的字典:

  • new_name - 重命名统计项(未提供时使用原名称)
  • format - 数值格式化方式(未提供时使用原始格式)
  • drop - 是否在界面隐藏该统计项(未提供时默认显示)

示例(使用deeque库时):

python 复制代码
STATISTICS_FORMAT_SPEC = {
        'stdDev': dict(new_name='标准差', format='{:,.2f}'),
        'mean': dict(format='{:,.2f}'),
        'maximum': dict(format='{:,.2f}'),
        'minimum': dict(format='{:,.2f}'),
        'completeness': dict(format='{:.2%}'),
        'approximateNumDistinctValues': dict(new_name='唯一值数量', format='{:,.0f}', ),
        'sum': dict(drop=True)
}

风险提示与免责声明

本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。