簡單說下背景,condor是一個做業調度系統,用來作批處理的離線任務。咱們"基因類似度比對"的業務就是跑在condor上面。咱們先看下以前基於condor的架構:node
- condor由master和node節點組成,master主要用來分配任務,node用來執行任務(這個和大多數大數據處理的框架一致),沒有任務的時候也須要4臺master節點常駐
- 由於計算須要全部人的基因文件,每一個幾十K,因此每一個node啓動的時候都要在本地磁盤導入大概幾百G的數據
- condor的任務分配邏輯爲每個人分配一個進程(對應一個核)來計算,和進程內部和所有幾十萬人的數據一一作比較,一我的計算花費1~2小時左右,咱們會同時起多個進程並行計算多我的的結果
- 若是一段時間以內計算任務較多,就多開機器,計算完畢以後手動關閉
- 每次計算須要手動登陸condor集羣投遞任務
由於咱們主要的生信數據分析流程跑在k8s上面,因此我在想能否把condor的任務放到k8s裏面跑,由於這樣能夠帶來以下好處:網絡
- 可使用spot實例(以前用的按需實例+預留實例),而且用完node就能夠回收,大幅度下降成本(當初我估計能夠下降80%)
- 計算時間更短(我當時預估在半個小時左右跑完),由於咱們能夠把一我的和幾十萬人的比對計算並行在多個pod跑(以前的方案是多我的並行跑,可是一我的仍是線性跑)
- 計算更加彈性(以前condor須要手動添加銷燬節點)
- 充分利用咱們已有的k8s的生態,好比日誌和監控等等
看到了業務價值以後在一個週末就開幹了,下面是放到k8s計算以後的架構:架構
- 首先有一個服務,該服務會接收啓動計算的kafka消息,接收到消息以後會對任務作分片,把幾十萬人次到幾百萬人次的比對分割爲12萬人次*N(爲何是每一個Pod計算12萬人次後面講),N就是並行計算的Pod數量。
- 分割以後的每一個12萬人次的名單存儲到S3裏面
- 分片完畢以後經過argo把任務投遞到k8s上面,這樣分片以後的任務會在k8s的多個Pod並行跑起來
真正稍微複雜的是Pod的設計:框架
- 每一個pod啓動的時候接收兩個環境變量,一個是要比對的人的id,另外一個是被比對的12萬人的id的名單的S3的地址(pod裏面會根據這個id去S3拉取每一個用戶的數據文件)。
- 資源方面每一個pod限制CPU爲1核,內存爲2G。資源的限制不該該拍腦殼決策,而是設置了值以後實際跑一下觀察資源的使用狀況,而後再調整一個合適的值。
- 咱們計算邏輯是go寫的,以前的方案是串行跑,沒有使用goroutine,致使CPU佔用率不高(讀寫文件的阻塞時間會下降CPU佔用率),我修改以後使用goroutine並行計算300個,使用以後發現效果很是好,CPU使用率在90%基本被打滿了。
- 文件存儲是一個大問題,以前在condor集羣跑的時候文件是提早下載到機器上的,而咱們在k8s裏面跑的時候不能這麼搞,由於每次node啓動的時候就要同步全量的數據意味着每臺k8s裏面的pod都要掛載一個200G+的盤,這是不現實的,因此只能計算的時候拉下來,但這也有一個問題,若是一個Pod須要拉12W人的數據,大概是5G,那麼36核機器對應36個Pod就是須要180G的盤,這個也不現實。因此咱們的方案是「拉文件->計算->刪文件」,邊拉邊刪,使得Pod的磁盤消耗不會陡增。得益於goroutine,拉文件這種網絡IO和文件操做的磁盤IO操做並不會block CPU的計算,因此總體CPU利用率很是高。
- 每一個Pod計算多少人次?這個根據咱們想讓Pod運行多久有關,個人想法是一個Pod最好在40分鐘左右跑完,由於時間再短粒度就太細了,形成Pod增多,Pod增多以後可能Pending狀態的Pod就會增多(由於Node數量有上限),時間太長也很差,這樣一我的的計算時間就會被拉長而且在spot節點上運行的任務越長被殺掉的機會就越大(由於spot實例會被回收)。
- Pod退出怎麼辦?argo能夠設置重試次數,Pod退出以後能夠被從新啓動計算。在spot實例跑的任務必定要作好容錯,由於spot實例會被雲供應商回收。好比有人購買按需實例,供應商可能從spot的池子中回收賣給購買按需實例的人。
- 選擇什麼機器跑?爲了追求極致的性能和性價比我選擇了C5系列的EC2,一個是CPU頻率高達3.6GHZ很是適合跑計算密集型的業務,另外一個是價格便宜,官方聲稱比C4系列性價比提高25%。(在公有云跑任務,必定要挑選合適的機器,這個對服務的性能和公有云費用影響很大)
整套方案實施下來確實達到了當初的目標:性能
- 更省錢:計算一我的的和所有人的基因類似度價格下降到2~3分錢,價格下降了98%!!!
- 更快:以前承諾給用戶兩個周出來數據,如今只須要一個小時!!
- 更彈性:一次來100個用戶和一次來1W個用戶對咱們來講沒有任何區別
- 更自動化:整個過程徹底無人監管,徹底自動化
用技術創新來創造業務價值的感受真好😆大數據