当前位置: 首页 > 工具软件 > Metacat > 使用案例 >

metacat-生态与架构

武晨
2023-12-01

[20201127]-metacat

1.metacat组件之提问

接触一个新的组件的时候,我们需要首先提取一般共性需要解决发问的问题,例如metacat的问题如下:

metacat是什么?

matacat能干什么?

metacat的组织架构是怎样的;

metacat的请求响应的流程是什么?

matacat为什么要用它?对比;预期带来的收益是什么?

metacat适用的场景和一般使用方式是什么?

metacat的搭建方式:有哪些?主流的是什么?怎样搭建、使用?

metacat的运行状态监控(自带的web UI)?

metacat的访问api有哪些,具体完成一个demo,并总结输出;

metacat如何和现有系统整合在一起(终极大boss);

metacat后期运维(稳定性、高可用性、压力测试)

2.meta知识点详情

  • 为什么要metaCat?

计算框架:pig/hive、spark、prosto

数据源:摄入数据,例如S3、Druid、关系数据库RDB、

元数据管理:数据的组织方式(数据表模式、分区、实际存储位置映射等),例如metaStore和metaCat

  • metacat的特点:

统一的metacat视图,(sql视图与表的组织方式)

统一的metadata api,可以兼容不容的数据源和框架,给用户统一的访问接口api

数据发现服务:HA???

  • metacat是什么?

metacat 作为一个数据联邦的定位,提供了统一的REST/thrift风格的接口来访问各种各样的元数据存储;

你可以访问hive、RDB、Teradata、Redshift, S3 and Cassandra等存储;

metacat提供给你三个维度的功能点:你已经有的数据是什么;这些数据位于哪里、以及你怎样才能处理他们;

  • metacat的架构图

用户层:restful接口或者thrift接口;

api Controller层,用来适配不同的访问接口协议,对准用户层的接口;

service Layer:服务层,直接可以访问自己的metacat RDB;

connector manager层:提供各种connector,提供对各种数据源的访问

  • Features

•Data abstraction and interoperability
•Business and user-defined metadata storage
•Data discovery
•Data change auditing and notifications
•Hive metastore optimizations

解读:

  • 数据抽象与互操作性

通过引入一个通用的抽象层,可以由不同的引擎互换访问数据集。

  • 业务元数据和用户元数据

Metacat在其存储中存储有关数据集的其他业务和用户定义的元数据:

用户定义的元数据:是一种自由格式的元数据,可由用户设置以供其自己使用

业务元数据:也可以大致分为逻辑和物理元数据;两个表可以具有相同的物理元数据但具有不同的逻辑元数据

  • 数据发现

Metacat将模式元数据和业务/用户定义的元数据发布到Elasticsearch,以帮助全文搜索数据仓库中的信息;

  • 数据变更通知和审核

此机制将事件发布到我们自己的数据管道(Keystone)中进行分析,以更好地了解我们的数据使用情况和趋势。 例如,当一个表被删除时,我们的S3仓库管理员服务可以订阅此事件并适当地清理S3上的数据。

  • Hive Metastore优化

由RDS支持的Hive元存储在高负载下无法正常运行。 我们注意到使用metatore API编写和读取分区方面存在许多问题。 鉴于此,我们不再使用这些API。 我们对Hive连接器进行了改进,该连接器直接与支持RDS进行通信以读取和写入分区。 以前,Hive Metastore调用添加通常会超时的数千个分区,但是在我们的实现中,这不再是问题。

  • metacat与metastore的对比优势:

Hive Metastore优化!15使⽤用hive connector直接操作RDS,读写分区数据使⽤用metastore API进⾏行行分区读、写操作时,会有很多问题,尤其在⾼高负载情况下,性能表现⽐比较差;

使⽤用hive connector直接操作RDS,读写分区数据

  • metacat 安装与启动

Netflix 的大数据发现服务框架 Metacat 的教程]

metcat的源码位置:https://github.com/Netflix/metacat

metacat简介https://www.xttblog.com/?p=2859

Netflix开源大数据发现服务框架Metacat 使用用例

浅谈元数据管理之Atlas和Metacat

换个角度认识大数据(下)——元数据管理应用]

数据治理方案技术调研 Atlas VS Datahub VS Amundsen]

数据中台学习笔记-元数据管理,指标管理,数据模型]


3.metacat搭建

3.1docker-compose搭建metacat服务

git clone git@github.com:Netflix/metacat.git

安装docker compose和docker服务

参考https://www.runoob.com/docker/docker-compose.html

