接触一个新的组件的时候,我们需要首先提取一般共性需要解决发问的问题,例如metacat的问题如下:
metacat是什么?
matacat能干什么?
metacat的组织架构是怎样的;
metacat的请求响应的流程是什么?
matacat为什么要用它?对比;预期带来的收益是什么?
metacat适用的场景和一般使用方式是什么?
metacat的搭建方式:有哪些?主流的是什么?怎样搭建、使用?
metacat的运行状态监控(自带的web UI)?
metacat的访问api有哪些,具体完成一个demo,并总结输出;
metacat如何和现有系统整合在一起(终极大boss);
metacat后期运维(稳定性、高可用性、压力测试)
计算框架:pig/hive、spark、prosto
数据源:摄入数据,例如S3、Druid、关系数据库RDB、
元数据管理:数据的组织方式(数据表模式、分区、实际存储位置映射等),例如metaStore和metaCat
统一的metacat视图,(sql视图与表的组织方式)
统一的metadata api,可以兼容不容的数据源和框架,给用户统一的访问接口api
数据发现服务:HA???
metacat 作为一个数据联邦的定位,提供了统一的REST/thrift风格的接口来访问各种各样的元数据存储;
你可以访问hive、RDB、Teradata、Redshift, S3 and Cassandra等存储;
metacat提供给你三个维度的功能点:你已经有的数据是什么;这些数据位于哪里、以及你怎样才能处理他们;
用户层:restful接口或者thrift接口;
api Controller层,用来适配不同的访问接口协议,对准用户层的接口;
service Layer:服务层,直接可以访问自己的metacat RDB;
connector manager层:提供各种connector,提供对各种数据源的访问
•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调用添加通常会超时的数千个分区,但是在我们的实现中,这不再是问题。
Hive Metastore优化!15使⽤用hive connector直接操作RDS,读写分区数据使⽤用metastore API进⾏行行分区读、写操作时,会有很多问题,尤其在⾼高负载情况下,性能表现⽐比较差;
使⽤用hive connector直接操作RDS,读写分区数据
Netflix 的大数据发现服务框架 Metacat 的教程]
metcat的源码位置:https://github.com/Netflix/metacat
metacat简介https://www.xttblog.com/?p=2859
Netflix开源大数据发现服务框架Metacat 使用用例
换个角度认识大数据(下)——元数据管理应用]
数据治理方案技术调研 Atlas VS Datahub VS Amundsen]
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"}
后期通过下载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
,发现仍然不可用;???奇怪了
https://blog.csdn.net/liudong162722/article/details/81204474
注意:(需要修改对应的配置信息,指明用户的元数据的位置等信息,例如试用mysql存储元数据等)
遗憾的是:仍然没有成功;没有定位到资源
稍后,该问题经过查看源码并与同事沟通同步之后,可以访问swagger的网址:http://localhost:8080/swagger-ui/index.html