DataHub调研数据血缘

DataHub调研&数据血缘

1. DataHub? 阿里的数据工具datahub?

回答: 不是
DataHub是由Linkedin开源的,官方喊出的口号为:The Metadata Platform for the Modern Data Stack - 为现代数据栈而生的元数据平台。官方网站A Metadata Platform for the Modern Data Stack | DataHub。目的就是为了解决多种多样数据生态系统的元数据管理问题,它提供元数据检索、数据发现、数据监测和数据监管能力,帮助大家解决数据管理的复杂性。

DataHub基于Apache License 2开源,采用基于推送的数据收集架构(当然也支持pull拉取的方式),能够持续收集变化的元数据。当前版本已经集成了大部分流行数据生态系统接入能力,包括但不限于:Kafka, Airflow, MySQL, SQL Server, Postgres, LDAP, Snowflake, Hive, BigQuery。

源码仓库地址:

  • GitHub - linkedin/datahub: The Metadata Platform for the Modern Data Stack 该仓库包含DataHub前端和后端服务的完整源码。(DataHub采用先进的前后端分离架构)
  • https://github.com/linkedin/datahub-gma 该仓库包含DataHub元数据搜索和发现服务GMA

当前支持的数据栈列表:

数据源名称版当前支持状态
Athena支持
BigQuery支持
Delta Lake计划支持
Druid支持
Elasticsearch支持
Hive支持
Hudi计划支持
Iceberg支持
Kafka Metadata支持
MongoDB支持
Microsoft SQL Server支持
MySQL Oracle PostreSQL支持
Redshift支持
s3支持
Snowflake支持
Spark/Databricks部分支持
Trino FKA Presto支持

市面上常见的元数据管理系统有如下几个,后面章节进行比对:
a) linkedin datahub
b) apache atlas
c) lyft amundsen

2. 主要功能

DataHub是端到端的元数据发现工具,可以帮助数据管理者挖掘其公司数据的价值。

端到端搜索和发现

1)在数据库、数据湖、BI平台、ML特征存储、工作流配置等数据资产中进行[元数据集中查询搜索]

比如:在DataHub里面搜索"health",从所有的元数据(BigQuery数据集、DataHub Tags/Users等)中,得到了所有相关结果,可以在结果中,点击查看相关的结果。

2)通过跨平台、数据集、管道的[血缘关系追踪],轻松理解数据的端到端旅程

3)通过线性血缘图,快速获取相关实体的上下文

4)获取数据集准确性和相关性的确切信息

比如:DataHub针对流行的数据仓库平台提供数据集合的详细信息浏览和实用信息统计,让数据从业者更容易理解数据的形态。

构造坚实的文档和标签基础

1)通过API或DataHub UI获取并维护公司的知识库

​ 随着我们日常操作中定义和用例的丰富,DataHub可以轻松地更新和维护文档。除了通过GMS管理文档外,DataHub通 过UI界面提供丰富的文档和外部支持链接操作界面。

2)通过API或DataHub UI创建和定义新的标签(tag)

​ 在DataHub中可以通过GraphQL API轻松的创建和添加任何实体标签,这样随着时间的推移,实体的属性回越来越丰富。当有一天我们想要查看某一标签的相关实体信息时,只需要在标签位置点击该标签,就会将所有相关的实体数据 列出来。

触手可及的数据治理

1) 快速将资产所有权分配给用户或用户组

2) 使用策略管理细粒度访问控制

DataHub管理员可以创建相应的策略,来定义谁可以在哪些资源上执行什么样的活动。在指定策略时,同时管理员还可以进行如下指定操作:

  • 平台型策略 - 最高级别的DataHub平台权限,比如用户管理、组管理和策略管理等
  • 资源型策略 - 指定资源类型,比如数据集、看板、管道等
  • 权限策略 - 选择权限范围集合,比如编辑用户、编辑文档、编辑链接等
  • 用户或组策略 - 分配相关的用户或租;比如可以直接将策略分配给资源使用的用户,而不必太关注他属于哪个组

元数据质量和使用分析

通过DataHub可以对元数据进行深度挖掘。DataHub提供的分析视图可以清晰的展示元数据相关的操作信息,比如用户权限分配的频繁度、本周活动用户、常用的搜索条件及活动等。

3. 架构

Datahub的采用了model-first的架构理念,通过提供一个通用的元数据管理模型,再通过插件的方式集成各种数据平台,进行元数据的导入。整体的架构如下:
在这里插入图片描述
该架构的优点有2个:

    1. 元数据同步方式多样:可以使用Rest、GraphQL API-s、Avro API(从Kafka消费元数据)
    1. 数据平台的元数据更改可以实时的被同步到Datahub;在Datahub对元数据进行更改,可以实时的在数据平台进行更新

