本發(fā)明涉及流式計(jì)算技術(shù)領(lǐng)域,尤其涉及一種用于流式計(jì)算系統(tǒng)中的故障處理技術(shù)。
背景技術(shù):
目前而言,常見流式計(jì)算系統(tǒng)提供計(jì)算結(jié)果到傳輸系統(tǒng)三種可選語義:
1)至多一次(at most once):保證計(jì)算結(jié)果在計(jì)算過程中遇到節(jié)點(diǎn)故障后,計(jì)算恢復(fù)前后結(jié)算結(jié)果至多發(fā)送到傳輸系統(tǒng)一次。
2)至少一次(at least once):保證計(jì)算結(jié)果在計(jì)算過程中遇到節(jié)點(diǎn)故障后,計(jì)算恢復(fù)前后結(jié)算結(jié)果至少發(fā)送到傳輸系統(tǒng)一次。例如Strom。
3)受限的嚴(yán)格一次(exactly once):依賴計(jì)算結(jié)果發(fā)布的存儲支持update冪等功能,且update依據(jù)的key一般由業(yè)務(wù)方指定,實(shí)現(xiàn)計(jì)算結(jié)果直接記入存儲,不再支持結(jié)果繼續(xù)進(jìn)行流式計(jì)算。例如Flink使用Cassandra作為存儲。
至多一次(at most once)或者至少一次(at least once)只是嚴(yán)格一次(exactly once)某一個方面的實(shí)現(xiàn)保證。用戶使用中,只能選擇不重或者不丟來折中業(yè)務(wù)計(jì)算需求。受限的嚴(yán)格一次(exactly once)語義支持計(jì)算結(jié)果發(fā)布update冪等存儲,但是不支持后續(xù)計(jì)算結(jié)果繼續(xù)流式計(jì)算分析等復(fù)雜app級聯(lián)等業(yè)務(wù)場景。
而在很多領(lǐng)域,例如金融、計(jì)費(fèi)、反作弊、廣告等,業(yè)務(wù)場景天然需求數(shù)據(jù)計(jì)算至傳輸都保證不重不丟,以滿足精準(zhǔn)的數(shù)據(jù)完整性需求,同時有復(fù)雜的業(yè)務(wù)計(jì)算場景,計(jì)算結(jié)果簡單存入update冪等存儲不能滿足需求。為此,用戶需要在業(yè)務(wù)層增加額外復(fù)雜的數(shù)據(jù)重放及校驗(yàn)去重邏輯來保證計(jì)算數(shù)據(jù)結(jié)果的不重不丟,但是此方案對用戶要求很高,極易出現(xiàn)數(shù)據(jù)不一致等問題,增大了用戶的開發(fā)成本。而且,此種方案用戶間無法復(fù)用,無法形成流式計(jì)算框架層通用邏輯。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是提供一種用于流式計(jì)算系統(tǒng)中的故障處理的方法、裝置、計(jì)算節(jié)點(diǎn)和計(jì)算機(jī)程序產(chǎn)品。
根據(jù)本發(fā)明的一個方面,提供了一種用于流式計(jì)算系統(tǒng)中的故障處理方法,其中,在一個計(jì)算節(jié)點(diǎn),該方法包括以下步驟:
-記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序;
-將所述各原始數(shù)據(jù)按照預(yù)定的周期進(jìn)行持久化操作;
-當(dāng)發(fā)生故障而重啟后,按照所記錄的到達(dá)順序從經(jīng)持久化操作的原始數(shù)據(jù)和/或所述上游計(jì)算節(jié)點(diǎn)恢復(fù)內(nèi)存中的待計(jì)算數(shù)據(jù),并將所恢復(fù)的待計(jì)算數(shù)據(jù)按照其之前的到達(dá)順序進(jìn)行重放和計(jì)算;
-將每條計(jì)算完畢的結(jié)果數(shù)據(jù)按照故障前上一持久化操作周期的結(jié)果數(shù)據(jù)的偏移量繼續(xù)編碼并發(fā)送至下一節(jié)點(diǎn)。
根據(jù)本發(fā)明的一個方面,還提供了一種用于流式計(jì)算系統(tǒng)中的故障處理裝置,其中,故障處理裝置被布置于所述流式計(jì)算系統(tǒng)中的一個計(jì)算節(jié)點(diǎn)中,該故障處理裝置包括:
用于記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序的裝置;
用于將所述各原始數(shù)據(jù)按照預(yù)定的周期進(jìn)行持久化操作的裝置;
用于當(dāng)發(fā)生故障而重啟后,按照所記錄的到達(dá)順序從經(jīng)持久化操作的原始數(shù)據(jù)和/或所述上游計(jì)算節(jié)點(diǎn)恢復(fù)內(nèi)存中的待計(jì)算數(shù)據(jù),并將所恢復(fù)的待計(jì)算數(shù)據(jù)按照其之前的到達(dá)順序進(jìn)行重放和計(jì)算的裝置;
用于將每條計(jì)算完畢的結(jié)果數(shù)據(jù)按照故障前上一持久化操作周期的結(jié)果數(shù)據(jù)的偏移量繼續(xù)編碼并發(fā)送至下一節(jié)點(diǎn)的裝置。
根據(jù)本發(fā)明的一個方面,還提供了一種流式計(jì)算系統(tǒng)中的計(jì)算節(jié)點(diǎn),其中,該計(jì)算節(jié)點(diǎn)包括上述如根據(jù)本發(fā)明的一個方面所提供的一種用于流式計(jì)算系統(tǒng)中的故障處理裝置。
根據(jù)本發(fā)明的一個方面,還提供了一種流式計(jì)算系統(tǒng)中的計(jì)算節(jié)點(diǎn),其中,該計(jì)算節(jié)點(diǎn)包括存儲器和處理器,其中,所述存儲器中存儲有計(jì)算機(jī)程序指令,當(dāng)所述處理器運(yùn)行所述計(jì)算機(jī)程序指令時,上述如根據(jù)本發(fā)明的一個方面所提供的一種用于流式計(jì)算系統(tǒng)中的故障處理方法被執(zhí)行。
根據(jù)本發(fā)明的一個方面,還提供了一種計(jì)算機(jī)程序產(chǎn)品,所述計(jì)算機(jī)程序產(chǎn)品可以在流式計(jì)算系統(tǒng)中的計(jì)算節(jié)點(diǎn)中運(yùn)行,當(dāng)所述計(jì)算機(jī)程序產(chǎn)品被運(yùn)行時,上述如根據(jù)本發(fā)明的一個方面所提供的一種用于流式計(jì)算系統(tǒng)中的故障處理方法被執(zhí)行。
與現(xiàn)有技術(shù)相比,本發(fā)明提供了一種在框架層實(shí)現(xiàn)的流式計(jì)算輸出結(jié)果不重不丟的容錯機(jī)制,通過流式計(jì)算系統(tǒng)的定期checkpoint機(jī)制、下游節(jié)點(diǎn)按發(fā)布偏移量去重以及“數(shù)據(jù)有序重放”機(jī)制,可應(yīng)對各種軟硬件故障,保證輸出結(jié)果的高準(zhǔn)確性。本發(fā)明可廣泛應(yīng)用于對流式計(jì)算有嚴(yán)格不重不丟語義的領(lǐng)域,例如廣告、金融、反作弊等。
在流式計(jì)算框架完成的實(shí)現(xiàn),對用戶透明,即用戶通過使用本發(fā)明,無需額外開發(fā)或操作即可保證計(jì)算結(jié)果的高準(zhǔn)確性。
本發(fā)明無需用戶在業(yè)務(wù)層代碼增加額外復(fù)雜數(shù)據(jù)重放或校驗(yàn)邏輯即可保證計(jì)算數(shù)據(jù)結(jié)果的exactly once語義,降低了用戶程序開發(fā)的復(fù)雜度,提高數(shù)據(jù)的準(zhǔn)確性,拓寬了流式計(jì)算的應(yīng)用場景。
附圖說明
通過閱讀參照以下附圖所作的對非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會變得更明顯:
圖1示出根據(jù)本發(fā)明一個實(shí)施例的一種用于流式計(jì)算系統(tǒng)的故障處理方法的流程圖;
圖2示出根據(jù)本發(fā)明一個實(shí)施例的一種用于流式計(jì)算系統(tǒng)的故障處理裝置的示意圖。
附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。
具體實(shí)施方式
在更加詳細(xì)地討論示例性實(shí)施例之前應(yīng)當(dāng)提到的是,一些示例性實(shí)施例被描述成作為流程圖描繪的處理或方法。雖然流程圖將各項(xiàng)操作描述成順序的處理,但是其中的許多操作可以被并行地、并發(fā)地或者同時實(shí)施。此外,各項(xiàng)操作的順序可以被重新安排。當(dāng)其操作完成時所述處理可以被終止,但是還可以具有未包括在附圖中的附加步驟。所述處理可以對應(yīng)于方法、函數(shù)、規(guī)程、子例程、子程序等等。
在上下文中所稱“計(jì)算機(jī)設(shè)備”,也稱為“電腦”,是指可以通過運(yùn)行預(yù)定程序或指令來執(zhí)行數(shù)值計(jì)算和/或邏輯計(jì)算等預(yù)定處理過程的智能電子設(shè)備,其可以包括處理器與存儲器,由處理器執(zhí)行在存儲器中預(yù)存的程序指令來執(zhí)行預(yù)定處理過程,或是由ASIC、FPGA、DSP等硬件執(zhí)行預(yù)定處理過程,或是由上述二者組合來實(shí)現(xiàn)。計(jì)算機(jī)設(shè)備包括但不限于服務(wù)器、個人電腦(PC)、筆記本電腦、平板電腦、智能手機(jī)等。
所述計(jì)算機(jī)設(shè)備例如包括用戶設(shè)備與網(wǎng)絡(luò)設(shè)備。其中,所述用戶設(shè)備包括但不限于個人電腦(PC)、筆記本電腦、移動終端等,所述移動終端包括但不限于智能手機(jī)、PDA等;所述網(wǎng)絡(luò)設(shè)備包括但不限于單個網(wǎng)絡(luò)服務(wù)器、多個網(wǎng)絡(luò)服務(wù)器組成的服務(wù)器組或基于云計(jì)算(Cloud Computing)的由大量計(jì)算機(jī)或網(wǎng)絡(luò)服務(wù)器構(gòu)成的云,其中,云計(jì)算是分布式計(jì)算的一種,由一群松散耦合的計(jì)算機(jī)集組成的一個超級虛擬計(jì)算機(jī)。其中,所述計(jì)算機(jī)設(shè)備可單獨(dú)運(yùn)行來實(shí)現(xiàn)本發(fā)明,也可接入網(wǎng)絡(luò)并通過與網(wǎng)絡(luò)中的其他計(jì)算機(jī)設(shè)備的交互操作來實(shí)現(xiàn)本發(fā)明。其中,所述計(jì)算機(jī)設(shè)備所處的網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、VPN網(wǎng)絡(luò)等。
需要說明的是,所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備和網(wǎng)絡(luò)等僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的計(jì)算機(jī)設(shè)備或網(wǎng)絡(luò)如可適用于本發(fā)明,也應(yīng)包含在本發(fā)明保護(hù)范圍以內(nèi),并以引用方式包含于此。
本文后面所討論的方法(其中一些通過流程圖示出)可以通過硬件、軟件、固件、中間件、微代碼、硬件描述語言或者其任意組合來實(shí)施。當(dāng)用軟件、固件、中間件或微代碼來實(shí)施時,用以實(shí)施必要任務(wù)的程序代碼或代碼段可以被存儲在機(jī)器或計(jì)算機(jī)可讀介質(zhì)(比如存儲介質(zhì))中。(一個或多個)處理器可以實(shí)施必要的任務(wù)。
這里所公開的具體結(jié)構(gòu)和功能細(xì)節(jié)僅僅是代表性的,并且是用于描述本發(fā)明的示例性實(shí)施例的目的。但是本發(fā)明可以通過許多替換形式來具體實(shí)現(xiàn),并且不應(yīng)當(dāng)被解釋成僅僅受限于這里所闡述的實(shí)施例。
應(yīng)當(dāng)理解的是,雖然在這里可能使用了術(shù)語“第一”、“第二”等等來描述各個單元,但是這些單元不應(yīng)當(dāng)受這些術(shù)語限制。使用這些術(shù)語僅僅是為了將一個單元與另一個單元進(jìn)行區(qū)分。舉例來說,在不背離示例性實(shí)施例的范圍的情況下,第一單元可以被稱為第二單元,并且類似地第二單元可以被稱為第一單元。這里所使用的術(shù)語“和/或”包括其中一個或更多所列出的相關(guān)聯(lián)項(xiàng)目的任意和所有組合。
應(yīng)當(dāng)理解的是,當(dāng)一個單元被稱為“連接”或“耦合”到另一單元時,其可以直接連接或耦合到所述另一單元,或者可以存在中間單元。與此相對,當(dāng)一個單元被稱為“直接連接”或“直接耦合”到另一單元時,則不存在中間單元。應(yīng)當(dāng)按照類似的方式來解釋被用于描述單元之間的關(guān)系的其他詞語(例如“處于...之間”相比于“直接處于...之間”,“與...鄰近”相比于“與...直接鄰近”等等)。
這里所使用的術(shù)語僅僅是為了描述具體實(shí)施例而不意圖限制示例性實(shí)施例。除非上下文明確地另有所指,否則這里所使用的單數(shù)形式“一個”、“一項(xiàng)”還意圖包括復(fù)數(shù)。還應(yīng)當(dāng)理解的是,這里所使用的術(shù)語“包括”和/或“包含”規(guī)定所陳述的特征、整數(shù)、步驟、操作、單元和/或組件的存在,而不排除存在或添加一個或更多其他特征、整數(shù)、步驟、操作、單元、組件和/或其組合。
還應(yīng)當(dāng)提到的是,在一些替換實(shí)現(xiàn)方式中,所提到的功能/動作可以按照不同于附圖中標(biāo)示的順序發(fā)生。舉例來說,取決于所涉及的功能/動作,相繼示出的兩幅圖實(shí)際上可以基本上同時執(zhí)行或者有時可以按照相反的順序來執(zhí)行。
本發(fā)明適用于流式計(jì)算系統(tǒng)。流式計(jì)算系統(tǒng)是一種分布式計(jì)算系統(tǒng),其中包括多級計(jì)算節(jié)點(diǎn),每一級也可以有多個計(jì)算節(jié)點(diǎn)。每個計(jì)算節(jié)點(diǎn)按照其所分配的計(jì)算任務(wù)對來自上游節(jié)點(diǎn)的原始數(shù)據(jù)進(jìn)行計(jì)算,并將計(jì)算所獲得的結(jié)果數(shù)據(jù)發(fā)送至下游節(jié)點(diǎn)。
典型地,流式計(jì)算系統(tǒng)向下游傳輸系統(tǒng)輸出結(jié)果數(shù)據(jù)。因此,對于流式計(jì)算系統(tǒng)中的最后一級計(jì)算節(jié)點(diǎn)而言,其下游節(jié)點(diǎn)即為傳輸系統(tǒng)。
具體地,本發(fā)明主要通過流式計(jì)算系統(tǒng)的定期checkpoint機(jī)制、下游節(jié)點(diǎn)按結(jié)果數(shù)據(jù)的發(fā)布偏移量去重以及對恢復(fù)數(shù)據(jù)的“數(shù)據(jù)有序重放”機(jī)制,提供了一種在流式計(jì)算中數(shù)據(jù)計(jì)算結(jié)果高準(zhǔn)確性保證。根據(jù)本發(fā)明的方案,用戶可保證數(shù)據(jù)結(jié)果的exactly once語義,不再需要在業(yè)務(wù)層增加額外復(fù)雜數(shù)據(jù)重放或校驗(yàn)邏輯來保證計(jì)算數(shù)據(jù)結(jié)果的不重不丟。
下面結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)描述。
圖1示出根據(jù)本發(fā)明的一個實(shí)施例,其中具體示出一種用于流式計(jì)算系統(tǒng)的故障處理方法的流程圖。
該故障處理方法可以用于流式計(jì)算系統(tǒng)中的任一個計(jì)算節(jié)點(diǎn)。典型地,該故障處理方法可以用于流式計(jì)算系統(tǒng)中的最后一級計(jì)算節(jié)點(diǎn)。
如圖1所示,在步驟S1中,計(jì)算節(jié)點(diǎn)記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序;在步驟S2中,計(jì)算節(jié)點(diǎn)將所接收的各原始數(shù)據(jù)按照預(yù)定的周期進(jìn)行持久化操作;在步驟S3中,當(dāng)發(fā)生故障而重啟后,計(jì)算節(jié)點(diǎn)按照所記錄的到達(dá)順序從經(jīng)持久化操作的原始數(shù)據(jù)和/或所述上游計(jì)算節(jié)點(diǎn)恢復(fù)內(nèi)存中的待計(jì)算數(shù)據(jù),并將所恢復(fù)的待計(jì)算數(shù)據(jù)按照其之前的到達(dá)順序進(jìn)行重放和計(jì)算;在步驟S4中,計(jì)算節(jié)點(diǎn)將每條計(jì)算完畢的結(jié)果數(shù)據(jù)按照故障前上一持久化操作周期的結(jié)果數(shù)據(jù)的偏移量繼續(xù)編碼并發(fā)送至下一節(jié)點(diǎn)。
具體地,在步驟S1中,計(jì)算節(jié)點(diǎn)記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序。
在此,本發(fā)明為了實(shí)現(xiàn)“嚴(yán)格一次(exactly once)”的語義,需要計(jì)算節(jié)點(diǎn)記錄每條原始數(shù)據(jù)的到達(dá)順序,以當(dāng)該計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,可以按照每條原始數(shù)據(jù)的到達(dá)順序來恢復(fù)和嚴(yán)格重放(replay)。
據(jù)此,本發(fā)明為計(jì)算節(jié)點(diǎn)定義了一項(xiàng)新的功能,即:記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序。
并且,為了在故障恢復(fù)時,計(jì)算節(jié)點(diǎn)能夠獲得各原始數(shù)據(jù)的到達(dá)順序,計(jì)算節(jié)點(diǎn)不僅在本地記錄上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序,并在從上游獲取到原始數(shù)據(jù)后即同步地將原始數(shù)據(jù)的到達(dá)順序記錄至外部存儲系統(tǒng)中,如存入checkpoint機(jī)制中的外部分布式存儲系統(tǒng)HBase,以避免部分順序數(shù)據(jù)缺失。
隨后,在步驟S2中,計(jì)算節(jié)點(diǎn)將所接收的各原始數(shù)據(jù)按照預(yù)定的周期進(jìn)行持久化操作。
優(yōu)選地,計(jì)算節(jié)點(diǎn)對原始數(shù)據(jù)的持久化操作通過checkpoint機(jī)制來按照預(yù)定的周期執(zhí)行。
計(jì)算節(jié)點(diǎn)將所接收到的各原始數(shù)據(jù)定期checkpoint到外部的分布式存儲系統(tǒng),如HBase,從而實(shí)現(xiàn)對原始數(shù)據(jù)的持久化操作。
此外,由于計(jì)算節(jié)點(diǎn)的內(nèi)存中也緩存有這些原始數(shù)據(jù),以用于實(shí)時計(jì)算,從而checkpoint僅作為故障恢復(fù)的保障,以當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障重啟后可以從checkpoint的原始數(shù)據(jù)中恢復(fù)相關(guān)原始數(shù)據(jù)。這在保證節(jié)點(diǎn)故障前后內(nèi)存中待計(jì)算數(shù)據(jù)不會丟失的同時,也顯著減少了對HBase的讀操作,提高了系統(tǒng)的處理效率。
接著,在步驟S3中,當(dāng)發(fā)生故障而重啟后,計(jì)算節(jié)點(diǎn)按照所記錄的到達(dá)順序從經(jīng)持久化操作的原始數(shù)據(jù)和/或所述上游計(jì)算節(jié)點(diǎn)恢復(fù)內(nèi)存中的待計(jì)算數(shù)據(jù),并將所恢復(fù)的待計(jì)算數(shù)據(jù)按照其之前的到達(dá)順序進(jìn)行重放和計(jì)算。
在此,本發(fā)明為了實(shí)現(xiàn)結(jié)果數(shù)據(jù)的“不重不丟”,當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,該故障節(jié)點(diǎn)例如從checkpoint點(diǎn)恢復(fù)上一周期的原始數(shù)據(jù),并將所恢復(fù)的原始數(shù)據(jù)的到達(dá)順序與故障節(jié)點(diǎn)在各原始數(shù)據(jù)到達(dá)時所記錄的順序進(jìn)行比較,以確定是否尚有丟失數(shù)據(jù):如果是,則確定丟失數(shù)據(jù)的到達(dá)順序及其來源的上游計(jì)算節(jié)點(diǎn),以從這些上游計(jì)算節(jié)點(diǎn)重新請求這些丟失數(shù)據(jù);如果否,則可從checkpoint恢復(fù)之前內(nèi)存中的所有計(jì)算數(shù)據(jù)。在另一種更極端的情形下,從checkpoint恢復(fù)的原始數(shù)據(jù)中可能并無任何故障前的內(nèi)存計(jì)算數(shù)據(jù)。也即,在上一次checkpoint周期之后,計(jì)算節(jié)點(diǎn)即發(fā)生故障,內(nèi)存中的所有計(jì)算數(shù)據(jù)均未做checkpoint。對于此種情形,內(nèi)存中的所有丟失數(shù)據(jù)同樣可以通過向來源的上游計(jì)算節(jié)點(diǎn)重新請求而獲得。根據(jù)前述的這些方式,故障節(jié)點(diǎn)可以恢復(fù)故障前內(nèi)存中的所有計(jì)算數(shù)據(jù),以對這些數(shù)據(jù)按照之前到達(dá)該故障節(jié)點(diǎn)的順序進(jìn)行嚴(yán)格重放和計(jì)算,否則會帶來計(jì)算數(shù)據(jù)的錯亂引發(fā)數(shù)據(jù)的丟失或重復(fù)。
由于當(dāng)故障發(fā)生時,計(jì)算節(jié)點(diǎn)內(nèi)存中的原始數(shù)據(jù)并非是全部未處理的,而是已處理了一部分,但仍有一部分未處理,為了保證數(shù)據(jù)處理的準(zhǔn)確性,故障節(jié)點(diǎn)從checkpoint恢復(fù)上一周期的全部原始數(shù)據(jù),并從上游計(jì)算節(jié)點(diǎn)重新請求其他丟失數(shù)據(jù)(即尚未來得及做checkpoint的原始數(shù)據(jù)),進(jìn)而對所恢復(fù)的這些待計(jì)算數(shù)據(jù)(包括從checkpoint恢復(fù)的原始數(shù)據(jù)和從上游計(jì)算節(jié)點(diǎn)重新請求的丟失數(shù)據(jù))按照其之前的到達(dá)順序進(jìn)行嚴(yán)格重放和計(jì)算,以重新獲得相應(yīng)的結(jié)果數(shù)據(jù)。并且,只有在這些故障恢復(fù)數(shù)據(jù)嚴(yán)格按照故障前順序重放和計(jì)算后,新數(shù)據(jù)才會到達(dá),保證了故障數(shù)據(jù)有序重放需求。
隨后,在步驟S4中,計(jì)算節(jié)點(diǎn)將每條計(jì)算完畢的結(jié)果數(shù)據(jù)按照故障前上一持久化操作周期的結(jié)果數(shù)據(jù)的偏移量繼續(xù)編碼并發(fā)送至下一節(jié)點(diǎn)。
在此,本發(fā)明為了保證每條結(jié)果數(shù)據(jù)的全局唯一和編碼一致,會將計(jì)算節(jié)點(diǎn)重啟后重新計(jì)算的結(jié)果數(shù)據(jù)按照上一checkpoint周期的編碼偏移量進(jìn)度信息,繼續(xù)編碼。因此,當(dāng)發(fā)生故障而重啟后,計(jì)算節(jié)點(diǎn)可以從checkpoint點(diǎn)恢復(fù)上一周期的結(jié)果數(shù)據(jù)的偏移量進(jìn)度信息。也即,計(jì)算節(jié)點(diǎn)不僅周期性地將所接收的原始數(shù)據(jù)checkpoint到HBase,還將相應(yīng)周期的結(jié)果數(shù)據(jù)的偏移量進(jìn)度信息也做checkpoint。
編碼過程中,結(jié)合數(shù)據(jù)嚴(yán)格重放功能,計(jì)算節(jié)點(diǎn)保證每條計(jì)算完畢的結(jié)果數(shù)據(jù)發(fā)送到下游節(jié)點(diǎn)時攜帶的偏移量編碼嚴(yán)格一致,即故障前后編碼冪等,保證下游節(jié)點(diǎn)的去重機(jī)制準(zhǔn)確生效。
例如,計(jì)算節(jié)點(diǎn)根據(jù)故障前上一持久化操作周期(上一checkpoint周期)的結(jié)果數(shù)據(jù)的偏移量進(jìn)度信息,確定重啟后第一條計(jì)算完畢的結(jié)果數(shù)據(jù)的編碼偏移量。
在此,當(dāng)前計(jì)算節(jié)點(diǎn)的下一節(jié)點(diǎn)可以是當(dāng)前計(jì)算節(jié)點(diǎn)的下級計(jì)算節(jié)點(diǎn)。如果當(dāng)前計(jì)算節(jié)點(diǎn)是流式計(jì)算系統(tǒng)的最后一級計(jì)算節(jié)點(diǎn),則將結(jié)果數(shù)據(jù)傳遞至外部傳輸系統(tǒng)。
當(dāng)下一節(jié)點(diǎn)接收到結(jié)果數(shù)據(jù)后,其將所接收到的結(jié)果數(shù)據(jù)的編碼偏移量與其已接收到的結(jié)果數(shù)據(jù)的編碼偏移量進(jìn)行比較,以對結(jié)果數(shù)據(jù)進(jìn)行去重。
例如,傳輸系統(tǒng)使用偏移量去重機(jī)制,保證在上游計(jì)算節(jié)點(diǎn)故障重啟后,將上游計(jì)算節(jié)點(diǎn)發(fā)布數(shù)據(jù)中攜帶的偏移量信息與傳輸系統(tǒng)內(nèi)部已接收到的數(shù)據(jù)的偏移量進(jìn)行比較,完成重復(fù)數(shù)據(jù)的過濾去除功能,實(shí)現(xiàn)了計(jì)算結(jié)果發(fā)布至傳輸系統(tǒng)的不重特性。對重復(fù)數(shù)據(jù)的過濾去除功能,實(shí)現(xiàn)了計(jì)算結(jié)果發(fā)布至傳輸系統(tǒng)的不重特性。
圖2示出根據(jù)本發(fā)明的一個實(shí)施例,其中具體示出一種用于流式計(jì)算系統(tǒng)的故障處理裝置的示意圖。
該故障處理裝置可以布置于流式計(jì)算系統(tǒng)中的任一個計(jì)算節(jié)點(diǎn)。典型地,該故障處理裝置可以布置于流式計(jì)算系統(tǒng)中的最后一級計(jì)算節(jié)點(diǎn)。
如圖2所示,故障處理裝置20具體包括順序記錄裝置21、數(shù)據(jù)持久化裝置22、數(shù)據(jù)重放裝置23和數(shù)據(jù)編碼裝置24。
其中,順序記錄裝置21記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序;隨后,數(shù)據(jù)持久化裝置22將所接收的各原始數(shù)據(jù)按照預(yù)定的周期進(jìn)行持久化操作;接著,當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,數(shù)據(jù)重放裝置23按照所記錄的到達(dá)順序從經(jīng)持久化操作的原始數(shù)據(jù)和/或所述上游計(jì)算節(jié)點(diǎn)恢復(fù)內(nèi)存中的待計(jì)算數(shù)據(jù),并將所恢復(fù)的待計(jì)算數(shù)據(jù)按照其之前的到達(dá)順序進(jìn)行重放和計(jì)算;隨后,數(shù)據(jù)編碼裝置24將每條計(jì)算完畢的結(jié)果數(shù)據(jù)按照故障前上一持久化操作周期的結(jié)果數(shù)據(jù)的偏移量繼續(xù)編碼并發(fā)送至下一節(jié)點(diǎn)。
具體地,順序記錄裝置21記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序。
在此,本發(fā)明為了實(shí)現(xiàn)“嚴(yán)格一次(exactly once)”的語義,需要順序記錄裝置21記錄每條原始數(shù)據(jù)的到達(dá)順序,以當(dāng)該計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,可以按照每條原始數(shù)據(jù)的到達(dá)順序來恢復(fù)和嚴(yán)格重放(replay)。
據(jù)此,本發(fā)明為計(jì)算節(jié)點(diǎn)定義了一項(xiàng)新的功能,即:由順序記錄裝置21記錄來自上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序。
并且,為了在故障恢復(fù)時,計(jì)算節(jié)點(diǎn)能夠獲得各原始數(shù)據(jù)的到達(dá)順序,計(jì)算節(jié)點(diǎn)不僅在本地記錄上游計(jì)算節(jié)點(diǎn)的各原始數(shù)據(jù)的到達(dá)順序,并在從上游獲取到原始數(shù)據(jù)后即同步地將原始數(shù)據(jù)的到達(dá)順序記錄至外部存儲系統(tǒng)中,如存入checkpoint機(jī)制中的外部分布式存儲系統(tǒng)HBase,以避免部分順序數(shù)據(jù)缺失。
隨后,數(shù)據(jù)持久化裝置22將所接收的各原始數(shù)據(jù)按照預(yù)定的周期進(jìn)行持久化操作。
優(yōu)選地,數(shù)據(jù)持久化裝置22對原始數(shù)據(jù)的持久化操作通過checkpoint機(jī)制來按照預(yù)定的周期執(zhí)行。
數(shù)據(jù)持久化裝置22將計(jì)算節(jié)點(diǎn)所接收到的各原始數(shù)據(jù)定期checkpoint到外部的分布式存儲系統(tǒng),如HBase,從而實(shí)現(xiàn)對原始數(shù)據(jù)的持久化操作。
此外,由于計(jì)算節(jié)點(diǎn)的內(nèi)存中也緩存有這些原始數(shù)據(jù),以用于實(shí)時計(jì)算,從而checkpoint僅作為故障恢復(fù)的保障,以當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障重啟后,數(shù)據(jù)重放裝置23可以從checkpoint的原始數(shù)據(jù)中恢復(fù)相關(guān)原始數(shù)據(jù)。這在保證節(jié)點(diǎn)故障前后內(nèi)存中待計(jì)算數(shù)據(jù)不會丟失的同時,也顯著減少了對HBase的讀操作,提高了系統(tǒng)的處理效率。
接著,當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,數(shù)據(jù)重放裝置23按照所記錄的到達(dá)順序從經(jīng)持久化操作的原始數(shù)據(jù)和/或所述上游計(jì)算節(jié)點(diǎn)恢復(fù)內(nèi)存中的待計(jì)算數(shù)據(jù),并將所恢復(fù)的待計(jì)算數(shù)據(jù)按照其之前的到達(dá)順序進(jìn)行重放和計(jì)算。
在此,本發(fā)明為了實(shí)現(xiàn)結(jié)果數(shù)據(jù)的“不重不丟”,當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,數(shù)據(jù)重放裝置23例如從checkpoint點(diǎn)恢復(fù)上一周期的原始數(shù)據(jù),并將所恢復(fù)的原始數(shù)據(jù)的到達(dá)順序與故障節(jié)點(diǎn)在各原始數(shù)據(jù)到達(dá)時所記錄的順序進(jìn)行比較,以確定是否尚有丟失數(shù)據(jù):如果是,則確定丟失數(shù)據(jù)的到達(dá)順序及其來源的上游計(jì)算節(jié)點(diǎn),以從這些上游計(jì)算節(jié)點(diǎn)重新請求這些丟失數(shù)據(jù);如果否,則可從checkpoint恢復(fù)之前內(nèi)存中的所有計(jì)算數(shù)據(jù)。在另一種更極端的情形下,從checkpoint恢復(fù)的原始數(shù)據(jù)中可能并無任何故障前的內(nèi)存計(jì)算數(shù)據(jù)。也即,在上一次checkpoint周期之后,計(jì)算節(jié)點(diǎn)即發(fā)生故障,內(nèi)存中的所有計(jì)算數(shù)據(jù)均未做checkpoint。對于此種情形,內(nèi)存中的所有丟失數(shù)據(jù)同樣可以通過向來源的上游計(jì)算節(jié)點(diǎn)重新請求而獲得。根據(jù)前述的這些方式,故障節(jié)點(diǎn)可以恢復(fù)故障前內(nèi)存中的所有計(jì)算數(shù)據(jù),以對這些數(shù)據(jù)按照之前到達(dá)該故障節(jié)點(diǎn)的順序進(jìn)行嚴(yán)格重放和計(jì)算,否則會帶來計(jì)算數(shù)據(jù)的錯亂引發(fā)數(shù)據(jù)的丟失或重復(fù)。
由于當(dāng)故障發(fā)生時,計(jì)算節(jié)點(diǎn)內(nèi)存中的原始數(shù)據(jù)并非是全部未處理的,而是已處理了一部分,但仍有一部分未處理,為了保證數(shù)據(jù)處理的準(zhǔn)確性,數(shù)據(jù)重放裝置23從checkpoint恢復(fù)上一周期的全部原始數(shù)據(jù),并從上游計(jì)算節(jié)點(diǎn)重新請求其他丟失數(shù)據(jù)(即尚未來得及做checkpoint的原始數(shù)據(jù)),進(jìn)而對所恢復(fù)的這些待計(jì)算數(shù)據(jù)(包括從checkpoint恢復(fù)的原始數(shù)據(jù)和從上游計(jì)算節(jié)點(diǎn)重新請求的丟失數(shù)據(jù))按照其之前的到達(dá)順序進(jìn)行嚴(yán)格重放和計(jì)算,以重新獲得相應(yīng)的結(jié)果數(shù)據(jù)。并且,只有在這些故障恢復(fù)數(shù)據(jù)嚴(yán)格按照故障前順序重放和計(jì)算后,新數(shù)據(jù)才會到達(dá),保證了故障數(shù)據(jù)有序重放需求。
隨后,數(shù)據(jù)編碼裝置24將每條計(jì)算完畢的結(jié)果數(shù)據(jù)按照故障前上一持久化操作周期的結(jié)果數(shù)據(jù)的偏移量繼續(xù)編碼并發(fā)送至下一節(jié)點(diǎn)。
在此,本發(fā)明為了保證每條結(jié)果數(shù)據(jù)的全局唯一和編碼一致,會將計(jì)算節(jié)點(diǎn)重啟后數(shù)據(jù)重放裝置23重新計(jì)算的結(jié)果數(shù)據(jù)按照上一checkpoint周期的編碼偏移量進(jìn)度信息,繼續(xù)編碼。因此,當(dāng)計(jì)算節(jié)點(diǎn)發(fā)生故障而重啟后,數(shù)據(jù)編碼裝置24可以從checkpoint點(diǎn)恢復(fù)上一周期的結(jié)果數(shù)據(jù)的偏移量進(jìn)度信息。也即,數(shù)據(jù)持久化裝置22不僅周期性地將計(jì)算節(jié)點(diǎn)所接收的原始數(shù)據(jù)checkpoint到HBase,還將相應(yīng)周期的結(jié)果數(shù)據(jù)的偏移量進(jìn)度信息也做checkpoint。
編碼過程中,結(jié)合數(shù)據(jù)嚴(yán)格重放功能,數(shù)據(jù)編碼裝置24保證每條計(jì)算完畢的結(jié)果數(shù)據(jù)發(fā)送到下游節(jié)點(diǎn)時攜帶的偏移量編碼嚴(yán)格一致,即故障前后編碼冪等,保證下游節(jié)點(diǎn)的去重機(jī)制準(zhǔn)確生效。
例如,數(shù)據(jù)編碼裝置24根據(jù)故障前上一持久化操作周期(上一checkpoint周期)的結(jié)果數(shù)據(jù)的偏移量進(jìn)度信息,確定重啟后第一條計(jì)算完畢的結(jié)果數(shù)據(jù)的編碼偏移量。
在此,當(dāng)前計(jì)算節(jié)點(diǎn)的下一節(jié)點(diǎn)可以是當(dāng)前計(jì)算節(jié)點(diǎn)的下級計(jì)算節(jié)點(diǎn)。如果當(dāng)前計(jì)算節(jié)點(diǎn)是流式計(jì)算系統(tǒng)的最后一級計(jì)算節(jié)點(diǎn),則將結(jié)果數(shù)據(jù)傳遞至外部傳輸系統(tǒng)。
當(dāng)下一節(jié)點(diǎn)接收到結(jié)果數(shù)據(jù)后,其將所接收到的結(jié)果數(shù)據(jù)的編碼偏移量與其已接收到的結(jié)果數(shù)據(jù)的編碼偏移量進(jìn)行比較,以對結(jié)果數(shù)據(jù)進(jìn)行去重。
例如,傳輸系統(tǒng)使用偏移量去重機(jī)制,保證在上游計(jì)算節(jié)點(diǎn)故障重啟后,將上游計(jì)算節(jié)點(diǎn)發(fā)布數(shù)據(jù)中攜帶的偏移量信息與傳輸系統(tǒng)內(nèi)部已接收到的數(shù)據(jù)的偏移量進(jìn)行比較,完成重復(fù)數(shù)據(jù)的過濾去除功能,實(shí)現(xiàn)了計(jì)算結(jié)果發(fā)布至傳輸系統(tǒng)的不重特性。對重復(fù)數(shù)據(jù)的過濾去除功能,實(shí)現(xiàn)了計(jì)算結(jié)果發(fā)布至傳輸系統(tǒng)的不重特性。
需要注意的是,本發(fā)明可在軟件和/或軟件與硬件的組合體中被實(shí)施,例如,本發(fā)明的各個裝置可采用專用集成電路(ASIC)或任何其他類似硬件設(shè)備來實(shí)現(xiàn)。在一個實(shí)施例中,本發(fā)明的軟件程序可以通過處理器執(zhí)行以實(shí)現(xiàn)上文所述步驟或功能。同樣地,本發(fā)明的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲到計(jì)算機(jī)可讀記錄介質(zhì)中,例如,RAM存儲器,磁或光驅(qū)動器或軟磁盤及類似設(shè)備。另外,本發(fā)明的一些步驟或功能可采用硬件來實(shí)現(xiàn),例如,作為與處理器配合從而執(zhí)行各個步驟或功能的電路。
對于本領(lǐng)域技術(shù)人員而言,顯然本發(fā)明不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背離本發(fā)明的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本發(fā)明。因此,無論從哪一點(diǎn)來看,均應(yīng)將實(shí)施例看作是示范性的,而且是非限制性的,本發(fā)明的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本發(fā)明內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。系統(tǒng)權(quán)利要求中陳述的多個單元或裝置也可以由一個單元或裝置通過軟件或者硬件來實(shí)現(xiàn)。第一,第二等詞語用來表示名稱,而并不表示任何特定的順序。