av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

一次Serverless架構(gòu)改造實(shí)踐:基因樣本比對(duì)

一次 serverless 架構(gòu)改造實(shí)踐:基因樣本比對(duì)

作者:佚名 2018-05-25 14:41:56

云計(jì)算 本文將從代碼的角度,通過(guò)改造一個(gè) Python 應(yīng)用來(lái)幫助讀者從側(cè)面理解 Serverless,讓?xiě)?yīng)用繼承 Serverless 架構(gòu)的優(yōu)點(diǎn)。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),績(jī)溪企業(yè)網(wǎng)站建設(shè),績(jī)溪品牌網(wǎng)站建設(shè),網(wǎng)站定制,績(jī)溪網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,績(jī)溪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

Serverless 是一種新興的無(wú)服務(wù)器架構(gòu),使用它,開(kāi)發(fā)者只需專(zhuān)注于代碼,無(wú)需關(guān)心運(yùn)維、資源交付或者部署。

本文將從代碼的角度,通過(guò)改造一個(gè) Python 應(yīng)用來(lái)幫助讀者從側(cè)面理解 Serverless,讓?xiě)?yīng)用繼承 Serverless 架構(gòu)的優(yōu)點(diǎn)。

現(xiàn)有資源:

  •  一個(gè)成熟的基因?qū)Ρ人惴?Python實(shí)現(xiàn),運(yùn)行一次的時(shí)間花費(fèi)為 2 秒)
  •  2020 個(gè)基因樣本文件(每個(gè)文件的大小為 2M,可以直接作為算法的輸入)
  • 一臺(tái) 8 核心云主機(jī)

基因檢測(cè)服務(wù)

我們使用上面的資源來(lái)對(duì)比兩個(gè)人的基因樣本并 print 對(duì)比結(jié)果(如:有直系血緣關(guān)系的概率)

我們構(gòu)造目錄結(jié)構(gòu)如下:

  
 
 
 
  1. ├── relation.py 
  2. └── samples 
  3.     ├── one.sample 
  4.     └── two.sample 

relations.py 代碼如下:

  
 
 
 
  1. import sys 
  2.  
  3. def relationship_algorithm(human_sample_one, human_sample_two): 
  4.     # it's a secret 
  5.     return result 
  6.  
  7. if __name__ == "__main__": 
  8.     length = len(sys.argv) 
  9.     # sys.argv is a list, the first element always be the script's name 
  10.     if length != 3: 
  11.         sys.stderr.write("Need two samples") 
  12.     else: 
  13.         # read the first sample 
  14.         with open(sys.argv[1], "r") as sample_one: 
  15.             sample_one_list = sample_one.readlines() 
  16.         # read the second sample 
  17.         with open(sys.argv[2], "r") as sample_two: 
  18.             sample_two_list = sample_two.readlines() 
  19.         # run the algorithm 
  20.         print relationship_algirithm(sample_one_list, sample_two_list) 

使用方法如下:

  
 
 
 
  1.  python relation.py ./samples/one.sample ./samples/two.sample 
  2.  0.054 

流程比較簡(jiǎn)單,從本地磁盤(pán)讀取兩個(gè)代表基因序列的文件,經(jīng)過(guò)算法計(jì)算,***返回結(jié)果

我們接到了如下業(yè)務(wù)需求

假設(shè)有 2000 人尋找自己的孩子,20 人尋找自己的父親

首先收集唾液樣本經(jīng)過(guò)專(zhuān)業(yè)儀器分析后,然后生成樣本文件并上傳到我們的主機(jī)上,一共 2020 個(gè)樣本文件,***我們需要運(yùn)行上面的算法

  • 2000 * 20 = 40000(次)

才可完成需求,我們計(jì)算一下總花費(fèi)的時(shí)間:

  • 40000(次) * 2(秒)= 80000 (秒)
  • 80000(秒)/ 60.0 / 60.0 ≈ 22.2(小時(shí))

串行需要花費(fèi) 22 小時(shí)才能算完,太慢了,不過(guò)我們的機(jī)器是 8 核心的,開(kāi) 8 個(gè)進(jìn)程一起算:

  • 22.2 / 8 ≈ 2.76(小時(shí))

也要快 3 個(gè)小時(shí),還是太慢,假設(shè) 8 核算力已經(jīng)到極限了,接下來(lái)如何優(yōu)化呢?

1.1.1 介紹一種 Serverless 產(chǎn)品:UGC

UCloud General Compute