3.1 Ingestion Framework的架构

DataHub支持Push、Pull、同步和异步的元数据导入
在这里插入图片描述

3.1.1 Metadata Change Event(MCE)

MCE是元数据导入的中心。各种数据平台的元数据的实时变更,发送到MCE(由Kafka负责),这是一种异步元数据同步。也可以直接将数据平台的元数据通过HTTP方式发送到Datahub,这是一种同步元数据导入

3.1.2 Pull-based Integration

Datahub通过基于Python的metadata-ingestion系统,从不同的数据平台Pull元数据。然后将元数据Push到Kafka(MCE)或直接Push到Datahub。还可以从Airflow调度系统同步元数据和血缘关系

3.1.3 Push-based Integration

可以向Kafka Push一个元数据变更事件(MCE),或通过HTTP Push数据到Datahub。DataHub还提供了一些简单的Python emitters ,将其集成到我们自己的系统中,以便获取我们自己的系统元数据

3.1.4 Applier(mce-consumer)

消费Kafka的元数据消息,并转换成Datahub的元数据储存格式,再同步到Datahub

3.2 Datahub Serivce Tier架构

主要的服务是datahub-gms,它提供了一个REST API和一个GraphQL API对元数据进行CRUD操作,还提供支持二级索引、全文搜索的搜索查询,和血缘关系的图数据库查询API
在这里插入图片描述

3.2.1 Metadata Storage

储存元数据的数据库,如Mysql、Postgresql、Couchbase

3.2.2 Metadata Commit Log Stream(MAE)

当将元数据更改更新到Metadata Storage中,Datahub Service Tier还会将该更改事件发送到Kafka

3.2.3 Metadata Index Applier (mae-consumer-job)

mae-consumer-job消费MAE(Kafka)中的数据,然后将更改事件流更新到elastic和neo4j,并生成相应的search index和graph index

3.2.4 Metadata Query Serving

基于主键的元数据读取,是从Data store数据库读取的。基于二级索引的元数据读取和全文搜索的元数据读取,是从elastic数据库读取的。基于血缘关系的图查询是从neo4j数据库读取的

4. 内部模块

4.1 Metadata Strore

用于储存Metadata 的Entities和Aspects(切面是一组属性的集合)。同时提供插入和查询API。其中储存由MySQL、Elasticsearch、Kafka负责。Rest API由Java Spring负责
在这里插入图片描述

4.2 Metadata Models

在这里插入图片描述
元数据模型采用PDL建模语言进行建模。分为Entity、Aspects、Relationships。

Entity:表示一个实体(如果数据库的一个表),每个实体实例都有一个唯一标识符;
Aspects:表示实体实例的术语、标签等;(DatasetProperties)包含一组描述数据集(Dataset)的属性(attributes)。切面可以在一组实体间共享,例如:属主(Ownership)是一个可以在多个拥有“拥有者(owners)”属性的实体间共享。
Relationships:表示不同实体实例的关系

下面是一个示例图,它由3种类型的实体(CorpUser、 Chart、 Dashboard)、2种类型的关系(OwnedBy、 Contains)和3种类型的元数据方面(OwnedInfo、 ChartInfo 和 DashboardInfo)组成。
在这里插入图片描述
实体(Entities)的核心类型:

  • Data Platform: 一种数据“平台”。也就是说,涉及处理、存储或可视化数据资产的外部系统。示例包括 MySQL、 Snowflake、 Redshift 和 S3。
  • DataSet: 一组数据。表、视图、流、文档集合和文件都在 DataHub 上建模为“数据集”。数据集可以有标记、所有者、链接、术语表术语和附加到它们的描述。它们还可以具有特定的子类型,如“视图”、“集合”、“流”、“探索”等。示例包括 Postgres 表、 MongoDB 集合或 S3文件。
  • Chart: 图表,从数据集派生的单个数据可视化。单个图表可以是多个仪表板的一部分。图表可以有标签、所有者、链接、术语表术语以及附加到它们的描述。示例包括超集或查看器图表。
  • Dashboard: 用于可视化的图表集合。仪表板可以有标签、所有者、链接、术语表术语和描述附加到它们上面。示例包括 Superset 或 Mode Dashboard。
  • Data Job,Task: 处理数据资产的可执行作业,其中“处理”意味着消耗数据、生成数据或两者兼而有之。数据作业可以有标签、所有者、链接、术语表术语以及附加到它们的描述。它们必须属于单个数据流。示例包括 Airflow 任务。
  • Data Flow(pipe line) : 数据作业的一个可执行集合,它们之间存在依赖关系,或者一个 DAG。数据作业可以有标签、所有者、链接、术语表术语以及附加到它们的描述。例子包括气流 DAG。

