分散式科學計算與Docker_Kubernetes中文社群
作者:Ghostcloud-謝斌
在科學計算領域, 早些年的程式語言基本都是C/C++或者FORTRAN的天下, 是因為科學計算本身非常耗時, 選擇一門執行速度比較快的語言能大大的節約對資料的計算時間. 但是在保證速度的之後, 語言的通用性和易用性又成了一大問題. C語言雖然語法簡單明瞭, 執行速度快. 但是它的開發難度卻是所有語言中最大的. 面向物件的變成方法需要藉助比如structure這一類的特性來實現. 並且也沒有太多的第三方庫可供使用. 所以在開發複雜系統的時候, 需要很強的規劃能力. 而C++或者其他語言, 又因為學習成本高, 往往只是少部分專業程式設計師能用到滾瓜爛熟. 一個演算法實現不好便會大大的降低執行速度. 我相信很多做過程式設計師的朋友都有這樣的體會, 即便是用C來寫一個演算法, 如果實現的不夠精妙, 往往執行速度還不如ruby, perl這些指令碼語言的第三方庫. 因為這些第三方庫雖然有先天的劣勢, 但是這些相關的函式確是從演算法上精心錘鍊過的. 設計不好的演算法+先天的編譯優勢vs精煉的演算法+解釋型語言, 誰的速度快其實更多的, 就是看運氣了.
所以是否有一種方法, 有C的快速,Ruby的動態,Java的通用,R般在統計分析上得心應手,Perl的處理字串處理,Matlab的線性代數運算能力. 易學又大碗呢.
Python作為一門通用的面向物件的程式設計語言, 已經越來越多的應用在各個領域. 包括金融業, 製造業以及資料資訊產業. 基於python的程式庫也是越來越多並且功能越來越強. Python的通用性和易上手性以及不用討論了, 現在很多非科班程式設計師出身的哥們兒以及能在基於python的各種庫中實現自己想要的功能. 做金融資料分析的, 做影象識別的, 做自動化的. 幾乎每一個專業都能在python上找到自己相關的專用庫. 前幾天還聽說python會納入小學課程. 也不知道是段子還是真的. 但是從目前的情況來看. Python確實已經融入到了生產環節的方方面面.
目前科學計算比較流行的方法是用python作為膠水, 再把c, c++這些高速語言實現的計算庫進行實際的數學計算. 比如著名的Tensorflow, pandas, numpy等等這些使用寬泛的庫. 程式的邏輯又python控制, 資料在各個庫裡面計算, 輸入和輸出. 這樣的話, 程式本身的效能和易用性得到了最大化的提升.
科學計算的速度除了之前說的和語言相關, 還包括另外2個關鍵要素, 第一個是分散式, 第二個是系統資源的限制(包括CPU, Memory和Storage).
語言和執行平臺的問題, 我們可以通過python+計算庫來實現, 但是分散式和系統資源呢.
首先, 如果我們要實現科學計算的分散式, 除了在程式裡面自己實現之外, 還有很多相關的開源框架, 比如hadoop + hive這類的大資料現成框架. 但是這一類的系統偏大偏重, 且升級更新不夠自動化和輕量.
其實有一種更為輕量級的方式, Docker+K8s實現分散式計算和資源自動劃分.
原理很簡單, 我們在實現演算法的時候, 並不要求實現分散式的架構, 只需要能讀取資料, 計算分析資料, 然後輸出資料到檔案即可. 在實現演算法的程式之後, 我們將程式和依賴環境封裝成docker映象. 並且放到docker的映象倉庫裡面. 使用k8s對映象進行自動化的排程, 我們可以設定規則說, 每一個物理主機只能執行一個容器或者執行多個容器. 然後把每一個容器的輸出結果定向到共享儲存. 只需要簡單的幾步, 基本上一個有自動排程功能, 資源劃分功能, 高可用功能和執行狀態監控功能的一個分散式計算系統就已經搭好了.
之後, 我們只需要加入負責計算的節點, k8s會自動根據CPU/Memory的閾值自動做負載均衡. 舉個例子來說, 我們甚至不用指定說哪些容器執行在哪些主機上, 只需要啟動pod並且指定併發數量, k8s就會自動將這個計算程式的映象分佈到每一個可用的計算節點上. 並且自動負載均衡. 當計算完成之後, K8s的檢查到pod沒有使用的情況. 會自動刪除相關的pod, 釋放資源給其他計算服務使用.
K8s自帶健康檢查功能, 所以我們可以使用這個功能來實現對容器執行狀態的監控. 一旦發現job出了問題, 我們可以選擇重啟, 終止, 或者路由到其他計算節點上面.
並且根據Docker輕量級的特性, 我們可以用devops實現其計算映象的快速部署. 只需要在編譯好程式碼後更新映象倉庫裡面對應的映象. K8s會自動升級所有有關的pod, 讓執行的程式始終是最新的.
Docker和科學計算的結合, 其主要優勢在於快速部署和計算資源的統一管理. 相對比較輕. 且對環境要求不高. 老舊機器, 新機器, 都可以加入到計算叢集. 以實現資源的最大化利用.