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 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儲存元資料等)
遺憾的是:仍然沒有成功;沒有定位到資源
稍後,該問題經過檢視原始碼並與同事溝通同步之後,可以訪問swagger的網址:http://localhost:8080/swagger-ui/index.html