元数据模型不同实体间的关系:
在这里插入图片描述
DataSets元数据模型
DataSets元数据模型支持由三部分组成:

  • Data Platform (e.g. urn:li:dataPlatform:mysql)
  • Name (e.g. db.schema.name)
  • Env or Fabric (e.g. DEV, PROD, etc.)
    完整的: urn:li:dataset:(urn:li:dataPlatform:<platform>,<name>,ENV)
    在这里插入图片描述

4.3 Ingestion Framework

元数据导入框架通过插件(python库)的方式,集成到Datahub系统。
可以从不同的数据平台将元数据,两种方式:

  1. 以Rest API直接导入,
  2. 将元数据生产到Kafka,再从Kafka消费导入到Datahub

元数据导入只需定义一个YAML文件,并执行datahub元数据导入命令
在这里插入图片描述
元数据摄取

元数据集成datahub支持push-based与pull-based两种方式:
push-based:直接是数据源系统在元数据发生变化时主动推送到datahub
pull-based:是连接到数据源通过批量或者增量的方式提取元数据的过程

datahub提供两种形式的元数据摄取:通过直接api调用或kafka流。前者适合离线,后者适合实时。

datahub的api基于rest.li,这是一种可扩展的,强类型的restful服务架构,已在linkedin上广泛使用。由于rest.li使用pegasus作为其接口定义,因此可以逐字使用上一节中定义的所有元数据模型。从api到存储需要多层转换的日子已经一去不复返了-api和模型将始终保持同步。

对于基于kafka的提取,预计元数据生产者将发出标准化的元数据更改事件(mce),其中包含由相应实体urn键控的针对特定元数据方面的建议更改列表。

对api和kafka事件模式使用相同的元数据模型,使我们能够轻松地开发模型,而无需精心维护相应的转换逻辑。

元数据服务
datahub旨在支持对大量元数据的四种常见查询类型:

  • 面向文档的查询
  • 面向图的查询
  • 涉及联接的复杂查询
  • 全文搜索

4.4 GraphQL API

GraphQL API提供了一个强类型的、面向Entiry的API,通过GraphQL API与储存的元数据进行交互

在这里插入图片描述
4.5 User Interface

4.5 用户管理

新用户帐户可以通过3种方式在 DataHub 上供应:

    1. 共享邀请链接
    1. 使用 OpenID 链接来配置单点登录(支持的有Azure AD, Okta, keycloak,Ping!, Google Identity)
    1. 静态凭证配置文件(仅自托管)单点登录
      在这里插入图片描述
      在这里插入图片描述

5. 特性

5.1 SQL分析

每个表的行和列计数对于每个列:

  • 空值计数和比例
  • 不同的数量和比例
  • 最小值,最大值,平均值,中位数,标准差,一些分位数值
  • 独特值的直方图或频率
    在这里插入图片描述

5.2 数据血缘

DataHub 支持的数据血缘连接类型如下:

  • 数据集到数据集
  • 流水线谱系(数据集到作业到数据集dataset-to-job-to-dataset)
  • 从仪表盘到图表的血统
  • 图表到数据集的血缘
  • Job-to-dataflow (dbt 血缘)

字段血缘支持不足 没有atlas对hive那么精细?
新版本支持了字段血缘,FineGrainedLineages可以加上下游字段对应:
在这里插入图片描述
在这里插入图片描述

6. 安装

6.1 release版本

Data Hub v0.1.0-alpha Pre-release 2019-10-28 warehouse

LinkedIn开源出来的,原来叫做WhereHows 。经过一段时间的发展datahub于2020年2月在Github开源

VersionRelease DateLinks
v0.10.02023-02-07Release Notes, View on GitHub
v0.9.6.12023-01-31Release Notes, View on GitHub
v0.9.62023-01-13Release Notes, View on GitHub
v0.9.52022-12-23Release Notes, View on GitHub
v0.9.42022-12-20Release Notes, View on GitHub
v0.9.32022-11-30View on GitHub
v0.9.22022-11-04View on GitHub
v0.9.12022-10-31View on GitHub
v0.9.02022-10-11View on GitHub
v0.8.452022-09-23View on GitHub
v0.8.442022-09-01View on GitHub
v0.8.432022-08-09View on GitHub
v0.8.422022-08-03View on GitHub
v0.8.412022-07-15View on GitHub
v0.8.402022-06-30View on GitHub
v0.8.392022-06-24View on GitHub
v0.8.382022-06-09View on GitHub
v0.8.372022-06-09View on GitHub
v0.8.362022-06-02View on GitHub
v0.8.352022-05-18View on GitHub
v0.8.342022-05-04View on GitHub
v0.8.332022-04-15View on GitHub
v0.8.322022-04-04View on GitHub
v0.8.312022-03-17View on GitHub
v0.8.302022-03-17View on GitHub
v0.8.292022-03-10View on GitHub
v0.8.282022-03-07View on GitHub
v0.8.272022-02-23View on GitHub

