一站式後設資料治理平臺——Datahub入門寶典

獨孤風發表於2021-12-28

隨著數字化轉型的工作推進,資料治理的工作已經被越來越多的公司提上了日程。作為新一代的後設資料管理平臺,Datahub在近一年的時間裡發展迅猛,大有取代老牌後設資料管理工具Atlas之勢。國內Datahub的資料非常少,大部分公司想使用Datahub作為自己的後設資料管理平臺,但可參考的資料太少。

所以整理了這份文件供大家學習使用。 本文件基於Datahub最新的0.8.20版本,整理自部分官網內容,各種部落格及實踐過程。文章較長,建議收藏。新版本的文件請關注公眾號 大資料流動,會持續的更新~

通過本文件,可以快速的入門Datahub,成功的搭建Datahub並且獲取到資料庫的後設資料資訊。是從0到1的入門文件,更多Datahub的高階功能,可以關注後續的文章更新。

文件共分為6個部分,層級結構如下圖所示。

文件版權為公眾號 大資料流動 所有,請勿商用。相關技術問題以及安裝包可以聯絡筆者獨孤風加入相關技術交流群討論獲取。

一、資料治理與後設資料管理

背景

為什麼要做資料治理? 業務繁多,資料繁多,業務資料不斷迭代。人員流動,文件不全,邏輯不清楚,對於資料很難直觀理解,後期很難維護。

在大資料研發中,原始資料就有著非常多的資料庫,資料表。

而經過資料的聚合以後,又會有很多的維度表。

近幾年來資料的量級在瘋狂的增長,由此帶來了系列的問題。作為對人工智慧團隊的資料支撐,我們聽到的最多的質疑是 “正確的資料集”,他們需要正確的資料用於他們的分析。我們開始意識到,雖然我們構建了高度可擴充套件的資料儲存,實時計算等等能力,但是我們的團隊仍然在浪費時間尋找合適的資料集來進行分析。

也就是我們缺乏對資料資產的管理。事實上,有很多公司都提供了開源的解決方案來解決上述問題,這也就是資料發現與後設資料管理工具。

後設資料管理

簡單地說,後設資料管理是為了對資料資產進行有效的組織。它使用後設資料來幫助管理他們的資料。它還可以幫助資料專業人員收集、組織、訪問和豐富後設資料,以支援資料治理。

三十年前,資料資產可能是 Oracle 資料庫中的一張表。然而,在現代企業中,我們擁有一系列令人眼花繚亂的不同型別的資料資產。可能是關聯式資料庫或 NoSQL 儲存中的表、實時流資料、 AI 系統中的功能、指標平臺中的指標,資料視覺化工具中的儀表板。

現代後設資料管理應包含所有這些型別的資料資產,並使資料工作者能夠更高效地使用這些資產完成工作。

所以,後設資料管理應具備的功能如下:

  • 搜尋和發現:資料表、欄位、標籤、使用資訊
  • 訪問控制:訪問控制組、使用者、策略
  • 資料血緣:管道執行、查詢
  • 合規性:資料隱私/合規性註釋型別的分類
  • 資料管理:資料來源配置、攝取配置、保留配置、資料清除策略
  • AI 可解釋性、再現性:特徵定義、模型定義、訓練執行執行、問題陳述
  • 資料操作:管道執行、處理的資料分割槽、資料統計
  • 資料質量:資料質量規則定義、規則執行結果、資料統計

架構與開源方案

下面介紹後設資料管理的架構實現,不同的架構都對應了不同的開源實現。

下圖描述了第一代後設資料架構。它通常是一個經典的單體前端(可能是一個 Flask 應用程式),連線到主要儲存進行查詢(通常是 MySQL/Postgres),一個用於提供搜尋查詢的搜尋索引(通常是 Elasticsearch),並且對於這種架構的第 1.5 代,也許一旦達到關聯式資料庫的“遞迴查詢”限制,就使用了處理譜系(通常是 Neo4j)圖形查詢的圖形索引。

