不同的subber中接受數(shù)據(jù)進(jìn)行并行同時(shí)消費(fèi)數(shù)據(jù),這樣就可以實(shí)現(xiàn)數(shù)據(jù)的傳遞。數(shù)據(jù)的保存選用內(nèi)存和磁盤(pán)兩種模式的混合存儲(chǔ),由于消息隊(duì)列是給NLPC使用的,對(duì)數(shù)據(jù)的實(shí)時(shí)性要求要高一些,所以存儲(chǔ)形式以?xún)?nèi)存為主,只有在數(shù)據(jù)堆積以后才使用磁盤(pán)的持久化功能,如果超過(guò)一定時(shí)間數(shù)據(jù)仍未消費(fèi)掉,那么支持過(guò)期刪除的策略。整個(gè)請(qǐng)求如下,客戶端將數(shù)據(jù)指定到某一個(gè)linker,可以使用master進(jìn)行系統(tǒng)調(diào)度,當(dāng)數(shù)據(jù)進(jìn)入linker根據(jù)可定制的hash規(guī)則,將一個(gè)linker的數(shù)據(jù)打散到多個(gè)子隊(duì)列中去。考慮到下游有多個(gè)訂閱組的情況,采用多路分發(fā),將同一份數(shù)據(jù)分發(fā)到下游多個(gè)訂閱組。每個(gè)訂閱組內(nèi)的數(shù)據(jù)根據(jù)第一次的hash值二次計(jì)算到指定的subber中,通過(guò)兩次hash計(jì)算,一方面得到充分的打散,另一方面operator是多實(shí)例并發(fā),對(duì)于多個(gè)operator可以并行的從多個(gè)subber中獲取數(shù)據(jù),資源的競(jìng)爭(zhēng)。
[0026]所述非穩(wěn)定的機(jī)器集群系統(tǒng),主要用于向后臺(tái)的非穩(wěn)定機(jī)器發(fā)送請(qǐng)求,并且獲取極高吞吐量,但是對(duì)于單次的可用性不是特別高的服務(wù);該系統(tǒng)充分利用現(xiàn)有機(jī)器,具體指利用現(xiàn)有機(jī)器本身的CPU和內(nèi)存服務(wù),但是當(dāng)本身機(jī)器的計(jì)算服務(wù)請(qǐng)求增大的時(shí)候,為了保障機(jī)器原本服務(wù)的正常運(yùn)作,機(jī)器會(huì)將現(xiàn)階段的服務(wù)運(yùn)作殺死,被殺死的服務(wù)會(huì)在其他負(fù)載相對(duì)較輕的服務(wù)上跑,這時(shí)候就需要保證數(shù)據(jù)故障恢復(fù)的策略。
[0027]所述分布式多副本下載系統(tǒng),用于計(jì)算處理相對(duì)簡(jiǎn)單的服務(wù)系統(tǒng),不是特別消耗資源的服務(wù),可以同步到本地進(jìn)行運(yùn)算。
[0028]供用戶訪問(wèn)的C-API接口、Python接口和http服務(wù)端接口 ;對(duì)于前端c++和python的接口直接使用對(duì)應(yīng)的語(yǔ)言實(shí)現(xiàn),而http Server,考慮的方案是使用http server本地調(diào)用C++的client的客戶端直接作為代替的方案。后期可能會(huì)有后續(xù)的修改。部署http server啟用相同的端口后,使用virtual IP的服務(wù)獎(jiǎng)多個(gè)http server不同端口和IP綁定到一個(gè)虛擬IP上,并且這個(gè)vip會(huì)將請(qǐng)求通過(guò)hash均勾的分布在多臺(tái)不同的http server 中去。
[0029]所述多語(yǔ)言服務(wù)框架,通過(guò)開(kāi)源框架thrift和protobuf兩個(gè)軟件進(jìn)行代碼編輯,并在服務(wù)器端對(duì)多種語(yǔ)言統(tǒng)一處理,實(shí)現(xiàn)在客戶端使用多種語(yǔ)言進(jìn)行表述開(kāi)發(fā),用于在本地客戶端提供統(tǒng)一的接口,將遠(yuǎn)程訪問(wèn)和本地訪問(wèn)切換;方便的通過(guò)延遲、吞吐量等一系列的要求,自動(dòng)分配選擇后臺(tái)的調(diào)用方式。該多語(yǔ)言服務(wù)框架特有的客戶端和接口,一方面可以正常的解決問(wèn)題,另一方面,本身語(yǔ)言的客戶端對(duì)于算法的使用更加靈活方便。
[0030]分布式遠(yuǎn)程調(diào)用服務(wù)器,首先是需要基于前面的服務(wù)多語(yǔ)言,服務(wù)框架,然后再后臺(tái)通過(guò)前臺(tái)的服務(wù)訪問(wèn)的參數(shù)的不同,通過(guò)既定的協(xié)議,動(dòng)態(tài)的進(jìn)行訪問(wèn),同時(shí)這個(gè)服務(wù)器需要自動(dòng)的進(jìn)行負(fù)載均衡,使得客戶端的盡可能輕量級(jí),邏輯服務(wù)在這個(gè)分布式的遠(yuǎn)程調(diào)用服務(wù)器中,最后通過(guò)異步回調(diào)返回結(jié)果給客戶端。
[0031]平臺(tái)的信息統(tǒng)計(jì)和流量監(jiān)控:涉及到信息統(tǒng)計(jì),目前主要有兩種方式進(jìn)行日志收集,第一種是寫(xiě)一個(gè)通用的算子調(diào)用接口 CLI,對(duì)于算子的實(shí)現(xiàn)者而言,本身的NLP自然語(yǔ)言處理的算子只需要實(shí)現(xiàn)這個(gè)接口的動(dòng)態(tài)鏈接庫(kù),在這個(gè)接口中完成統(tǒng)一的收集和統(tǒng)計(jì)的功能,使用中間件進(jìn)行緩存,然后更新數(shù)據(jù)庫(kù);CLI用于提供基本的數(shù)據(jù)搜索接口,管理員可以在服務(wù)器的終端上通過(guò)此接口來(lái)檢索收集到的數(shù)據(jù),啟用或暫停集群中某個(gè)節(jié)點(diǎn)的數(shù)據(jù)收集任務(wù)。第二種是使用一種更為通用的日志收集方式,首先在每個(gè)代理的客戶端配置一個(gè)代理的agent,這個(gè)agent的主要功能是上傳某些文件的增量,將上次讀取的記錄保存在內(nèi)存里,然后定期掃描文件屬性,發(fā)現(xiàn)變化的時(shí)候,從上次文件讀取的地方繼續(xù)向后讀取,由于日志都有自己的文件拆分策略,當(dāng)發(fā)現(xiàn)日志突然變少的時(shí)候,重頭讀取文件,緊接著將日志上傳到server中去,在server端對(duì)日志進(jìn)行處理之后,實(shí)時(shí)將日志寫(xiě)入數(shù)據(jù)庫(kù)。另外,CLI接口用于提供基本的數(shù)據(jù)搜索,管理員可以在服務(wù)端的終端上通過(guò)此接口來(lái)檢索收集到的數(shù)據(jù),啟用或暫停集群中某個(gè)節(jié)點(diǎn)的數(shù)據(jù)收集任務(wù)。日志收集系統(tǒng)的架構(gòu)示意圖如圖4所示。
對(duì)于算子以及流量的監(jiān)控,采用兩種方式監(jiān)控,第一種是比較通用的方式,可以動(dòng)態(tài)添加或者刪除,對(duì)日志直接進(jìn)行監(jiān)控,分析處理之后進(jìn)行上傳;第二種是直接在包裝的算子殼中配置,同時(shí)使用redis作為緩存數(shù)據(jù)持久化到mysql中。對(duì)于第一種監(jiān)控方式,監(jiān)控程序采用的是分布式的日志收集方式,首先在每個(gè)算子的機(jī)器上部署rtlc工具,目的是監(jiān)控某些日志文件,對(duì)這些文件的增量實(shí)時(shí)上傳到scribe server中,server的功能就是收集定期的日志,然后通過(guò)自己的腳本存入到mysql當(dāng)中,前端再?gòu)臄?shù)據(jù)庫(kù)中實(shí)時(shí)查詢(xún)出來(lái),展示報(bào)警和動(dòng)態(tài)問(wèn)題的追蹤。同時(shí)通過(guò)觀察計(jì)算機(jī)cpu的負(fù)載情況,動(dòng)態(tài)的增加或者迀移算子。對(duì)于第二種方式,直接在包裝的operator中進(jìn)行統(tǒng)計(jì),redis每次對(duì)于算子的調(diào)用保存到臨時(shí)變量中,每達(dá)到一定的數(shù)量就寫(xiě)入redis,并且將臨時(shí)變量同時(shí)置為O,然后定時(shí)將redis的數(shù)據(jù)持久化到mysql中。也可以采用兩種方式混合使用的方法。
[0032]由平臺(tái)化所帶來(lái)系統(tǒng)SLA的達(dá)標(biāo):在NLPC這套平臺(tái)完成的時(shí)候,由于自然語(yǔ)言處理的云平臺(tái)自身是一套半在線的平臺(tái),需要有可用性延時(shí)的達(dá)標(biāo),所以必須有一套完整的實(shí)時(shí)信息統(tǒng)計(jì)的系統(tǒng)和信息的監(jiān)控,從根本上來(lái)講,在程序代碼寫(xiě)的足夠健壯、不存在任何內(nèi)存泄露的情況下,必須對(duì)每個(gè)算子的成功失敗方面的統(tǒng)計(jì),還有流控方面的統(tǒng)計(jì),這個(gè)一方面是對(duì)于異常的情況進(jìn)行報(bào)警的處理,同時(shí)萬(wàn)一出現(xiàn)某些算子的計(jì)算大量失敗,可以通過(guò)日志和結(jié)果及時(shí)對(duì)問(wèn)題進(jìn)行排查,另外一方面Qos也就是流量控制也是基于監(jiān)控的,對(duì)于流量特別大的情況以某些負(fù)載過(guò)大的情況或者說(shuō)防流量,可以直接把網(wǎng)卡打滿,導(dǎo)致網(wǎng)絡(luò)處于擁塞的情況。
[0033]平臺(tái)的負(fù)載均衡:一般來(lái)說(shuō),對(duì)于分布式集群而言,通過(guò)監(jiān)控自己機(jī)器的cpu和內(nèi)存的使用情況,在使用過(guò)載的時(shí)候向ZK傳遞信息通過(guò)某種算法進(jìn)行迀移,對(duì)于負(fù)載均衡有幾個(gè)方面的問(wèn)題,首先從物理上來(lái)講,是對(duì)多種計(jì)算分布在不同的計(jì)算機(jī)器上,但是從邏輯上來(lái)說(shuō),一個(gè)queue+ worker的流式系統(tǒng)的計(jì)算模型的負(fù)載均衡主要包括分布式消息隊(duì)列的負(fù)載均衡和從消息隊(duì)列消費(fèi)消息的算子的負(fù)載均衡。
[0034]在通信過(guò)程中,在不能使用同步線程阻塞的方式進(jìn)行通信的過(guò)程中,經(jīng)常會(huì)有線程阻塞的情況,這樣就需要開(kāi)多個(gè)線程來(lái)維護(hù)CPU的正常運(yùn)行,但是多個(gè)線程在進(jìn)行調(diào)度的過(guò)程中,由于線程在CPU的切換也是非常消耗性能的,因此在運(yùn)行的過(guò)程中最好使用異步通信的方式,也就是說(shuō),在通信的過(guò)程中,發(fā)送消息的線程和消息處理的線程是同步工作的,這樣避免了線程的大量切換給帶來(lái)的性能方面的損失。另外,同時(shí)最好合理的分配多個(gè)線程的運(yùn)行比例和總數(shù),一般來(lái)說(shuō),發(fā)送消息的線程和消息處理的線程的總數(shù)是core線程數(shù)的2倍。
[0035]平臺(tái)的故障恢復(fù),傳統(tǒng)的方式就是在兩個(gè)節(jié)點(diǎn)傳遞的過(guò)程中保持多條路徑,這種分組可以明顯改善容錯(cuò)狀況。在當(dāng)前的NLPC自然語(yǔ)言的處理需要有自己的延時(shí),但是實(shí)際上在計(jì)算的過(guò)程中,以消息隊(duì)列為例,消息隊(duì)列可以算是異步信息傳輸工具的一個(gè)中間件,在信息傳輸?shù)倪^(guò)程中,如果某臺(tái)機(jī)器或者消息隊(duì)列的進(jìn)程突然奔潰,后續(xù)的消息隊(duì)列會(huì)把無(wú)用的故障機(jī)器從消息隊(duì)列中刪除,使用類(lèi)似于一致性hash的方法把后續(xù)處理的數(shù)據(jù)均勻的打散到剩余的幾臺(tái)機(jī)器上,同時(shí)把故障機(jī)器添加到故障機(jī)器列表中,使用監(jiān)控程序把故障的機(jī)器重新啟動(dòng),然后添加到正常機(jī)器列表中,并且把持久化在磁盤(pán)的數(shù)據(jù)繼續(xù)發(fā)送。
[0036]以上所述僅為本發(fā)明的實(shí)施例,并非因此限制本發(fā)明的專(zhuān)利范圍,凡是利用本發(fā)明說(shuō)明書(shū)及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運(yùn)用在其他相關(guān)的技術(shù)領(lǐng)域,均同理包括在本發(fā)明的專(zhuān)利保護(hù)范圍內(nèi)。
【主權(quán)項(xiàng)】
1.一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,包括: 接入平臺(tái)后臺(tái)的穩(wěn)定的流式處理系統(tǒng)、非穩(wěn)定的機(jī)器集群系統(tǒng)和分布式多副本下載系統(tǒng); 供用戶訪問(wèn)的C-API接口、Python接口和http服務(wù)端接口 ; 多語(yǔ)言服務(wù)框架,用于在本地客戶端提供統(tǒng)一的接口,將遠(yuǎn)程訪問(wèn)和本地訪問(wèn)切換; 分布式遠(yuǎn)程調(diào)用服務(wù)器,用于邏輯服務(wù)并通過(guò)異步回調(diào)將結(jié)果返回給客戶端; 所述流式處理系統(tǒng)采用消息隊(duì)列的設(shè)計(jì)方式,所述消息隊(duì)列分為隊(duì)頭和隊(duì)尾兩個(gè)組件,所述隊(duì)頭組件為數(shù)據(jù)的接受端,所述隊(duì)尾組件為數(shù)據(jù)的發(fā)送端,算子從隊(duì)尾組件中接收數(shù)據(jù)進(jìn)行并行并消費(fèi),實(shí)現(xiàn)數(shù)據(jù)的傳遞。2.根據(jù)權(quán)利要求1所述的一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,所述平臺(tái)還包括一個(gè)數(shù)據(jù)轉(zhuǎn)存接口,用于將收集到的數(shù)據(jù)傳輸?shù)狡渌麘?yīng)用程序進(jìn)行再次處理,或是交給另一個(gè)程序作為輸入。3.根據(jù)權(quán)利要求2所述的一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,所述其他應(yīng)用程序包括monoDB或reddies。4.根據(jù)權(quán)利要求1所述的一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,所述多語(yǔ)言服務(wù)框架通過(guò)開(kāi)源框架thrift和protobuf兩個(gè)軟件進(jìn)行代碼編輯,并在服務(wù)器端對(duì)多種語(yǔ)言統(tǒng)一處理。5.根據(jù)權(quán)利要求1所述的一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,所述流式處理系統(tǒng)包括消息隊(duì)列的負(fù)載均衡和從消息隊(duì)列消費(fèi)消息的算子的負(fù)載均衡。6.根據(jù)權(quán)利要求1所述的一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,所述平臺(tái)的通信方式為異步通信,發(fā)送消息的線程和消息處理的線程同時(shí)工作。7.根據(jù)權(quán)利要求6所述的一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),其特征在于,所述發(fā)送消息的線程和消息處理的線程的總數(shù)是core線程數(shù)的2倍。
【專(zhuān)利摘要】本發(fā)明公開(kāi)了一種自然語(yǔ)言處理系統(tǒng)化服務(wù)平臺(tái),包括穩(wěn)定的流式處理系統(tǒng)、非穩(wěn)定的機(jī)器集群系統(tǒng)和分布式多副本下載系統(tǒng);C-API接口、Python接口和http服務(wù)端接口;多語(yǔ)言服務(wù)框架和分布式遠(yuǎn)程調(diào)用服務(wù)器;所述流式處理系統(tǒng)采用消息隊(duì)列的設(shè)計(jì)方式,消息隊(duì)列分為隊(duì)頭和隊(duì)尾兩個(gè)組件,算子從隊(duì)尾組件中接收數(shù)據(jù)進(jìn)行并行并消費(fèi),實(shí)現(xiàn)數(shù)據(jù)的傳遞。本發(fā)明利用了計(jì)算機(jī)多核并行計(jì)算的優(yōu)勢(shì),充分均衡的利用高性能計(jì)算機(jī)的計(jì)算資源,構(gòu)架出高效高可靠性的自然語(yǔ)言平臺(tái),本發(fā)明的HTTP接口、C++語(yǔ)言和python的接口,提供方便在接口方面的調(diào)用,支持多平臺(tái)的調(diào)用,具有很好的工程應(yīng)用價(jià)值。
【IPC分類(lèi)】G06F17/28, G06F9/44
【公開(kāi)號(hào)】CN105183470
【申請(qǐng)?zhí)枴緾N201510557337
【發(fā)明人】吳含前, 劉桐仁, 姚莉, 李露
【申請(qǐng)人】東南大學(xué)
【公開(kāi)日】2015年12月23日
【申請(qǐng)日】2015年9月6日