6.2 安装步骤quickstart

# 下载源码包
# https://github.com/linkedin/datahub官网下载最新版本,此次调研使用的0.10.0版本
# 端口冲突,先将端口就行修改
sed -i "s/18087/18081/g" `grep "18087" -lr .`

# 创建一个虚拟环境
python3 -m venv tutorial-env
source tutorial-env/bin/activate

# 安装python环境
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
cd /usr/local/python3/Python-3.8.2
mkdir -p /usr/local/python3
yum install gcc

./configure --with-ssl --prefix=/usr/local/python3
 make && make install
 
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

# 开始安装环境
$ python3 -m pip install --upgrade pip wheel setuptools -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
$ python3 -m pip uninstall datahub acryl-datahub || true  # sanity check - ok if it fails
$ python3 -m pip install --upgrade acryl-datahub -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
$ datahub version

# 执行quickstart,需要互联网下载,会失败,这里直接指定到文件来start
datahub docker quickstart --quickstart-compose-file ./quickstart/docker-compose-without-neo4j.quickstart.yml

# 导入样例数据
python3 -m datahub check plugins
datahub docker ingest-sample-data

# 注入测试用例
cd /home/jzhou/datahub-0.10.0/metadata-ingestion
datahub ingest -c ./examples/recipes/example_to_datahub_rest.dhub.yaml --preview

#定时调度的方式
5 0 * * * datahub ingest -c /home/ubuntu/datahub_ingest/mysql_to_datahub.yml

# 获取urn信息	
datahub get --urn "urn:li:dataset:(urn:li:dataPlatform:mysql,datahub.jzhou_index,PROD)" --aspect globalTags

# 获取urn的时间线
datahub timeline --urn "urn:li:dataset:(urn:li:dataPlatform:mysql,datahub.jzhou_index,PROD)" --category TAG --start 7daysago

# 看kafka中topic的信息
./kafka-topics --bootstrap-server localhost:9092 --list

# 如何检查搜索索引是否在 Elasticsearch 创建?
curl http://localhost:9200/_cat/indices

导入样例数据的全过程:

(tutorial-env) [root@gs-server-13612 docker]# datahub docker ingest-sample-data
Downloading sample data...
Starting ingestion...
[2023-03-07 20:30:16,024] INFO     {datahub.ingestion.run.pipeline:184} - Sink configured successfully. DataHubRestEmitter: configured to talk to http://localhost:8080
[2023-03-07 20:30:16,032] INFO     {datahub.ingestion.run.pipeline:201} - Source configured successfully.
[2023-03-07 20:30:16,032] INFO     {datahub.ingestion.source.file:246} - Reading file /tmp/tmpqpib79m0.json in FileReadMode.BATCH mode

Cli report:
{'cli_version': '0.10.0.3',
 'cli_entry_location': '/home/jzhou/datahub-0.10.0/docker/tutorial-env/lib/python3.8/site-packages/datahub/__init__.py',
 'py_version': '3.8.2 (default, Mar  3 2023, 04:13:42) \n[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]',
 'py_exec_path': '/home/jzhou/datahub-0.10.0/docker/tutorial-env/bin/python3',
 'os_details': 'Linux-3.10.0-1127.13.1.el7.x86_64-x86_64-with-glibc2.17',
 'peak_memory_usage': '49.68 MB',
 'mem_info': '49.68 MB'}