很快,第二代的架構出現了。單體應用程式已拆分為位於後設資料儲存資料庫前面的服務。該服務提供了一個 API,允許使用推送機制將後設資料寫入系統。

第三代架構是基於事件的後設資料管理架構,客戶可以根據他們的需要以不同的方式與後設資料資料庫互動。

後設資料的低延遲查詢、對後設資料屬性進行全文和排名搜尋的能力、對後設資料關係的圖形查詢以及全掃描和分析能力。

Datahub 就是採用的這種架構。

下圖是當今後設資料格局的簡單直觀表示:

(包含部分非開源方案)

其他方案可作為調研的主要方向,但不是本文討論的重點。

二、Datahub簡介

首先,阿里雲也有一款名為DataHub的產品,是一個流式處理平臺,本文所述DataHub與其無關。

資料治理是大佬們最近談的一個火熱的話題。不管國家層面,還是企業層面現在對這個問題是越來越重視。資料治理要解決資料質量,資料管理,資料資產,資料安全等等。而資料治理的關鍵就在於後設資料管理,我們要知道資料的來龍去脈,才能對資料進行全方位的管理,監控,洞察。

DataHub是由LinkedIn的資料團隊開源的一款提供後設資料搜尋與發現的工具。

提到LinkedIn,不得不想到大名鼎鼎的Kafka,Kafka就是LinkedIn開源的。LinkedIn開源的Kafka直接影響了整個實時計算領域的發展,而LinkedIn的資料團隊也一直在探索資料治理的問題,不斷努力擴充套件其基礎架構,以滿足不斷增長的大資料生態系統的需求。隨著資料的數量和豐富性的增長,資料科學家和工程師要發現可用的資料資產,瞭解其出處並根據見解採取適當的行動變得越來越具有挑戰性。為了幫助增長的同時繼續擴大生產力和資料創新,建立了通用的後設資料搜尋和發現工具DataHub。

市面上常見的後設資料管理系統有如下幾個:
a) linkedin datahub:
https://github.com/linkedin/datahub
b) apache atlas:
https://github.com/apache/atlas
c) lyft amundsen
https://github.com/lyft/amundsen

atlas之前我們也介紹過,對hive有非常好的支援,但是部署起來非常的吃力。amundsen還是一個新興的框架,還沒有release版本,未來可能會發展起來還需要慢慢觀察。

綜上,datahub是目前的一顆新星,只是目前datahub的資料還較少,未來我們將持續關注與更新datahub的更多資訊。

目前datahub的github星數已經達到4.3k。

Datahub官網

Datahub官網對於其描述為Data ecosystems are diverse — too diverse. DataHub's extensible metadata platform enables data discovery, data observability and federated governance that helps you tame this complexity.

資料生態是多樣的,而 DataHub提供了可擴充套件的後設資料管理平臺,可以滿足資料發現,資料可觀察與治理。這也極大的解決了資料複雜性的問題。

Datahub提供了豐富的資料來源支援與血緣展示。

在獲取資料來源的時候,只需要編寫簡單的yml檔案就可以完成後設資料的獲取。

在資料來源的支援方面,Datahub支援druid,hive,kafka,mysql,oracle,postgres,redash,metabase,superset等資料來源,並支援通過airflow的資料血緣獲取。可以說實現了從資料來源到BI工具的全鏈路的資料血緣打通。

三、Datahub介面

通過Datahub的頁面我們來簡單瞭解下Datahub所能滿足的功能。

3.1 首頁

首先,在登入到Datahub以後就進入了Datahub首頁,首頁中提供了Datahub的選單欄,搜尋框和後設資料資訊列表。這是為了讓大家可以快速的對後設資料進行管理。

後設資料資訊中按照資料集,儀表板,圖表等型別進行了分類。

再往下看是平臺資訊,在這當中包括了Hive,Kafka,Airflow等平臺資訊的收集。

下面其實是一些搜尋的統計資訊。用於統計最近以及最流行的搜尋結果。

包括一些標籤和術語表資訊。

3.2 分析頁面

分析頁面是對後設資料資訊的統計,也是對使用datahub的使用者資訊的統計。

