開源 DataHub:LinkedIn 元數據搜索和發現平台
對於任何依賴大量數據來制定數據驅動決策的公司來說,快速找到所需的數據至關重要。 這不僅會影響資料使用者(包括分析師、機器學習開發人員、資料科學家和資料工程師)的生產力,還會對依賴高品質機器學習 (ML) 管道的最終產品產生直接影響。 此外,實施或建構機器學習平台的趨勢自然提出了一個問題:內部發現特徵、模型、指標、資料集等的方法是什麼。
在本文中,我們將討論如何在開放許可下發布資料來源
WhereHows 現在是一個資料中心!
LinkedIn 的元資料團隊之前介紹過
開源方法
WhereHows 是 LinkedIn 最初用於查找資料及其來源的門戶,最初是一個內部專案; 元數據團隊打開了它
第一次嘗試:“開源第一”
我們最初遵循「開源優先」的開發模型,其中大多數開發發生在開源儲存庫中,並針對內部部署進行更改。 這種方法的問題在於,程式碼總是先推送到 GitHub,然後再進行內部全面審查。 在對開源儲存庫進行更改並進行新的內部部署之前,我們不會發現任何生產問題。 如果部署不佳,也很難確定罪魁禍首,因為變更是大量進行的。
此外,該模型在開發需要快速迭代的新功能時降低了團隊的生產力,因為它迫使所有變更首先推送到開源儲存庫,然後推送到內部儲存庫。 為了減少處理時間,可以先在內部儲存庫中完成所需的修復或更改,但是當將這些更改合併回開源儲存庫時,這會成為一個巨大的問題,因為這兩個儲存庫不同步。
與全功能自訂 Web 應用程式相比,此模型對於共用平台、程式庫或基礎架構專案更容易實現。 此外,此模型非常適合從第一天開始開源的項目,但WhereHows 是作為完全內部的 Web 應用程式建構的。 要完全抽象化所有內部依賴項確實很困難,因此我們需要保留內部分叉,但保留內部分叉並開發大部分開源程式碼並不太有效。
第二次嘗試:“內在第一”
**作為第二次嘗試,我們轉向「內部優先」開發模式,其中大多數開發都在內部進行,並定期對開源程式碼進行更改。 儘管該模型最適合我們的用例,但它存在固有的問題。 直接將所有差異推送到開源儲存庫,然後稍後嘗試解決合併衝突是一種選擇,但這很耗時。 在大多數情況下,開發人員盡量不要在每次檢查程式碼時都這樣做。 因此,批量執行此操作的頻率會大大降低,從而使以後解決合併衝突變得更加困難。
第三次就成功了!
上述兩次失敗的嘗試導致WhereHows GitHub 儲存庫在很長一段時間內仍然過時。 團隊不斷改進產品的功能和架構,使得WhereHows for LinkedIn的內部版本變得比開源版本更加先進。 它甚至還有一個新名稱——DataHub。 基於先前的失敗嘗試,團隊決定開發一個可擴展的長期解決方案。
對於任何新的開源項目,LinkedIn 的開源團隊都會建議並支援開發模式,其中專案的模組完全以開源方式開發。 版本化工件部署到公共儲存庫,然後使用下列命令重新簽入內部 LinkedIn 工件
然而,成熟的後端應用程式(例如 DataHub)將需要大量時間才能達到此狀態。 這也排除了在所有內部依賴關係完全抽象化之前開源完全工作的實現的可能性。 這就是為什麼我們開發了一些工具來幫助我們更快、更輕鬆地做出開源貢獻。 此解決方案對元資料團隊(DataHub 開發人員)和開源社群都有好處。 以下各節將討論這種新方法。
開源出版自動化
Metadata 團隊對開源 DataHub 的最新方法是開發一個自動同步內部程式碼庫和開源儲存庫的工具。 該工具包的高級功能包括:
以下小節將深入研究上述有趣問題的函數。
原始碼同步
與開源版本的 DataHub 不同,DataHub 是單一 GitHub 儲存庫,LinkedIn 版本的 DataHub 是多個儲存庫的組合(內部稱為
圖 1:儲存庫之間的同步 LinkedIn 數據中心 和一個儲存庫 數據中心 開源
為了支援自動建置、推送和拉取工作流程,我們的新工具會自動建立與每個來源檔案相對應的檔案層級對應。 但是,該工具包需要初始配置,且使用者必須提供高級模組映射,如下所示。
{
"datahub-dao": [
"${datahub-frontend}/datahub-dao"
],
"gms/impl": [
"${dataset-gms}/impl",
"${user-gms}/impl"
],
"metadata-dao": [
"${metadata-models}/metadata-dao"
],
"metadata-builders": [
"${metadata-models}/metadata-builders"
]
}
模組級映射是一個簡單的 JSON,其鍵是開源儲存庫中的目標模組,值是 LinkedIn 儲存庫中的來源模組清單。 開源儲存庫中的任何目標模組都可以由任意數量的來源模組提供。 若要指示來源模組中儲存庫的內部名稱,請使用
{
"${metadata-models}/metadata-builders/src/main/java/com/linkedin/Foo.java":
"metadata-builders/src/main/java/com/linkedin/Foo.java",
"${metadata-models}/metadata-builders/src/main/java/com/linkedin/Bar.java":
"metadata-builders/src/main/java/com/linkedin/Bar.java",
"${metadata-models}/metadata-builders/build.gradle": null,
}
文件級映射由工具自動建立; 但是,它也可以由使用者手動更新。 這是 LinkedIn 原始檔到開源儲存庫中檔案的 1:1 映射。 有幾個與自動建立文件關聯相關的規則:
- 在開源的目標模組有多個來源模組的情況下,可能會出現衝突,例如相同的模組
完全質量控製網絡 ,存在於多個來源模組中。 作為一種衝突解決策略,我們的工具預設為「最後一個獲勝」選項。 - 「null」表示原始檔案不屬於開源儲存庫。
- 每次開源提交或提取後,該映射都會自動更新並建立快照。 這對於識別自上次操作以來源程式碼中的新增和刪除是必要的。
建立提交日誌
開源提交的提交日誌也是透過合併內部儲存庫的提交日誌自動產生的。 下面是一個範例提交日誌,顯示了我們的工具產生的提交日誌的結構。 提交清楚地表明該提交中打包了來源儲存庫的哪些版本,並提供提交日誌的摘要。 看看這個
metadata-models 29.0.0 -> 30.0.0
Added aspect model foo
Fixed issue bar
dataset-gms 2.3.0 -> 2.3.4
Added rest.li API to serve foo aspect
MP_VERSION=dataset-gms:2.3.4
MP_VERSION=metadata-models:30.0.0
依賴性測試
領英有
這是一種有用的機制,有助於防止任何破壞開源建置的內部提交,並在提交時檢測到它。 如果沒有這個,就很難確定哪個內部提交導致開源儲存庫建置失敗,因為我們批量對 DataHub 開源儲存庫進行內部變更。
開源 DataHub 和我們的生產版本之間的差異
到目前為止,我們已經討論了同步兩個版本的 DataHub 儲存庫的解決方案,但我們仍然沒有概述為什麼我們首先需要兩個不同的開發流程的原因。 在本節中,我們將列出 DataHub 的公共版本和 LinkedIn 伺服器上的生產版本之間的差異,並解釋這些差異的原因。
差異的一個根源在於我們的生產版本依賴尚未開源的程式碼,例如 LinkedIn 的 Offspring(LinkedIn 的內部依賴注入框架)。 Offspring 廣泛用於內部程式碼庫,因為它是管理動態配置的首選方法。 但它不是開源的; 因此我們需要找到開源 DataHub 的開源替代品。
還有其他原因。 當我們根據 LinkedIn 的需求建立元資料模型的擴充時,這些擴充功能通常非常特定於 LinkedIn,可能無法直接應用於其他環境。 例如,我們為參與者 ID 和其他類型的匹配元資料提供非常具體的標籤。 因此,我們現在已將這些擴充功能從 DataHub 的開源元資料模型中排除。 當我們與社群互動並了解他們的需求時,我們將在需要時開發這些擴充功能的通用開源版本。
易於使用和更容易適應開源社群也激發了兩個版本的 DataHub 之間的一些差異。 流處理基礎設施的差異就是一個很好的例子。 儘管我們的內部版本使用託管流處理框架,但我們選擇對開源版本使用內建(獨立)流處理,因為它避免創建另一個基礎設施依賴項。
差異的另一個例子是在開源實作中使用單一 GMS(通用元資料儲存)而不是多個 GMS。 GMA(通用元資料架構)是DataHub後端架構的名稱,GMS是GMA上下文中的元資料儲存。 GMA 是一種非常靈活的架構,可讓您將每個資料建構(例如資料集、使用者等)分發到自己的元資料儲存中,或將多個資料建構儲存在單一元資料儲存中,只要註冊表中包含資料結構映射即可GMS 已更新。 為了方便使用,我們選擇了一個 GMS 實例,將所有不同的資料結構儲存在開源 DataHub 中。
下表給出了兩種實現之間差異的完整列表。
產品特點
領英資料中心
開源資料中心
支援的資料結構
1) 資料集 2) 使用者 3) 指標 4) ML 功能 5) 圖表 6) 儀表板
1) 資料集 2) 用戶
資料集支援的元資料來源
1)
Hive Kafka RDBMS
發布-訂閱
匯流卡夫卡
流處理
管理
嵌入式(獨立)
依賴注入和動態配置
領英後代
建構工具
Ligradle(LinkedIn 的內部 Gradle 包裝)
CI / CD
CRT(LinkedIn 的內部 CI/CD)
元資料儲存
分佈式多個GMS:1)資料集GMS 2)使用者GMS 3)指標GMS 4)特徵GMS 5)圖表/儀表板GMS
單一 GMS 適用於:1) 資料集 2) 用戶
Docker 容器中的微服務
圖 2:架構 數據中心 *開源**
您可以在上圖中看到 DataHub 的高階架構。 除了基礎設施元件之外,它還有四個不同的 Docker 容器:
datahub-gms:元資料儲存服務
資料中心前端:應用程式
datahub-mce-consumer:應用程式
數據集線器-mae-消費者:應用程式
開源儲存庫文件和
DataHub 上的 CI/CD 是開源的
開源 DataHub 儲存庫使用
每次提交到 DataHub 開源儲存庫時,所有 Docker 映像都會自動建置並使用「最新」標籤部署到 Docker Hub。 如果 Docker Hub 配置了一些
使用資料中心
- 複製開源儲存庫並使用提供的 docker-compose 腳本透過 docker-compose 運行所有 Docker 容器以快速啟動。
- 使用也提供的命令列工具下載儲存庫中提供的範例資料。
- 在瀏覽器中瀏覽 DataHub。
主動追蹤
Планынабудущее
目前,開源 DataHub 的每個基礎設施或微服務都是作為 Docker 容器建構的,整個系統是使用
我們還計劃提供在公有雲服務上部署 DataHub 的交鑰匙解決方案,例如
最後但並非最不重要的一點是,感謝開源社群中所有 DataHub 的早期採用者,他們對 DataHub 進行了 alpha 評級,並幫助我們發現問題並改進文件。
來源: www.habr.com