DataHub是为现代数据栈【Modern Data Stack】构建的第三代元数据平台,支持数据发现、协作、治理和端到端可观察性。DataHub采用模型优先的理念,专注于解锁不同工具和系统之间的互操作性。
通过Datahub的架构图可以清晰的了解Datahub的架构组成。
主要分为三部分:
Ingestion框架是一个模块化的、可扩展的Python库,用于从外部源系统(如kafka、mysql)提取元数据,将其转换为DataHub的元数据模型,并通过Kafka或直接使用元数据存储Rest API将其写入DataHub。
元数据Ingestion Plugin支持的列表详见metadata-ingestion plugin,针对mysql、hive、kafka、postgre等,还可以通过sqlalchemy支持所有jdbc源
使用示例:datahub ingest -c mysql_to_datahub_rest.yml
GraphQL API提供了一个强类型的、面向实体的API,它使得与构成元数据图的实体的交互变得简单,包括添加和删除标签、所有者、链接和更多的元数据实体!
如何使用参见GraphQL API getting-started
DataHub提供了一个React UI,包括一组不断发展的特性,使发现、管理和调试你的数据资产变得简单和愉快。
提供的功能包括如下:
需要提前安装 docker,jq,docker-compose。同时保证系统的python版本为 Python 3.6+。
针对系统的要求至少满足: 2 CPUs, 8GB RAM, 2GB Swap area, and 10GB disk space.
准备conda环境
部分pip install --upgrade pip wheel setuptools
pip uninstall datahub acryl-datahub || true
pip install --upgrade acryl-datahub
datahub version
因为要下载docker image,所以会经过漫长的下载过程,需要耐心等待。本人安装时,主要碰到如下错误:
datahub docker quickstart
元数据摄取使用的是插件架构,你仅需要安装所需的插件。
摄取MySQL源的元数据,需要安装如下插件:
pip install 'acryl-datahub[mysql]'
检查安装情况:datahub check plugins
可以看到mysql 后面的 (disabled) 没有了,
recipe一个配置文件,它告诉摄取脚本从哪里提取数据(源)和把数据放在哪里(接收),示例如下:
`vim mysql_to_datahub_rest.yml``
source:
type: mysql
config:
host_port: '172.25.21.123:3306'
username: videoweb
password: suntek
database: md_data_dictionary
include_views: false
profiling:
enabled: false
transformers:
-
type: simple_add_dataset_tags
config:
tag_urns:
- 'urn:li:tag:172.25.21.123'
sink:
type: datahub-rest
config:
server: 'http://172.25.21.22:8080'
datahub ingest -c mysql_to_datahub_rest.yml
运行后,会打元数据摄取报告,如下:
Source (mysql) report:
{'entities_profiled': 0,
'failures': {},
'filtered': [],
'query_combiner': None,
'soft_deleted_stale_entities': [],
'tables_scanned': 1836,
'views_scanned': 0,
'warnings': {},
'workunit_ids': ['zyt_test.person',
......
'zyt_test.user'],
'workunits_produced': 1836}
Sink (datahub-rest) report:
{'downstream_end_time': datetime.datetime(2022, 1, 28, 11, 14, 49, 4127),
'downstream_start_time': datetime.datetime(2022, 1, 28, 11, 14, 17, 910894),
'downstream_total_latency_in_seconds': 31.093233,
'failures': [],
'records_written': 1836,
'warnings': []}
Pipeline finished successfully
摄取样例元数据,请从终端运行以下CLI命令:datahub docker ingest-sample-data
运行结果如下:
Source (file) report:
{'failures': {},
'warnings': {},
'workunit_ids': ['file:///tmp/tmpnpyfcgho.json:0',
'file:///tmp/tmpnpyfcgho.json:1',
'file:///tmp/tmpnpyfcgho.json:2',
......
'file:///tmp/tmpnpyfcgho.json:83',
'file:///tmp/tmpnpyfcgho.json:84',
'file:///tmp/tmpnpyfcgho.json:85'],
'workunits_produced': 86}
Sink (datahub-rest) report:
{'downstream_end_time': datetime.datetime(2022, 1, 28, 12, 55, 37, 412504),
'downstream_start_time': datetime.datetime(2022, 1, 28, 12, 55, 36, 319103),
'downstream_total_latency_in_seconds': 1.093401,
'failures': [],
'records_written': 86,
'warnings': []}
Pipeline finished successfully
在摄取元数据后,刷新datahub页面,能正常的查看元数据信息:
根据Tag查看元数据
要清除DataHub的所有状态,可以使用CLI nuke命令,示例如下:
datahub docker nuke
如果你想删除容器但保留数据,你可以在命令中添加--keep-data
标志。
datahub采用docker-compose、docker安装时,默认会占用如下端口,如果被占用,会导致相应的服务不能启动,导致安装失败
通过如下命令,查看docker使用port的情况
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}"
在使用pip安装acryl-datahub[mysql] ingestion插件时,最后报:Cannot uninstall ‘ruamel-yaml’. It is a distutils installed project
安装命令如下:
pip install 'acryl-datahub[mysql]'
解决方案参见: fail-to-install-great-expectation-error-cannot-uninstall-ruamel-yaml
将安装命令调整为:pip install 'acryl-datahub[mysql]' --ignore-installed ruamel.yaml
解决步骤如下:
pip show acryl_datahub
, 如/opt/anaconda3/lib/python3.7/site-packagescd /opt/anaconda3/lib/python3.7/site-packages
vi datahub/cli/docker.py
issues = check_local_docker_containers()
修改为 issues = False
,即跳过docker container检查def ingest_sample_data(path: Optional[str]) -> None:
"""Ingest sample data into a running DataHub instance."""
if path is None:
click.echo("Downloading sample data...")
with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as tmp_file:
path = str(pathlib.Path(tmp_file.name))
# Download the bootstrap MCE file from GitHub.
mce_json_download_response = requests.get(GITHUB_BOOTSTRAP_MCES_URL)
mce_json_download_response.raise_for_status()
tmp_file.write(mce_json_download_response.content)
click.echo(f"Downloaded to {path}")
# Verify that docker is up.
issues = check_local_docker_containers()
Docker可能会有各种各样的问题,比如容器冲突和悬空卷【dangling volumes】,这些问题通常可以通过如下命令来解决。请注意:该命令删除所有未使用的容器、网络、映像(悬挂的和未引用的),以及可选的卷。
docker system prune