可以理解為一個展示頁面,這對於總體情況的瞭解還是非常的有必要的。

其他的功能基本是對於使用者和許可權的控制。

四、整體架構

要想學習好Datahub,就必須瞭解Datahub的整體架構。

通過Datahub的架構圖可以清晰的瞭解Datahub的架構組成。

DataHub 的架構有三個主要部分。

前端為 Datahub frontend作為前端的頁面展示。

豐富的前端展示讓Datahub 擁有了支撐大多數功能的能力。其前端基於React框架研發,對於有二次研發打算的公司,要注意此技術棧的匹配性。

後端 Datahub serving來提供後端的儲存服務。

Datahub 的後端開發語言為Python,儲存基於ES或者Neo4J。

而Datahub ingestion則用於抽取後設資料資訊。

Datahub 提供了基於API後設資料主動拉取方式,和基於Kafka的實時後設資料獲取方式。這對於後設資料的獲取非常的靈活。

這三部分也是我們部署過程中主要關注的點,下面我們就從零開始部署Datahub,並獲取一個資料庫的後設資料資訊。

五、快速安裝部署

部署datahub對於系統有一定的要求。本文基於CentOS7進行安裝。

要先安裝好 docker,jq,docker-compose。同時保證系統的python版本為 Python 3.6+。

5.1、安裝docker,docker-compose,jq

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux或Windows作業系統的機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。

可以通過yum的方式快速的安裝docker

yum -y install docker

完成後通過docker -v來檢視版本情況。

# docker -v
Docker version 1.13.1, build 7d71120/1.13.1

通過下面的命令可以啟停docker

systemctl start docker // 啟動docker
systemctl stop docker // 關閉docker

隨後安裝Docker Compose

Docker Compose是 docker 提供的一個命令列工具,用來定義和執行由多個容器組成的應用。使用 compose,我們可以通過 YAML 檔案宣告式的定義應用程式的各個服務,並由單個命令完成應用的建立和啟動。

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

修改執行許可權

sudo chmod +x /usr/local/bin/docker-compose

建立軟連線

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

檢視版本,驗證安裝成功。

docker-compose --version
docker-compose version 1.29.2, build 5becea4c

安裝jq

首先安裝EPEL源,企業版 Linux 附加軟體包(以下簡稱 EPEL)是一個 Fedora 特別興趣小組,用以建立、維護以及管理針對企業版 Linux 的一個高質量附加軟體包集,面向的物件包括但不限於 紅帽企業版 Linux (RHEL)、 CentOS、Scientific Linux (SL)、Oracle Linux (OL) 。

EPEL 的軟體包通常不會與企業版 Linux 官方源中的軟體包發生衝突,或者互相替換檔案。EPEL 專案與 Fedora 基本一致,包含完整的構建系統、升級管理器、映象管理器等等。

安裝EPEL源

yum install epel-release 

安裝完EPEL源後,可以檢視下jq包是否存在:

yum list jq

安裝jq:

yum install jq

5.2、安裝python3

安裝依賴

yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel

下載安裝包

wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -zxvf  Python-3.8.3.tgz

編譯安裝

mkdir /usr/local/python3 
cd Python-3.8.3
./configure --prefix=/usr/local/python3
make && make install

修改系統預設python指向

rm -rf /usr/bin/python
ln -s /usr/local/python3/bin/python3 /usr/bin/python

修改系統預設pip指向

rm -rf /usr/bin/pip
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip

驗證

python -V

修復yum

python3會導致yum不能正常使用

vi /usr/bin/yum 
把 #! /usr/bin/python 修改為 #! /usr/bin/python2 
vi /usr/libexec/urlgrabber-ext-down 
把 #! /usr/bin/python 修改為 #! /usr/bin/python2
vi /usr/bin/yum-config-manager
#!/usr/bin/python 改為 #!/usr/bin/python2
沒有的不用修改

5.3、安裝與啟動datahub

首先升級pip

python3 -m pip install --upgrade pip wheel setuptools