进入metacat的跟目录下:

#前提是要安装Docker compose的服务;
#执行如下命令,会启动一个metacat环境;即使用docker compose启动一个容器集群,包含meta容器;metastore容器,一个Cassandra容器和一个postgresql容器;
./gradlew metacatPorts

启动完了之后,

对应metacat服务的REST API接口的web 客户端地址:http://localhost:<MAPPED_PORT>/mds/v1/catalog

对应的Swagger API的访问web ui是:http://localhost:<MAPPED_PORT>/swagger-ui.html

#停止容器集群
./gradlew stopMetacatCluster

如果执行过程中报错:

> :m+ [ 0 -ne 0 ]onal-tests:startMetacatCluster

> Task :metacat-functional-tests:metacatPorts FAILED
/home/mi/fangct/git-workspace/olap/metacat/scripts/print_docker_port.sh: 12: /home/mi/fangct/git-workspace/olap/metacat/scripts/print_docker_port.sh: jq: not found

FAILURE: Build failed with an exception.

* Where:
Build file '/home/mi/fangct/git-workspace/olap/metacat/metacat-functional-tests/build.gradle' line: 114

* What went wrong:
Execution failed for task ':metacat-functional-tests:metacatPorts'.
> Process 'command 'sh'' finished with non-zero exit value 10

错误提示:print_docker_port.sh: jq: not found中jq找不到问题,提示linux系统缺少jq的执行环境;

由于缺少jsonQuery,简称jq的json解析其,需要安装该jq的执行环境;执行如下:

sudo wget http://stedolan.github.io/jq/download/linux64/jq -O /usr/local/bin/jq
sudo chmod +x /usr/local/bin/jq

然后重新执行启动metacat容器集群:

mi@ubuntu:~/fangct/git-workspace/olap/metacat$ ./gradlew metacatPorts
Starting a Gradle Daemon, 1 incompatible and 2 stopped Daemons could not be reused, use --status for details

> Configure project :
Inferred project: metacat, version: 1.3.0-SNAPSHOT

> Task :metacat-functional-tests:startMetacatCluster
+ echo PATH is ~/phabricator/arcanist/bin:/home/mi/hadoop/hadoop-2.7.2/bin:/home/mi/hadoop/hadoop-2.7.2/sbin:/home/mi/hadoop/jdk1.8.0_271/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/mi/fangct/installed-package/apache-maven-3.3.9/bin
PATH is ~/phabricator/arcanist/bin:/home/mi/hadoop/hadoop-2.7.2/bin:/home/mi/hadoop/hadoop-2.7.2/sbin:/home/mi/hadoop/jdk1.8.0_271/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/mi/fangct/installed-package/apache-maven-3.3.9/bin
+ env
DOCKER env is
+ grep DOCKER
+ echo DOCKER env is
+ COMPOSE_FILE=/home/mi/fangct/git-workspace/olap/metacat/metacat-functional-tests/metacat-test-cluster/docker-compose.yml
+ docker-compose --file /home/mi/fangct/git-workspace/olap/metacat/metacat-functional-tests/metacat-test-cluster/docker-compose.yml up storage-barrier
Creating network "metacat-test-cluster_default" with the default driver
Creating metacat-test-cluster_postgresql_1        ... done
Creating metacat-test-cluster_hive-metastore-db_1 ... done
Creating metacat-test-cluster_storage-barrier_1   ... done
reating metacat-test-cluster_storage-barrier_1   ...                             Attaching to metacat-test-cluster_storage-barrier_1
storage-barrier_1    | Waiting for postgresql:5432  ....  up!
storage-barrier_1    | Waiting for hive-metastore-db:3306  .......  up!
storage-barrier_1    | Everything is uptCluster
metacat-test-cluster_storage-barrier_1 exited with code 0
> :m+ [ 0 -ne 0 ]onal-tests:startMetacatCluster
+ docker-compose --file /home/mi/fangct/git-workspace/olap/metacat/metacat-functional-tests/metacat-test-cluster/docker-compose.yml up service-barrier
metacat-test-cluster_hive-metastore-db_1 is up-to-date
Creating metacat-test-cluster_hive-metastore_1 ... done
Creating metacat-test-cluster_service-barrier_1 ... done
<============-> 98% EXECUTING [35s]                                            Attaching to metacat-test-cluster_service-barrier_1
service-barrier_1    | Waiting for hive-metastore:9083  ..  up!
service-barrier_1    | Everything is uptCluster
metacat-test-cluster_service-barrier_1 exited with code 0
> :m+ [ 0 -ne 0 ]onal-tests:startMetacatCluster
+ docker-compose --file /home/mi/fangct/git-workspace/olap/metacat/metacat-functional-tests/metacat-test-cluster/docker-compose.yml up metacat-barrier
metacat-test-cluster_postgresql_1 is up-to-date
metacat-test-cluster_hive-metastore-db_1 is up-to-date
metacat-test-cluster_hive-metastore_1 is up-to-date
Creating metacat-test-cluster_metacat_1 ... done
Creating metacat-test-cluster_metacat-barrier_1 ... done
<============-> 98% EXECUTING [38s]                                            Attaching to metacat-test-cluster_metacat-barrier_1
metacat-barrier_1    | Waiting for metacat:8080  ..  up!
metacat-barrier_1    | Waiting for metacat:12001  .....................  up!
metacat-barrier_1    | Waiting for metacat:12003  .  up!
metacat-barrier_1    | Waiting for metacat:12004  .  up!
metacat-barrier_1    | Everything is uptCluster
metacat-test-cluster_metacat-barrier_1 exited with code 0
> :m+ [ 0 -ne 0 ]onal-tests:startMetacatCluster