Source (file) report:
{'events_produced': 99,
 'events_produced_per_sec': 15,
 'entities': {'corpuser': ['urn:li:corpuser:datahub', 'urn:li:corpuser:jdoe'],
              'corpGroup': ['urn:li:corpGroup:jdoe', 'urn:li:corpGroup:bfoo'],
              'dataset': ['urn:li:dataset:(urn:li:dataPlatform:kafka,SampleKafkaDataset,PROD)',
                          'urn:li:dataset:(urn:li:dataPlatform:hdfs,SampleHdfsDataset,PROD)',
                          'urn:li:dataset:(urn:li:dataPlatform:hive,SampleHiveDataset,PROD)',
                          'urn:li:dataset:(urn:li:dataPlatform:hive,logging_events,PROD)',
                          'urn:li:dataset:(urn:li:dataPlatform:hive,fct_users_created,PROD)',
                          'urn:li:dataset:(urn:li:dataPlatform:hive,fct_users_deleted,PROD)',
                          'urn:li:dataset:(urn:li:dataPlatform:s3,project/root/events/logging_events_bckp,PROD)'],
              'dataJob': ['urn:li:dataJob:(urn:li:dataFlow:(airflow,dag_abc,PROD),task_123)',
                          'urn:li:dataJob:(urn:li:dataFlow:(airflow,dag_abc,PROD),task_456)'],
              'dataFlow': ['urn:li:dataFlow:(airflow,dag_abc,PROD)'],
              'chart': ['urn:li:chart:(looker,baz1)', 'urn:li:chart:(looker,baz2)'],
              'dashboard': ['urn:li:dashboard:(looker,baz)'],
              'mlModel': ['urn:li:mlModel:(urn:li:dataPlatform:science,scienceModel,PROD)'],
              'tag': ['urn:li:tag:Legacy', 'urn:li:tag:NeedsDocumentation'],
              'dataPlatform': ['urn:li:dataPlatform:couchbase',
                               'urn:li:dataPlatform:external',
                               'urn:li:dataPlatform:hdfs',
                               'urn:li:dataPlatform:hive',
                               'urn:li:dataPlatform:kafka',
                               'urn:li:dataPlatform:kusto',
                               'urn:li:dataPlatform:mongodb',
                               'urn:li:dataPlatform:teradata',
                               'urn:li:dataPlatform:snowflake',
                               'urn:li:dataPlatform:glue',
                               '... sampled of 27 total elements'],
              'mlPrimaryKey': ['urn:li:mlPrimaryKey:(test_feature_table_all_feature_dtypes,dummy_entity_1)',
                               'urn:li:mlPrimaryKey:(test_feature_table_all_feature_dtypes,dummy_entity_2)',
                               'urn:li:mlPrimaryKey:(test_feature_table_no_labels,dummy_entity_2)',
                               'urn:li:mlPrimaryKey:(test_feature_table_single_feature,dummy_entity_1)',
                               'urn:li:mlPrimaryKey:(user_features,user_name)',
                               'urn:li:mlPrimaryKey:(user_features,user_id)',
                               'urn:li:mlPrimaryKey:(user_analytics,user_name)'],
              'mlFeature': ['urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_BYTES_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_DOUBLE_LIST_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_DOUBLE_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_FLOAT_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_INT64_LIST_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_INT64_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_STRING_LIST_feature)',
                            'urn:li:mlFeature:(test_feature_table_all_feature_dtypes,test_STRING_feature)',
                            'urn:li:mlFeature:(test_feature_table_no_labels,test_BYTES_feature)',
                            'urn:li:mlFeature:(user_features,is_premium_user)',
                            '... sampled of 20 total elements'],
              'mlFeatureTable': ['urn:li:mlFeatureTable:(urn:li:dataPlatform:feast,test_feature_table_all_feature_dtypes)',
                                 'urn:li:mlFeatureTable:(urn:li:dataPlatform:feast,test_feature_table_no_labels)',
                                 'urn:li:mlFeatureTable:(urn:li:dataPlatform:feast,test_feature_table_single_feature)',
                                 'urn:li:mlFeatureTable:(urn:li:dataPlatform:feast,user_features)',
                                 'urn:li:mlFeatureTable:(urn:li:dataPlatform:feast,user_analytics)'],
              'glossaryTerm': ['urn:li:glossaryTerm:CustomerAccount', 'urn:li:glossaryTerm:SavingAccount', 'urn:li:glossaryTerm:AccountBalance'],
              'glossaryNode': ['urn:li:glossaryNode:ClientsAndAccounts'],
              'container': ['urn:li:container:DATABASE', 'urn:li:container:SCHEMA'],
              'assertion': ['urn:li:assertion:358c683782c93c2fc2bd4bdd4fdb0153'],
              'query': ['urn:li:query:test-query']},
 'aspects': {'corpuser': {'corpUserInfo': 2, 'corpUserStatus': 1, 'status': 2},
             'corpGroup': {'corpGroupInfo': 2, 'status': 2},
             'dataset': {'browsePaths': 2,
                         'datasetProperties': 5,
                         'ownership': 7,
                         'institutionalMemory': 6,
                         'schemaMetadata': 7,
                         'status': 7,
                         'upstreamLineage': 6,
                         'editableSchemaMetadata': 1,
                         'globalTags': 1,
                         'datasetProfile': 2,
                         'datasetUsageStatistics': 1,
                         'container': 1},
             'dataJob': {'status': 2, 'ownership': 2, 'dataJobInfo': 2, 'dataJobInputOutput': 2},
             'dataFlow': {'status': 1, 'ownership': 1, 'dataFlowInfo': 1},
             'chart': {'status': 2, 'chartInfo': 2, 'globalTags': 1},
             'dashboard': {'status': 1, 'ownership': 1, 'dashboardInfo': 1},
             'mlModel': {'ownership': 1,
                         'mlModelProperties': 1,
                         'mlModelTrainingData': 1,
                         'mlModelEvaluationData': 1,
                         'institutionalMemory': 1,
                         'intendedUse': 1,
                         'mlModelMetrics': 1,
                         'mlModelEthicalConsiderations': 1,
                         'mlModelCaveatsAndRecommendations': 1,
                         'status': 1,
                         'cost': 1},
             'tag': {'status': 2, 'tagProperties': 2, 'ownership': 2},
             'dataPlatform': {'dataPlatformInfo': 27},
             'mlPrimaryKey': {'status': 7, 'mlPrimaryKeyProperties': 7},
             'mlFeature': {'status': 20, 'mlFeatureProperties': 20},
             'mlFeatureTable': {'status': 5, 'browsePaths': 5, 'mlFeatureTableProperties': 5},
             'glossaryTerm': {'status': 3, 'glossaryTermInfo': 3, 'ownership': 3},
             'glossaryNode': {'glossaryNodeInfo': 1, 'ownership': 1, 'status': 1},
             'container': {'containerProperties': 2, 'subTypes': 2, 'dataPlatformInstance': 2, 'container': 1},
             'assertion': {'assertionInfo': 1, 'dataPlatformInstance': 1, 'assertionRunEvent': 1},
             'query': {'queryProperties': 1, 'querySubjects': 1}},
 'warnings': {},
 'failures': {},
 'total_num_files': 1,
 'num_files_completed': 1,
     'files_completed': ['/tmp/tmpqpib79m0.json'],
 'percentage_completion': '0%',
 'estimated_time_to_completion_in_minutes': -1,
 'total_bytes_read_completed_files': 118861,
 'current_file_size': 118861,
 'total_parse_time_in_seconds': 0.0,
 'total_count_time_in_seconds': 0.0,
 'total_deserialize_time_in_seconds': 0.02,
 'aspect_counts': {'datasetProfile': 2,
                   'datasetUsageStatistics': 1,
                   'containerProperties': 2,
                   'subTypes': 2,
                   'dataPlatformInstance': 3,
                   'container': 2,
                   'assertionInfo': 1,
                   'assertionRunEvent': 1,
                   'queryProperties': 1,
                   'querySubjects': 1},
 'entity_type_counts': {'dataset': 4, 'container': 7, 'assertion': 3, 'query': 2},
 'start_time': '2023-03-07 20:30:16.032389 (6.23 seconds ago)',
 'running_time': '6.23 seconds'}