與 AWS 的 lambda 不同,UGC 允許你將計(jì)算密集型算法封裝為 Docker Image (后文統(tǒng)稱(chēng)為「算法鏡像」),只需將算法鏡像 push 到指定的算法倉(cāng)庫(kù)中,UGC 會(huì)將算法鏡像預(yù)先 pull 到一部分計(jì)算節(jié)點(diǎn)上,當(dāng)你使用以下兩種形式:

  • 算法鏡像的名字和一些驗(yàn)證信息通過(guò) querystring 的形式 (例如:http://api.ugc.service.ucloud.cn?ImageName=relation&Token=!Q@W#E)
  • 算法鏡像所需的數(shù)據(jù)通過(guò) HTTP body 的形式

特別構(gòu)造的 HTTP 請(qǐng)求發(fā)送到 UGC 的 API 服務(wù)時(shí),「任務(wù)調(diào)度器」會(huì)幫你挑選已經(jīng) pull 成功算法鏡像的節(jié)點(diǎn),并將請(qǐng)求調(diào)度過(guò)去,然后啟動(dòng)此算法鏡像「容器」將此請(qǐng)求的 HTTP body 以標(biāo)準(zhǔn)輸入 stdin 的形式傳到容器中,經(jīng)過(guò)算法計(jì)算,再把算法的標(biāo)準(zhǔn)輸出 stdout 和標(biāo)準(zhǔn)錯(cuò)誤 stderr 打成一個(gè) tar 包,以 HTTP body 的形式返回給你,你只需要把返回的 body 當(dāng)做 tar 包來(lái)解壓即可得到本次算法運(yùn)行的結(jié)果。

講了這么多,這個(gè)產(chǎn)品使你可以把密集的計(jì)算放到了數(shù)萬(wàn)的計(jì)算節(jié)點(diǎn)上,而不是我們小小的 8 核心機(jī)器,有數(shù)萬(wàn)核心可供使用,那么如何使用如此海量的計(jì)算資源呢,程序需要小小的改造一下

1.1.2 針對(duì)此 Serverless 架構(gòu)的改造

兩部分:

  •  改造算法中元數(shù)據(jù)從「文件輸入」改為「標(biāo)準(zhǔn)輸入」,輸出改為「標(biāo)準(zhǔn)輸出」
  •  開(kāi)發(fā)客戶(hù)端構(gòu)造 HTTP 請(qǐng)求,并提高并發(fā)

1. 改造算法輸入輸出

① 改造輸入為 stdin

  
 
 
 
  1. cat ./samples/one.sample ./samples/two.sample | python relation.py 

這樣把內(nèi)容通過(guò)管道交給 relation.py 的 stdin,然后在 relation.py 中通過(guò)以下方式拿到:

  
 
 
 
  1. import sys 
  2.  
  3. mystdin = sys.stdin.read() 
  4. # 這里的 mystdin 包含 ./samples/one.sample ./samples/two.sample 的全部?jī)?nèi)容,無(wú)分隔,實(shí)際使用可以自己設(shè)定分隔符來(lái)拆分 

② 將算法的輸出數(shù)據(jù)寫(xiě)入 stdout

  
 
 
 
  1. # 把標(biāo)準(zhǔn)輸入拆分為兩個(gè) sample 
  2. sample_one, sample_two = separate(mystdin) 
  3.  
  4. # 改造算法的輸出為 STDOUT 
  5. def relationship_algorithm(sample_one, sample_two) 
  6.     # 改造前 
  7.     return result 
  8.     # 改造后 
  9.     sys.stdout.write(result) 

到此就改造完了,很快吧

2. 客戶(hù)端與并發(fā)

剛才我們改造了算法鏡像的邏輯(任務(wù)的執(zhí)行),現(xiàn)在我們來(lái)看一下任務(wù)的提交:

構(gòu)造 HTTP 請(qǐng)求并讀取返回結(jié)果

  
 
 
 
  1. imageName = "cn-bj2.ugchub.service.ucloud.cn/testbucket/relationship:0.1" 
  2. token = tokenManager.getToken() # SDK 有現(xiàn)成的 
  3.  
  4. # summitTask 構(gòu)造 HTTP 請(qǐng)求并將鏡像的 STDOUT 打成 tar 包返回 
  5. response = submitTask(imageName, token, data) 

它也支持異步請(qǐng)求

之前提到,此 Serverless 產(chǎn)品會(huì)將算法的標(biāo)準(zhǔn)輸出打成 tar 包放到 HTTP body 中返回給客戶(hù)端,所以我們準(zhǔn)備此解包函數(shù):

  
 
 
 
  1. import tarfile 
  2. import io 
  3.  
  4. def untar(data): 
  5.     tar = tarfile.open(fileobj=io.BytesIO(data)) 
  6.     for member in tar.getmembers(): 
  7.         f = tar.extractfile(member) 
  8.         with open('result.txt','a') as resultf: 
  9.             strs = f.read() 
  10.             resultf.write(strs) 

解開(kāi) tar 包,并將結(jié)果寫(xiě)入 result.txt 文件

假設(shè)我們 2200 個(gè)樣本文件的絕對(duì)路徑列表可以通過(guò) get_sample_list 方法拿到

sample_2000_list, sample_20_list = get_sample_list()

計(jì)算 2000 個(gè)樣本與 20 個(gè)樣本的笛卡爾積,我們可以直接使用 itertools.product

  
 
 
 
  1. import itertools  
  2. all = list(itertools.product(sample_2000_list, sample_20_list))  
  3. assert len(all) == 40000 

結(jié)合上面的代碼段,我們封裝一個(gè)方法:

  
 
 
 
  1. def worker(two_file_tuple): 
  2.     sample_one_dir, sample_two_dir = two_file_tuple 
  3.  
  4.     with open(sample_one_dir) as onef: 
  5.         one_data = onef.read() 
  6.     with open(samle_two_dir) as twof: 
  7.         two_data = twof.read() 
  8.      
  9.     data = one_data + two_data 
  10.     response = summitTask(imageName, token, data) 
  11.     untar(response) 

因?yàn)闃?gòu)造 HTTP 請(qǐng)求提交是 I/O 密集型而非計(jì)算密集型,所以我們使用協(xié)程池處理是非常高效的:

  
 
 
 
  1. import gevent.pool 
  2. import gevent.monkey 
  3. gevent.monkey.patch_all() # 猴子補(bǔ)丁 
  4.  
  5. pool = gevent.pool.Pool(200) 
  6. pool.map(worker, all) 