需要看到下面成功的返回。

 Attempting uninstall: setuptools
    Found existing installation: setuptools 57.4.0
    Uninstalling setuptools-57.4.0:
      Successfully uninstalled setuptools-57.4.0
  Attempting uninstall: pip
    Found existing installation: pip 21.2.3
    Uninstalling pip-21.2.3:
      Successfully uninstalled pip-21.2.3

檢查環境

python3 -m pip uninstall datahub acryl-datahub || true  # sanity check - ok if it fails

收到這樣的提示說明沒有問題。

WARNING: Skipping datahub as it is not installed.
WARNING: Skipping acryl-datahub as it is not installed.

安裝datahub,此步驟時間較長,耐心等待。

python3 -m pip install --upgrade acryl-datahub

收到這樣的提示說明安裝成功。

Successfully installed PyYAML-6.0 acryl-datahub-0.8.20.0 avro-1.11.0 avro-gen3-0.7.1 backports.zoneinfo-0.2.1 certifi-2021.10.8 charset-normalizer-2.0.9 click-8.0.3 click-default-group-1.2.2 docker-5.0.3 entrypoints-0.3 expandvars-0.7.0 idna-3.3 mypy-extensions-0.4.3 progressbar2-3.55.0 pydantic-1.8.2 python-dateutil-2.8.2 python-utils-2.6.3 pytz-2021.3 pytz-deprecation-shim-0.1.0.post0 requests-2.26.0 stackprinter-0.2.5 tabulate-0.8.9 toml-0.10.2 typing-extensions-3.10.0.2 typing-inspect-0.7.1 tzdata-2021.5 tzlocal-4.1 urllib3-1.26.7 websocket-client-1.2.3

最後我們看到datahub的版本情況。

[root@node01 bin]# python3 -m datahub version
DataHub CLI version: 0.8.20.0
Python version: 3.8.3 (default, Aug 10 2021, 14:25:56)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

隨後啟動datahub

python3 -m datahub docker quickstart

會經過漫長的下載過程,耐心等待。

開始啟動,注意觀察報錯情況。如果網速不好,需要多執行幾次。

如果可以看到如下顯示,證明安裝成功了。

訪問ip:9002 輸入 datahub datahub 登入

六、後設資料資訊的獲取

登入到Datahub以後,會有一個友好的welcome頁面。來提示如何進行後設資料的抓取。

後設資料攝入使用的是外掛架構,你僅需要安裝所需的外掛。

攝入源有很多

外掛名稱	   安裝命令	                          提供功能
mysql	pip install 'acryl-datahub[mysql]'	   MySQL source

這裡安裝兩個外掛:

源:mysql

匯:datahub-rest

pip install 'acryl-datahub[mysql]'

安裝的包較多,得到如下提示證明安裝成功。

