試著想像一下,也許就像 Day 10 一樣做 Google API 的 資料收集 ⮕ 資料轉換 ⮕ 資料匯入,透過 Python + SQL 的程式碼,搭配 Airflow 的框架特性進行工作任務排程,我們建立了一條 data pipeline。
為了不讓自己的電腦進到排程時就執行地燒燙燙,我們在開了一台雲端機器,讓 Airflow 流程在上面運作;隨著資料量愈來愈多,我們也運用了雲端資料庫來儲存資料。
結果這個 ETL 流程越弄越大,每次想要改變資料轉換的算法,都要經歷:
有點麻煩,而且好多任務需要手動下指令,怎麼那麼繁複?我只是想做 ETL 呀,能不能進一步自動化?
在建構 Airflow 的開發環境時,我們可以搭配以下幾個重要的軟體工程概念和工具來確保系統的靈活性與可維護性:
虛擬環境 (Virtual Environment)
虛擬環境主要指的是在同一台機器或作業系統內,隔離出一個獨立的空間,用於管理和運行不同版本的相依和函式庫。
開發者可以在不同的虛擬環境中安裝和管理不同版本的 Python 以及相應的套件,避免套件之間的版本衝突。
虛擬環境不會模擬整個作業系統 (Operation System, OS),只是針對程式運行的相依進行隔離,達到環境獨立的效果。
推薦參考:Python 套件管理器 - - Poetry 完全入門指南
映像檔 (Image)
映像檔是指包含應用程式的程式碼、運行環境及配置文件的「運行藍圖」。這些映像檔通常會用於創建容器。
映像檔通常分層構建,每一層可以基於前一層進行修改,最終生成一個完整的應用程式環境。
Docker image 是常見的映像檔形式。開發者可以基於一個映像檔來創建許多相同配置的容器。
容器 (Container)
容器是一個基於 image 運行的獨立執行環境。容器是在作業系統 層面上實作虛擬化,直接使用本地主機的作業系統,而傳統方式則是在硬體層面實作。
相比於虛擬機器 (Virtual Machine, VM),容器運行在同一作業系統上,資源利用率更高,啟動速度更快。
總結來說容器具有:
輕量化:運行速度快且資源消耗低。
可移植性:搬到另外一台也支援容器化的環境就可以用了。
隔離性:每個容器的都與其他容器獨立運行,確保穩定性。
容器通常使用 Docker 或 Kubernetes 來管理,並且每個容器都會根據特定的映像檔運行。容器可以在任意支持容器技術的作業系統上運行,無需考慮底層的硬體配置。
Docker
Docker 是一種容器技術,允許你將 Airflow 和它的相依套件一起打包到一個輕量的容器中運行,這樣可以保證在不同系統或環境中運行的一致性。
對於開發 Airflow 而言,我們可以在本地或雲端構建一個 Docker 映像,方便在不同環境間快速部署和測試。
推薦參考:《Docker - - 從入門到實踐》正體中文版
Kubernetes
Kubernetes 是一個容器編排工具,能夠管理大量的 Docker 容器,並根據資源需求動態擴展或縮減 Airflow 節點。在開發環境 (development) 中,Kubernetes 可以用來模擬 Airflow 在正式環境 (production) 中的運行方式,並且簡化容器的自動化管理,讓 Airflow 可以依據資源需求量調整配置,維持高效能運作,不因資料處理量變大而減損效能。
推薦參考:Kubernetes 官方文件
團隊內每個人作業系統環境不同,不透過這些軟體「打包」技巧,我們沒辦法多人協作。也沒辦法槓桿雲端資源,只能讓電腦開著去定時運行工作流程任務。
對於資料工程而言,大家最關心的或許是資料如何處理、如何確保準確可使用且具有重現性。但是,今天討論的軟體工程技術卻是資料工程任務執行能否規模化的關鍵因子。
明天再來聊具體的步驟吧!