只是提交任務(wù) 200 并發(fā)很輕松

全部改造完成,我們來(lái)簡(jiǎn)單分析一下:

之前是 8 個(gè)進(jìn)程跑計(jì)算密集型算法,現(xiàn)在我們把計(jì)算密集型算法放到了 Serverless 產(chǎn)品中,因?yàn)榭蛻?hù)端是 I/O 密集型的,單機(jī)使用協(xié)程可以開(kāi)很高的并發(fā),我們不貪心,按 200 并發(fā)來(lái)算:

進(jìn)階閱讀:上面這種情況下帶寬反而有可能成為瓶頸,我們可以使用 gzip 來(lái)壓縮 HTTP body,這是一個(gè)計(jì)算比較密集的操作,為了 8 核心算力的高效利用,可以將樣本數(shù)據(jù)分為 8 份,啟動(dòng) 8 個(gè)進(jìn)程,進(jìn)程中再使用協(xié)程去提交任務(wù)就好了。

  • 40000 * 2 = 80000(秒)
  • 80000 / 200 = 400(秒)

也就是說(shuō)進(jìn)行

一組檢測(cè)只需要 400 秒,從之前的 7 天提高到 400 秒,成果斐然,圖表更直觀(guān):

而且算力瓶頸還遠(yuǎn)未達(dá)到,任務(wù)提交的并發(fā)數(shù)還可以提升,再給我們一臺(tái)機(jī)器提交任務(wù),便可以縮短到 200 秒,4 臺(tái) 100 秒,8 臺(tái) 50 秒...

最重要的是改造后的架構(gòu)還繼承了 Serverless 架構(gòu)的優(yōu)點(diǎn):

  • 免運(yùn)維
  • 高可用
  • 按需付費(fèi)
  • 發(fā)布簡(jiǎn)單

1. 免運(yùn)維 -- 因?yàn)槟銢](méi)有服務(wù)器了...

2. 高可用 -- Serverless 服務(wù)一般依托云計(jì)算的強(qiáng)大基礎(chǔ)設(shè)施,任何模塊都不會(huì)只有單點(diǎn),都盡可能做到跨可用區(qū),或者跨交換機(jī)容災(zāi),而且本次使用的服務(wù)有一個(gè)有趣的機(jī)制:同一個(gè)任務(wù),你提交一次,會(huì)被多個(gè)節(jié)點(diǎn)執(zhí)行,如果一個(gè)計(jì)算節(jié)點(diǎn)掛了,其他節(jié)點(diǎn)還可以正常返回,哪個(gè)先執(zhí)行完,先返回哪個(gè)。

3. 按需付費(fèi) -- 文中說(shuō)每個(gè)算法執(zhí)行一次花費(fèi)單核心 CPU 時(shí)間 2 秒,我們直接算一下花費(fèi)

  • 2000 * 20 * 2 = 80000(秒)
  • 80000 / 60 / 60 = 22.22(小時(shí))
  • 22.22(小時(shí)) * 0.09(元) * 1(核心) ~= 2(元)
  • 每核時(shí) 0.09 元(即單核心 CPU 時(shí)間 1 小時(shí),計(jì)費(fèi) 9 分錢(qián))

4. 發(fā)布簡(jiǎn)單 -- 因?yàn)槭褂?Docker 作為載體,所以它是語(yǔ)言無(wú)關(guān)的,而且發(fā)布也很快,代碼寫(xiě)好直接上傳鏡像就好了,至于灰度,客戶(hù)端 imageName 指定不同版本即可區(qū)分不同代碼了

不同的 Serverless 產(chǎn)品可能有不同的改造方法,作為工程師,我比較喜歡這種方式,改造成本低,靈活性高,你覺(jué)得呢?如果對(duì) Serverless 架構(gòu)或者 UGC 感興趣的話(huà)可以添加 u_nknow 微信拉你進(jìn)交流群哦


名稱(chēng)欄目:一次Serverless架構(gòu)改造實(shí)踐:基因樣本比對(duì)
新聞來(lái)源:http://uogjgqi.cn/article/cooedep.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流