Sink (datahub-rest) report:
{'total_records_written': 99,
 'records_written_per_second': 15,
 'warnings': [],
 'failures': [],
 'start_time': '2023-03-07 20:30:16.021072 (6.24 seconds ago)',
 'current_time': '2023-03-07 20:30:22.263320 (now)',
 'total_duration_in_seconds': 6.24,
 'gms_version': 'v0.10.0',
 'pending_requests': 0}

 Pipeline finished successfully; produced 99 events in 6.23 seconds.

6.3 build编译

整个工程是gradle ,编译需要指定一下仓库到阿里库上

# 修改:repositories.gradle 添加下面两行

maven { url "file:///F:/idea/gradle"}
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public"}

# 中途失败需要链接外网VPN 下载部分包

7. 局限性

7.1 各个数据源的局限性

  • Airflow仅仅支持version >= 2.0.2,datahub必须配置airflow hook ,支持datahub rest hook 与kafka-based hook

  • Spark pipeline(DataJob)或者tasks(DataFlow),支持版本(2.2.0 - 2.4.8),3.1.2 and 3.2.0 测过但不能保证与其他数据源的融合情况 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGajEJxH-1680588545388)(C:\Users\Gridsum\AppData\Roaming\Typora\typora-user-images\1678691435916.png)]

  • Clickhouse,列类型有限制,不支持带时区的聚合函数和日期时间

  • Deltalake,提取标签必须开启S3的object/bucket tag

  • Pulsar, version > 2.7

  • 等等

8、补充

8.1 DataHub Domains, Tags, 和 Glossary Terms的区别?

  • Tags(标签): 非正式的、松散控制的标签,作为搜索和发现的工具。资产可能有多个标记。没有正式的集中管理。
  • Glossary Terms(术语): 一个带有可选层次结构的受控词表。术语通常用于为治理标准化叶级属性(即模型字段)的类型。例如(EMAIL _ PLAINTEXT)
  • Domains(域): 一组顶级类别。通常与资产最相关的业务单元/学科保持一致。集中或分布式管理。每个数据资产的单域分配。

8.2 添加标签跟术语

在这里插入图片描述

select * from metadata_aspect_v2 mav where urn like "urn:li:glossaryTerm%"

mutation addTerm($input: TermAssociationInput!){
  addTerm(input: $input)
}

