如何架構乙個資料工程

2021-08-13 14:07:11 字數 2583 閱讀 8830

在我們深入討論這個 「資料工程」 業務細節之前,我們需要先知道標準(pydata)機器學習資料管道的侷限性,如下圖所示:

典型的 pydata 機器學習資料管道設計,通過 python 指令碼完成鏈結(通常是單執行緒)

對於機器學習可擴充套件性差問題的解釋,可以檢視這篇文章,有非常詳細的解釋。在這裡,我們將採用乙個更加簡單的方式來說明這3個問題,為什麼這個資料管道的載入是如此的重。

如果我們開始增加乙個單執行緒來載入 pydata 資料管道,那麼這種操作最終肯定是會失敗的。我們不能將這種操作擴充套件到單個節點之外,也就是說,如果你的資料太巨大以至於不能在記憶體中操作,那麼你需要對其進行批量處理,否則你將無法進行處理。如果你沒有足夠的cpu資源去訓練乙個模型,那麼你只能去購買乙個更好的處理器來解決這個問題,但是如果你已經擁有了乙個很好的處理器,那麼接下來又會發生什麼呢?更糟糕的是,因為模型的資料輸入請求是由一定的速率要求的,如果模型不能按照一定的速率得到**結果,那麼這將成為整乙個系統的效能瓶頸。python 中的多執行緒是有限的,如果乙個執行緒失敗了,那麼系統是沒有辦法優雅的去切換到預設值,所以我們只能失敗。

上述所有的問題都可以通過拆分 - 應用 - 組合的策略來解決,該策略允許將乙個任務分割成多個子任務然後並行子啊不同的執行緒或者節點上面去計算,最後將計算結果進行合併,加快資料管道的處理效率。mapreduce 的思想就是來解決這個問題的,我們可以用任何的語言來實現這乙個演算法,但是你會度過幾小時的痛苦時間,因為從零開始編寫 mapreduce 是一件非常瘋狂的事。乙個可行的方式是我們利用 hadoop 的 mapreduce 或者 spark 的。hadoop 的操作可能會慢一點,因為它每次操作之後都會發生磁碟讀寫操作(所以現在幾乎沒有人使用它),但是 spark 所有的計算都是發生在記憶體中,加快了機器學習演算法的迭代速度,甚至比一般的流水式資料管道還要快(但是你需要乙個很大的記憶體空間)。

由於 spark 不但提供了資料批處理和流處理,它還提供了 spark ml 這乙個強大的包。這個包允許你進行分布式機器學習操作,用 spark jobs 可以完全替代 python 指令碼中的 pydata 資料管道和模組之間的聯結器,而且可以很方便的在分布式集群上面執行,執行緒失敗了可以正常重啟。

讓我們試想一下,我們已經用 spark jobs 和 spark ml 模組替代了典型模型 pydata ml pipeline 中的中間指令碼,如下圖所示:

在這個資料管道中還存在乙個弱點:db。當處理的資料量超過 5tb 的時候,關聯式資料庫的處理能力表現不佳。關聯式資料庫的分片和複製是乙個本身就存在的大問題,如果你想要去支援如此大的資料量,那麼這必將是乙個昂貴的冒險行為。所以當我們的資料量在達到 5tb 的天花板之前,可能需要放棄關係型資料庫。

那麼,對於大資料來說,還有那些其他的資料儲存方案可以選擇呢?首先,需要乙個分布式資料儲存系統,它能夠對抗如下問題:

但是這個只是分布式資料的基礎設施,那麼儲存資料的方式呢?

正如我們已經想到的那樣,利用關係型資料庫是乙個糟糕的選擇。那麼,採用純文字的方式呢?令人驚喜的是,.csv 或 .tsv 檔案通常是可以被儲存在 hdfs 系統上的,作為快速和不加判斷的方式來儲存從外部服務中提交的資料(比如,指令碼批量接受的資料)。

那麼 nosql 資料庫呢?請注意,並不是所有的 nosql 資料庫都是分布式的。

cassandra 是分布式 nosql 資料庫的乙個典型選擇,但是他仍然需要乙個專門的 devops 來設定,維護,監視,擴充套件等等。因此,分布式 nosql 是儲存資料的預設選項,因為我們需要乙個可以方便查詢的資料庫。

對於那些想要減少 devops 人員工作量的人來說,有乙個簡單的解決方案就是使用 parquet。

我們把上面講的架構設計都反應在一張圖中,如下圖:

隨著 spark jobs 數量的增加,資料管道變得雜亂無章,所以有很多的事情需要去處理:

有一些解決方案可以去管理重新編排這些資料管道,我們來重點來介紹其中的 2 個。

python 開發的乙個簡單的工作流管理解決方案,由 spotify 開源。

更加複雜和有效的工作流管理工具,由 airbnb 開發和開源。

最後,我們可以畫出我們一整個資料工程架構圖。如下圖所示:

作者:chen_h

部落格位址

如何架構乙個資料工程

在我們深入討論這個 資料工程 業務細節之前,我們需要先知道標準 pydata 機器學習資料管道的侷限性,如下圖所示 對於機器學習可擴充套件性差問題的解釋,可以檢視這篇文章,有非常詳細的解釋。在這裡,我們將採用乙個更加簡單的方式來說明這3個問題,為什麼這個資料管道的載入是如此的重。如果我們開始增加乙個...

如何架構乙個 React 專案?

程式設計有點像搞園藝。比起竭力去對付bug 蟲子 我們更願意把一切弄得整潔有序,以免最後落得個身在荒野叢林中。低劣的架構會拖我們的後腿,也會使得bug更容易鑽進系統裡去。想要對你的專案進行架構,方法有多種。我相信,根據你的實際情況對架構進行演進,要遠比堅持一些條條框框的教條更好。接下來我將會介紹一些...

如何建立乙個Linq工程

索引頁 就是在你的工程裡面新增命名空間.有這兩個 system.core.dll中的 system.linq和system.linq.expressions.1 使用linq to xml的 system.core.dll中的 system.linq和system.linq.expressions....