开源数据发现平台: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
文档
- https://www.amundsen.io/amundsen/
从发行版启动元数据服务
$ 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
从源代码启动元数据服务
$ 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 启动服务
$ 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。
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 并包含以下配置:
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
:
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 暂未实现此功能。
开发者指南
代码风格
- PEP 8:遵循 Python 代码风格指南
- 类型提示:使用类型标注增强可读性
API 文档
我们通过 Flasgger 提供符合 OpenApi 3.0.2 规范的 Swagger 文档。新增/修改 API 时请同步更新文档。本地运行应用后访问 localhost:5002/apidocs/
查看文档(目前仅支持本地配置)。
代码结构
请查阅代码结构文档了解 Amundsen 元数据服务的模块组织方式。
往返测试
往返测试是新功能——通过实现 abstract_proxy_tests 和在 base_proxy 中添加测试端点,可针对实际数据存储验证代理代码。默认不运行这些测试,需通过 --roundtrip-[proxy]
参数触发(注意:需要完整配置的后端环境):
python -m pytest --roundtrip-neptune .
配置
大部分配置通过Flask Config Class设置。
徽章系统
要为资源添加徽章,需先将徽章名称和类别的组合添加到 WHITELIST_BADGES Config Class中。
示例:
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定义的字段字典。
示例:
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_infoUSER_DETAIL_METHOD = get_user_details
统计格式规范 可选
此变量用于重新格式化用户界面显示的统计信息。键为统计项名称,值为包含以下可选键的字典:
- new_name - 重命名统计项(未提供时使用原名称)
- format - 数值格式化方式(未提供时使用原始格式)
- drop - 是否在界面隐藏该统计项(未提供时默认显示)
示例(使用deeque库时):
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)
}
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。