{
  "input":{
    "termUrn": "urn:li:glossaryTerm:Sensitive",
    "resourceUrn": "urn:li:dataset:(urn:li:dataPlatform:mysql,datahub.jzhou_index,PROD)",
    "subResource": "id",
    "subResourceType": "DATASET_FIELD"
  }
}

8.3 常见元数据管理系统比对

Atlas

作为数据治理计划的一部分,Atlas于2015年7月开始在Hortonworks进行孵化。
Atlas的主要目标是数据治理,支持与HBase,Hive和Kafka的集成。
https://github.com/apache/atlas
基本上一年已更新,维护较少,更新较慢
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Atlas 对字段血缘的支持比较高:
在这里插入图片描述在这里插入图片描述

DataHub

LinkedIn开源出来的,原来叫做WhereHows 。经过一段时间的发展datahub于2020年2月在Github开源
https://github.com/datahub-project/datahub

近期几乎一个月2个版本,更新太快,比较新,版本还是0.x.x,国内使用较少
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Amundsen

Lyft 于2019年4月开发了Amundsen,并与10月开源。
https://github.com/amundsen-io/amundsen

发版,按模块来发版,近期都有一个版本,版本相对固定,底层也可将Atlas当做是Amundsen的一个存储嵌入,这块还是可以再调研调研。