> Task :metacat-functional-tests:metacatPorts
++ Container Exposed ports ++
+++ Metacat Web Port:32791
+++ Metacat Web Debug Port:32792
+++ Metacat Hive Thrift Port:32790
+++ Metacat Embedded Hive Thrift Port:32789
+++ Metacat Embedded Fast Hive Thrift Port:32788
+++ Metacat Hive Metastore Port:32786
+++ Metacat Hive Metastore Debug Port:32787

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 0s
93 actionable tasks: 2 executed, 91 up-to-date

如上说是,metacat集群构建成功~!

启动后,对应的启动容器有

mi@ubuntu:~/fangct/git-workspace/olap/metacat$ docker ps | grep metacat | awk {'print $2'}
tomcat:8.0-jre8
danielbwatson/metacat-test-hive-metastore:1.0.0
mysql:5.7
postgres:9.6

其中,一共启动了四个组件;其中,mysql和pg分别是用来存储元数据的位置;部署需要的tomcat服务;

通过访问http://localhost:8080/mds/v1/catalog,是metacat提供的元数据REST api访问提示网页,结果缺失无法访问{"timestamp":1606736084305,"status":404,"error":"Unable to locate for getcatalognames. Details: Unable to locate any catalogs","message":"Unable to locate for getcatalognames. Details: Unable to locate any catalogs","path":"/mds/v1/catalog"}

http://localhost:8080/swagger-ui.html,该网页是沟通前后端api公共接口的服务,但是web仍然提示无法访问该部分资源;

{"timestamp":1606735107778,"status":404,"error":"No message available","message":"No message available","path":"/swagger-ui.html"}

3.2物理裸机部署matacat服务

  • 下载编译打包

后期通过下载hive源码并在IDEA中打开,修改配置并编译打包:

git clone git@github.com:Netflix/metacat.git
cd metacat
./gradlew clean build

然后将对应的包metacat/metacat-war/build/libs/metacat-1.3.0-SNAPSHOT.war拷贝到对应的tomcat容器中,因为metacat是以war来打包的,需要依赖web容器运行;

下载tomcat并部署:

https://tomcat.apache.org/download-80.cgi下载tar.gz的linux版本apache-tomcat-8.5.60.tar.gz,解压后,将上一步中的war包拷贝到apache-tomcat-8.5.60/webapps目录下,即位根目录;

然后启动tomcat

#启动tomcat服务
./startup.sh
#停止tomcat服务
#./shutdown.sh

等待完全启动之后,可以直接访问localhost:8080的web ui地址,说明tomcat服务可用;

直接访问http://localhost:8080/swagger-ui.html,发现仍然不可用;???奇怪了

3.3 通过idea编译启动metacat

https://blog.csdn.net/liudong162722/article/details/81204474

注意:(需要修改对应的配置信息,指明用户的元数据的位置等信息,例如试用mysql存储元数据等)

  • metacat.plugin.config.location: 该路径包含了catalog目录的位置所在;可以查看对应的示例;samples
  • metacat.usermetadata.config.location: 该路径指向的配置文件,是包含了用来存储用户元数据的连接属性信息。详情查看示例 sample.

遗憾的是:仍然没有成功;没有定位到资源

稍后,该问题经过查看源码并与同事沟通同步之后,可以访问swagger的网址:http://localhost:8080/swagger-ui/index.html

 类似资料: