1. 程式人生 > 其它 >metacat-生態與架構

metacat-生態與架構

技術標籤:元資料metacat資料倉庫

[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 [email protected]: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容器叢集:

[email protected]:~/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叢集構建成功~!

啟動後,對應的啟動容器有

[email protected]:~/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 [email protected]: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