search-4.1.1:3 days ago
metadata-3.12.1:last week
common-0.31.0:2023.1.10
databuilder-7.4.3:2022.12.16
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考:

  • 官网 DataHub Quickstart Guide](https://datahubproject.io/docs/quickstart)
  • DataHub安装配置详细过程
  • 一站式元数据治理平台——Datahub入门宝典

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt C++与Python混合编程:补充错误

在提示中&#xff0c;需要引用Python.h&#xff0c;出现错误。 1、找不到Python.h 如果是pro工程&#xff0c;需要在里面配置&#xff1b; INCLUDEPATH /Users/xinnianwang/opt/anaconda3/include LIBS /Users/xinnianwang/opt/anaconda3/lib 如果是CMakeLists.txt需要配…

【清明节】开发平台公司流辰信息缅怀先祖,传承精神,撸起袖子创佳绩!

四月暖春&#xff0c;草长莺飞&#xff0c;杨柳依依&#xff0c;大自然呈现出一片生机勃勃的朝气景象。中国传统民俗节日——清明节踏春而来&#xff0c;在回乡祭祖&#xff0c;缅怀先人的季节里&#xff0c;哀思、怀念、伤感已经成为整个清明节的主基调。在这万物复苏、春和景…

Spring循环依赖冤冤相报何时了

Spring循环依赖 &#x1f68e;什么是循环依赖&#xff1f;那么循环依赖是个问题吗&#xff1f;单例setter, spring是如何解决的为什么需要三级缓存单单只有两级缓存行不行还得是你三级缓存三级缓存解决依赖循环全解梦想不会逃跑&#xff0c;会逃跑的永远都是自己 什么是循环依赖…

MySQL逻辑架构

讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 逻辑架构剖析 1.1 服务器处理客户端请求 首先MySQL是典型的C/S架构&#xff0c;即Client/Server 架构&#xff0c;服务器端程序使用的mysqld…

【2023】Kubernetes之Pod与容器状态关系

目录简单创建一个podPod运行阶段&#xff1a;容器运行阶段简单创建一个pod apiVersion: v1 kind: pod metadata: name: nginx-pod spec:containers:- name: nginximages: nginx:1.20以上代码表示创建一个名为nginx-pod的pod资源对象。 Pod运行阶段&#xff1a; Pod创建后&am…

vba:end属性

1.从录制一个宏开始。操作&#xff1a;(ctrl向上键、ctrl向下键、ctrl向左键、ctrl向右键) 2.看代码 Range.End 属性 返回一个 Range 对象&#xff0c;该对象代表包含源区域的区域尾端的单元格。 等同于按键 (End向上键、End向下键、End向左键、End向右键) 语法 表达式.End (…

Java基础(十四):包装类

Java基础系列文章 Java基础(一)&#xff1a;语言概述 Java基础(二)&#xff1a;原码、反码、补码及进制之间的运算 Java基础(三)&#xff1a;数据类型与进制 Java基础(四)&#xff1a;逻辑运算符和位运算符 Java基础(六)&#xff1a;数组 Java基础(七)&#xff1a;面向对…

打包构建优化

最近沉迷逛某蓝色软件&#xff0c;收益良多&#xff01;万分感谢博主 海阔_天空&#xff0c;写的太棒了&#x1f44d;&#x1f389; 下面是原文链接&#xff0c;我在原文的基础上浅做个笔记&#xff0c;方便个人快速复习 PS&#xff1a;本篇文章在评论区里存在很多吐槽技术太…

常见密码的编码

1.base64编码 字符包括字母A-Z、a-z、数字0-9&#xff0c;这样共有62个字符 当看到号的加密方式时&#xff0c;可以考虑base64。例&#xff1a;cTZ1NQ解码之后为q5u5。 bash32 只有大写字母&#xff08;A-Z&#xff09;和数字234567 bash64 只有数字0-9以及大写字母ABCDE…

Java 网络编程之NIO(Channel)

同步 VS 异步 同步 同步编程是指当程序执行某个操作时&#xff0c;它必须等待该操作完成才能继续执行下一个操作。这意味着程序在执行网络请求时必须等待网络请求完成才能继续执行下一步操作&#xff0c;因此同步编程通常会导致程序的性能降低。在网络编程中&#xff0c;同步编…

【分享】免梯子的GPT,玩 ChatGPT 的正确姿势

火了一周的 ChatGPT&#xff0c;HG 不允许还有小伙伴不知道这个东西是什么&#xff1f;简单来说就是&#xff0c;你可以让它扮演任何事物&#xff0c;据说已经有人用它开始了颜色文学创作。因为它太火了&#xff0c;所以&#xff0c;本周特推在几十个带有“chatgpt”的项目中选…

基于YOLOv5的水下海洋目标检测

摘要&#xff1a;水下海洋目标检测技术具有广泛的应用前景&#xff0c;可以用于海洋环境监测、海洋资源开发、海洋生物学研究等领域。本文提出了一种基于 YOLOv5 的水下海洋目标检测方法&#xff0c;使用数据增强方法进行了大量实验&#xff0c;并与其他方法进行了对比&#xf…

postgres 日志级别要设置成 wal_level = logical 的影响? 物理复制和逻辑复制

物理复制和逻辑复制 物理复制和逻辑复制 概念 WAL 区别 逻辑复制 将 PostgreSQL 的日志级别设置为 wal_level logical 会启用逻辑复制&#xff08;logical replication&#xff09;功能&#xff0c;这对于一些应用场景非常有用。 逻辑复制是一种高级的复制技术&#x…

Leetcode.1017 负二进制转换

题目链接 Leetcode.1017 负二进制转换 Rating &#xff1a; 1698 题目描述 给你一个整数 n&#xff0c;以二进制字符串的形式返回该整数的 负二进制&#xff08;base -2&#xff09;表示。 注意&#xff0c;除非字符串就是 "0"&#xff0c;否则返回的字符串中不能含…

ClickHouse小记

1、ClickHouse简介 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用 C 语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用 SQL 查询实时生成分析数据报 告。 官网&a…

该死,面试里怎么有那么多套路,我离字节只有一步之遥

自我介绍 不要想着简历上都有为什么还要自我介绍&#xff0c;这里主要考查的是求职者的表达能力和基本素质。重点体现自己的经历优势以及主动积极的态度。 从业时间&#xff0c;教育背景&#xff0c;工作经验&#xff0c;擅长技能&#xff0c;你的性格。 个人技能&#xff1a…

用BEM和现代CSS选择器控制级联

本文为 360 奇舞团前端工程师翻译原文标题&#xff1a;Taming the Cascade With BEM and Modern CSS Selectors原文作者&#xff1a;Liam Johnston原文地址&#xff1a;https://css-tricks.com/taming-the-cascade-with-bem-and-modern-css-selectors/BEM。就像前端开发领域的所…

免费且好用的ssh工具FinalShell的下载与安装

一、FinalShell介绍 1.1 特色功能 云端同步,免费海外服务器远程桌面加速,ssh加速,本地化命令输入框,支持自动补全,命令历史,自定义命令参数。 1.2 主要特性 1.多平台支持Windows,macOS,Linux&#xff1b; 2.多标签,批量服务器管理&#xff1b; 3.支持登录ssh和Windows远程桌…

页面预加载优化实践

概述在客户端开发中&#xff0c;列表类型页面大多都依赖网络请求&#xff0c;需要等网络数据请求下来后再刷新页面。但遇到网络请求慢的场景&#xff0c;就会导致页面加载很慢甚至加载失败。我负责会员的商品列表页面&#xff0c;在业务场景中&#xff0c;页面元素比较复杂&…

【从零开始学习 UVM】10.2、UVM TLM —— UVM TLM Blocking Put Port

文章目录 UVM TLM Port Example1. 创建一个发送器类,其端口类型为 uvm_blocking_put_port2. 创建一个接收器类,实现 put 方法。3. 在更高层次上连接端口及其实现Put Port 阻塞行为任何组件都可以通过 TLM put port向另一个组件发送事务。接收组件应该定义 put port的实现。这…