最近正在研究元数据和数据资产相关的知识与应用场景,同时也调研了相当多的框架,例如Apache Atlas,LinkedIn DataHub,以及咱们今天的主角OpenMetadata。
开源元数据管理平台
- Apache Atlas:Apache Atlas是一个开源的大数据元数据管理和数据治理平台,是一套可扩展的核心基础治理服务,可以为组织提供开放的元数据管理和治理功能,使组织能够构建其数据资产目录,对这些资产进行分类和治理,并为数据科学家、分析师和数据治理团队围绕这些数据资产提供协作功能。
- LinkedIn DataHub:LinkedIn DataHub是LinkedIn开源的元数据搜索和发现平台。它提供了一个集中式的元数据存储库,用于管理和浏览各种类型的数据集和数据资产的元数据信息。
- OpenMetadata:OpenMetaData是一个由中央元数据存储库、深入的血缘关系和无缝的团队协作提供支持的用于发现、可观测性和治理的统一平台。它是增长最快的开源项目之一,拥有充满活力的社区,并被各种行业垂直领域的不同公司采用。基于 Open Metadata 标准和 API,支持与广泛的数据服务的连接器,OpenMetadata 实现了端到端的元数据管理,让您能够自由释放数据资产的价值。
由于Atlas不太适用于非Hadoop生态,所以我们目光聚焦在了Datahub,Openmetadata上,重点比较了Openmetadata和Datahub的优缺点。
比较维度 | OpenMetadata | DataHub |
---|---|---|
架构与技术栈 | 优势: - 统一元数据模型,以 MySQL 存储,借助 Elasticsearch 搜索,JSON 模式存储关系,架构简洁 劣势:- 无专用图数据库,处理复杂关系能力或有不足 | 优势: - Kafka 介导摄取,多存储层结合- 支持多种数据消费方式,架构灵活劣势:- 架构相对复杂,部署和维护难度增加 |
元数据建模与摄取 | 优势: - 专注拉取式提取,Airflow 推送数据,以注释 JSON 模式文档存储,与部分现有工作流契合。劣势:- 数据提取方式灵活性逊于 DataHub | 优势: - 支持推拉两种提取方式,Kafka 推送,摄取更灵活;注释 PDL 存储,语义表达能力强。劣势:- 默认推送方式下 Kafka 配置和管理较复杂 |
数据治理能力 | 优势: - 基于角色访问控制,引入 "重要性" 概念,便于搜索,支持实体元数据扩展。劣势:- Action Framework 功能相对单一 | 优势: - Action Framework 支持事件驱动的外部工作流,"域" 标签优化搜索。劣势:- 相比 OpenMetadata,在实体元数据扩展方面较弱 |
数据沿袭 | 优势: - 支持表级和列级沿袭,功能更新快,Python SDK 可获取自定义数据。劣势:- 暂未发现明显劣势 | 优势: - 支持表级和列级沿袭,提取方式多样。劣势:- 部分数据源列级沿袭支持有限 |
数据质量与剖析 | 优势: - 集成数据质量和剖析功能,支持外部工具,自有框架提供预定义测试。劣势:- 自有框架使用需一定 Python 编程能力 | 优势: - 通过集成外部工具实现数据质量功能,支持数据契约。劣势:- 原生数据质量功能尚不完善,依赖外部集成 |
上下游集成 | 优势: - 超 50 个连接器,支持多种数据源,有与 Great Expectations 和 Prefect 集成。劣势:- API 和 SDK 丰富度不及 DataHub | 优势: - 提供多种 API 和 SDK,交互方式多样。劣势:- 连接器数量和种类相对较少 |
从上述比较来说,我们的需求是元数据管理和数据资产管理,这两个框架是完全能够胜任,元数据采集的类型也是非常丰富的,但由于我们接入了很多国产数据库,BI,例如Kingbase,Dm,Yonghong BI,guanyuan Bi等,需要采集这些元数据,就不得不涉及到二次开发。在考虑到团队主要是以Java作为开发语言,以及整体运维体系来说,还是Openmetadata更加适合我们。
本文不涉及Openmetadata的操作,只跟大家探讨学习一下Openmetadata的源码如何在本地运行。
Openmetadata源码搭建
我们使用Openmetadata的版本为1.5.x,首先需要从github上面clone下Openmetadata的源码。
源码地址:github.com/open-metada...
我本地是用mac,所以只展示了mac运行的方式。
说明:
- ${OPNEMETADATA_HOME}指的就是Openmetadata的根目录
- 执行make命令,docker命令或者其他一些命令,一律都要在${OPNEMETADATA_HOME}下执行。
架构和技术
OpenMetadata依赖以下组件来:
- 用JsonSchemas 来定义元数据模式
- 用Dropwizard/Jetty 来构建Web 和 REST API 的,而并非采用Spring mvc的方式构建
- MySQL 8.x用于存储元数据。
- ElasticSearch 7.x用于索引元数据并支持搜索。
必要条件
- Docker 20 or higher:也不是必须的,你可以手动安装mysql和es。不通过docker的方式部署
- Java JDK 17:必须,Openmetadata是完全采用了jdk 17来实现。
- Antlr 4.9.2:必须,需要生成对象。执行命令:
sudo make install_antlr_cli
- JQ:必须,需要生成对象,大部分Domain都是通过jsonSchema定义好的,需要jq来处理。执行命令:
brew install jq
- Maven 3.5.x or higher - (with Java JDK 11):必须
- Python 3.8 or 3.9:我用的是miniconda安装的python env。不是必须的,其主要作用就是要进行git pre-commit check以及openmetadata python集成测试需要。pre-commit check可以去掉。
- Node 18.x:必须
- Yarn ^1.22.0:必须
- Rpm (Optional, only to run RPM profile with maven):非必须,我没安装。
你也可以在${OPNEMETADATA_HOME}下执行
shell
make prerequisites
检查一下是否已经满足条件。
当然也可以不检查,毕竟不是每个组件都安装了。
后端运行
安装mysql和es
我是用的是docker-compose来安装的。你可以在安装之前修改一下docker-compose.yml文件,文件路径在${OPNEMETADATA_HOME}/docker/development/docker-compose.yml
文件内容如下:参考一些注释,按需修改
yaml
version: "3.9"
volumes:
es-data:
services:
mysql:
build:
context: ../../.
dockerfile: docker/mysql/Dockerfile_mysql
command: "--sort_buffer_size=10M"
container_name: openmetadata_mysql
restart: always
depends_on:
- elasticsearch
environment:
MYSQL_ROOT_PASSWORD: password ## mysql root 用户密码,可以修改
expose:
- 3306
ports:
- "3306:3306"
networks:
- local_app_net
healthcheck:
test: mysql --user=root --password=$$MYSQL_ROOT_PASSWORD --silent --execute "use openmetadata_db"
interval: 15s
timeout: 10s
retries: 10
volumes:
- ./docker-volume/db-data:/var/lib/mysql ## mysql data挂载路径,可按需修改
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: openmetadata_elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1024m -Xmx1024m
- xpack.security.enabled=false
networks:
- local_app_net
expose:
- 9200
- 9300
ports:
- "9200:9200"
- "9300:9300"
healthcheck:
test: "curl -s http://localhost:9200/_cluster/health?pretty | grep status | grep -qE 'green|yellow' || exit 1"
interval: 15s
timeout: 10s
retries: 10
volumes:
- es-data:/usr/share/elasticsearch/data ## es data挂载路径,可按需修改
## 省略了其余内容
networks:
local_app_net:
name: ometa_network
ipam:
driver: default
config:
- subnet: "172.16.239.0/24"
执行命令
shell
docker compose -f docker/development/docker-compose.yml up mysql elasticsearch --build -d
maven编译
由于我省略了一些步骤,比如python没有安装,例如git pre-commit check,如果你也像我一样,需要在${OPENMETADATA_HOME}/openmetadata-ui/src/main/resources/ui/package.json去掉prepare command。
另外,我还去掉了所有的maven-gpg-plugin插件,因为有报错,我暂时也不想解决,感觉就全部去掉了。
然后执行命令:
shell
mvn clean install -Dmaven.test.skip=true
如果还有问题,也可以留言。
初始化数据库脚本
在初始化数据库脚本之前,需要先修改配置文件,配置文件路径在${OPENMETADATA_HOME}/conf/openmetadata.yaml
一般只需要修改jdbc连接和es连接即可。
修改成自己的数据库连接信息和es连接信息之后,执行命令:
shell
sh bootstrap/openmetadata-ops.sh drop-create
官网上建议,maven打包后,会在openmetadata-dist/target目录下有个open-metadata-.tar.gz文件,你可以解压,然后在解压后的目录下执行上述的命令,我觉得都一样,不过可以作为上述步骤的一个check动作。
运行openmetadata-server
把项目导入到idea后,操作步骤如下:
- 点击Edit-Configurations。
- 新增Application类型的运行程序。
- 配置运行程序
- Name:是必填项
- 选择JDK 17
- 选择openmetadata-service模块
- 运行主类为:org.openmetadata.service.OpenMetadataApplication
- 添加运行主类需要的参数:server ./conf/openmetadata.yaml
- 然后即可运行,端口为8585。
前端运行
前端必要条件
- Node 18.x:必须
- Yarn ^1.22.0:必须
生成typescript的类
如果你参考了上述的步骤都已经执行成功了,这一步骤可以省略,但如果上述所有步骤你没有操作,只想运行前端代码,需要参考下面的步骤,帮助你从 JSONSchema生成 TypeScript Type。
我们使用的是quicktype从 JSON 模式生成类型,所以需要确保你已安装quicktype,如果没有安装,请在${OPENMETADATA_HOME}以下命令进行安装。
shell
yarn install
执行完以后需要到openmetadata-ui/src/main/resources/ui,运行以下命令。
shell
yarn run json2ts
上述命令将需要一些时间来执行并生成类型。之后,你可以转到生成的openmetadata-ui/src/main/resources/ui/src/generated/*文件夹并查看所有生成的类型。
运行前端
一旦在系统中安装了节点和 yarn,你就可以执行以下步骤来运行 OpenMetadata 前端。
- 安装依赖项是一次性任务。如果package.json文件有任何更改,则必须再次执行以下步骤。
shell
make yarn_install_cache
- 在${OPENMETADATA_HOME}下执行命令。
shell
make yarn_start_dev_ui
- 在浏览器上访问http://localhost:3000 以访问 OpenMetadata 前端界面。
参考文献
本人这篇文章去掉了集成测试等操作,适合更加快速的,入门级别的运行源码,如果想更加详细的说明,可以参考官网docs.open-metadata.org/v1.5.x/deve...