Installing collected packages: zipp, traitlets, pyrsistent, importlib-resources, attrs, wcwidth, tornado, pyzmq, pyparsing, pycparser, ptyprocess, parso, nest-asyncio, jupyter-core, jsonschema, ipython-genutils, webencodings, pygments, prompt-toolkit, pickleshare, pexpect, packaging, nbformat, matplotlib-inline, MarkupSafe, jupyter-client, jedi, decorator, cffi, backcall, testpath, pandocfilters, nbclient, mistune, jupyterlab-pygments, jinja2, ipython, defusedxml, debugpy, bleach, argon2-cffi-bindings, terminado, Send2Trash, prometheus-client, nbconvert, ipykernel, argon2-cffi, numpy, notebook, widgetsnbextension, toolz, ruamel.yaml.clib, pandas, jupyterlab-widgets, jsonpointer, tqdm, termcolor, scipy, ruamel.yaml, jsonpatch, ipywidgets, importlib-metadata, altair, sqlalchemy, pymysql, greenlet, great-expectations
Successfully installed MarkupSafe-2.0.1 Send2Trash-1.8.0 altair-4.1.0 argon2-cffi-21.3.0 argon2-cffi-bindings-21.2.0 attrs-21.3.0 backcall-0.2.0 bleach-4.1.0 cffi-1.15.0 debugpy-1.5.1 decorator-5.1.0 defusedxml-0.7.1 great-expectations-0.13.49 greenlet-1.1.2 importlib-metadata-4.10.0 importlib-resources-5.4.0 ipykernel-6.6.0 ipython-7.30.1 ipython-genutils-0.2.0 ipywidgets-7.6.5 jedi-0.18.1 jinja2-3.0.3 jsonpatch-1.32 jsonpointer-2.2 jsonschema-4.3.2 jupyter-client-7.1.0 jupyter-core-4.9.1 jupyterlab-pygments-0.1.2 jupyterlab-widgets-1.0.2 matplotlib-inline-0.1.3 mistune-0.8.4 nbclient-0.5.9 nbconvert-6.3.0 nbformat-5.1.3 nest-asyncio-1.5.4 notebook-6.4.6 numpy-1.21.5 packaging-21.3 pandas-1.3.5 pandocfilters-1.5.0 parso-0.8.3 pexpect-4.8.0 pickleshare-0.7.5 prometheus-client-0.12.0 prompt-toolkit-3.0.24 ptyprocess-0.7.0 pycparser-2.21 pygments-2.10.0 pymysql-1.0.2 pyparsing-2.4.7 pyrsistent-0.18.0 pyzmq-22.3.0 ruamel.yaml-0.17.19 ruamel.yaml.clib-0.2.6 scipy-1.7.3 sqlalchemy-1.3.24 termcolor-1.1.0 terminado-0.12.1 testpath-0.5.0 toolz-0.11.2 tornado-6.1 tqdm-4.62.3 traitlets-5.1.1 wcwidth-0.2.5 webencodings-0.5.1 widgetsnbextension-3.5.2 zipp-3.6.0

隨後檢查安裝的外掛情況,Datahub是外掛式的安裝方式。可以檢查資料來源獲取外掛Source,轉換外掛transformer,獲取外掛Sink。

 python3 -m datahub check plugins

可見Mysql外掛和Rest介面外掛已經安裝,下面配置從 MySQL 獲取後設資料使用 Rest 介面將資料儲存 DataHub。

vim mysql_to_datahub_rest.yml
# A sample recipe that pulls metadata from MySQL and puts it into DataHub
# using the Rest API.
source:
  type: mysql
  config:
    username: root
    password: 123456
    database: cnarea20200630

transformers:
  - type: "fully-qualified-class-name-of-transformer"
    config:
      some_property: "some.value"

sink:
  type: "datahub-rest"
  config:
    server: "http://ip:8080"

# datahub ingest -c mysql_to_datahub_rest.yml

隨後是漫長的資料獲取過程。

得到如下提示後,證明獲取成功。

{datahub.cli.ingest_cli:83} - Finished metadata ingestion

Sink (datahub-rest) report:
{'records_written': 356,
 'warnings': [],
 'failures': [],
 'downstream_start_time': datetime.datetime(2021, 12, 28, 21, 8, 37, 402989),
 'downstream_end_time': datetime.datetime(2021, 12, 28, 21, 13, 10, 757687),
 'downstream_total_latency_in_seconds': 273.354698}
Pipeline finished with warnings

在此重新整理datahub頁面,mysql的後設資料資訊已經成功獲取。

進入表中檢視後設資料的情況,表欄位資訊。

在之前展示後設資料分析頁也已經有了詳細的展示。

至此我們完成了Datahub從0到1的搭建,在整個過程中除了簡單的安裝配置以外,基本沒有進行任何程式碼研發工作。但是datahub還有更多的功能,比如對資料血緣的獲取,在後設資料獲取的過程中進行轉換操作等等。在未來的文章中也會進行更新這些功能的教程。

未完待續~

歡迎加入資料治理學習交流群,共同學習交流~

請直接備註:暱稱-資料治理

例如:獨孤風-資料治理

注意,群裡僅做資料治理相關討論 不允許分享任何小程式,連結,二維碼等廣告,一次直接飛機票!

更多資料治理相關技術與資料,歡迎關注大資料流動

相關文章