一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)系統(tǒng)及方法
【專(zhuān)利摘要】本發(fā)明涉及一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)系統(tǒng)及方法,包括:調(diào)度器、狀態(tài)服務(wù)器、任務(wù)隊(duì)列和任務(wù)操作中心四個(gè)部分。本發(fā)明通過(guò)記錄和狀態(tài)信息的分離存儲(chǔ),使得快照中存儲(chǔ)的狀態(tài)信息減少,在降低數(shù)據(jù)處理的延遲的同時(shí),提供更加輕便快照機(jī)制;通過(guò)數(shù)據(jù)窗口實(shí)現(xiàn)微批次的快照持久化,并通過(guò)雙buffer的存儲(chǔ)結(jié)構(gòu)確保了“恰好一次”的語(yǔ)義保障;不需借助于第三方的集群對(duì)數(shù)據(jù)進(jìn)行管理,在一定程度上降低了網(wǎng)絡(luò)延遲。
【專(zhuān)利說(shuō)明】
一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)系統(tǒng)及方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及一種實(shí)時(shí)流式數(shù)據(jù)處理的失效恢復(fù)系統(tǒng)及方法,尤其涉及一種基于分布式流式處理框架實(shí)現(xiàn)的輕量高效、“恰好一次”的失效恢復(fù)方法,屬于軟件技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002]隨著互聯(lián)網(wǎng)等信息技術(shù)的飛速發(fā)展,導(dǎo)致全球數(shù)據(jù)量急劇增長(zhǎng),針對(duì)這些大數(shù)據(jù)背后隱藏的價(jià)值的挖掘,成為了當(dāng)今時(shí)代的主流。早期出現(xiàn)的批量計(jì)算使用先存儲(chǔ)后計(jì)算的策略,這種方式計(jì)算精準(zhǔn)但是無(wú)法應(yīng)對(duì)實(shí)時(shí)數(shù)據(jù)的要求,流式計(jì)算已成為了解決實(shí)時(shí)數(shù)據(jù)處理的主流應(yīng)用。流式處理框架是一個(gè)處理具有時(shí)序性特征的流式數(shù)據(jù)的數(shù)據(jù)處理框架。一個(gè)好的流式處理框架都會(huì)有圍繞以下兩個(gè)重要屬性的需求,即系統(tǒng)的延遲和系統(tǒng)的高可用性(S Kamburugamuve ,G Fox ,D Leake , J Qiu: Survey of Distributed StreamProcessing for Large Stream Sources ,December 2013)。任何流式處理系統(tǒng)都可能會(huì)出現(xiàn)節(jié)點(diǎn)失效、網(wǎng)絡(luò)失效、軟件錯(cuò)誤以及資源限制(例如:CPU不足,內(nèi)存不足等)等故障情況。如何從故障中快速的恢復(fù)過(guò)來(lái),對(duì)于保障系統(tǒng)的高可用性是極其重要的,因此失效恢復(fù)就顯得尤為重要。目前,實(shí)時(shí)流式數(shù)據(jù)處理系統(tǒng)通過(guò)狀態(tài)備份和失效恢復(fù)策略來(lái)實(shí)現(xiàn)其高可用性,保障系統(tǒng)的容錯(cuò)能力,從而確保流式計(jì)算的流暢性。
[0003]Hwang J H等人(Hwang J H,Balazinska Μ,Rasin A,et al.High-availabilityalgorithms for distributed stream processing[C]//Data Engineering,2005.1CDE2005.Proceedings.21st Internat1nal Conference on.ΙΕΕΕ,2005:779_790.)將故障恢復(fù)類(lèi)型總結(jié)為以下三種:精確恢復(fù)、回滾恢復(fù)、有損恢復(fù)。精確恢復(fù)實(shí)現(xiàn)較為困難而有損恢復(fù)不是理想的結(jié)果,因此一般將回滾恢復(fù)作為失效恢復(fù)的實(shí)現(xiàn)目標(biāo)。崔星燦等人(崔星燦,禹曉輝,劉洋,等.分布式流處理技術(shù)綜述[J].計(jì)算機(jī)研究與發(fā)展,2015,52(2):318-332.)將現(xiàn)有的恢復(fù)方法歸結(jié)為以下三種策略:被動(dòng)等待/上游備份、主動(dòng)等待和同步檢查點(diǎn)。被動(dòng)等待策略是一種異步備份策略,即會(huì)將主節(jié)點(diǎn)上的數(shù)據(jù)周期性的備份到副本節(jié)點(diǎn)上,由于不能保證主節(jié)點(diǎn)發(fā)生故障時(shí)副本節(jié)點(diǎn)與其狀態(tài)一致,因此需要上游備份的支持,重新發(fā)送部分?jǐn)?shù)據(jù)。如果僅通過(guò)上游節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)和重發(fā)來(lái)實(shí)現(xiàn)容錯(cuò),則為上游備份策略。主動(dòng)等待策略中主節(jié)點(diǎn)和副本節(jié)點(diǎn)同時(shí)從上游接收數(shù)據(jù)并以并行的方式向下游傳遞數(shù)據(jù),當(dāng)主節(jié)點(diǎn)出現(xiàn)故障時(shí),副本節(jié)點(diǎn)可以完全接管接下來(lái)的操作,因?yàn)樗椭鞴?jié)點(diǎn)有著相同的系統(tǒng)資源分配。同步檢查點(diǎn)策略同被動(dòng)等待策略相似,唯一不同是主節(jié)點(diǎn)數(shù)據(jù)備份到副本節(jié)點(diǎn)是同步進(jìn)行的。不同的失效恢復(fù)策略都會(huì)在快速恢復(fù)、低延時(shí)以及資源利用上做一個(gè)權(quán)衡。被動(dòng)等待策略有適當(dāng)?shù)馁Y源消耗和處理延遲,但是如果備份的數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)或是磁盤(pán)上,故障恢復(fù)的時(shí)間會(huì)很長(zhǎng);主動(dòng)等待策略雖然能快速恢復(fù),但是占用了大量的系統(tǒng)資源,對(duì)于故障出現(xiàn)較少的情況下會(huì)造成嚴(yán)重的資源浪費(fèi);同步檢查點(diǎn)策略以犧牲處理延遲為代價(jià),保證了快速恢復(fù)和較低的資源占用。
[0004]對(duì)于流式處理框架的失效恢復(fù)的能力可以通過(guò)其對(duì)語(yǔ)義保障的程度來(lái)劃分。一般分為“至多處理一次”(at most once)、“至少處理一次”(at least once)和“恰好一次”(exactly once)。
[0005]現(xiàn)有的流式處理框架所選擇的失效恢復(fù)的策略也是不盡相同的。Apache Storm(http://storm.apache.0rg/)在失效恢復(fù)機(jī)制中采用上游備份策略,通過(guò)使用Spouts提供的唯一標(biāo)識(shí)ID來(lái)保障每個(gè)元組都能在任務(wù)拓?fù)渲斜粓?zhí)行,在恢復(fù)時(shí)只能保障“至少處理一次”的語(yǔ)義執(zhí)行,且其作業(yè)級(jí)容錯(cuò)限制了系統(tǒng)的可擴(kuò)展性。S4采用被動(dòng)等待策略,通過(guò)Apache Zookeeper (https: //zookeeper.apache.0rg/)對(duì)各節(jié)點(diǎn)進(jìn)行協(xié)調(diào),采用了基于檢查點(diǎn)的狀態(tài)恢復(fù)機(jī)制,它會(huì)定期的檢測(cè)PE(處理單元)的狀態(tài),當(dāng)檢測(cè)到失效時(shí),才會(huì)觸發(fā)檢查點(diǎn)來(lái)記錄下當(dāng)前的PE狀態(tài),這種恢復(fù)機(jī)制是滯后的,且只提供部分容錯(cuò),節(jié)點(diǎn)失效轉(zhuǎn)移時(shí)會(huì)丟失內(nèi)存中的狀態(tài)信息O Samza(http: / / samza.apache.0rg/)采用上游備份策略,通過(guò)Apache Kafka(http: //kafka.apache.0rg/)的分布式隊(duì)列管理數(shù)據(jù)流,可以輕松的實(shí)現(xiàn)“至少處理一次”的處理語(yǔ)義,但只能提供部分容錯(cuò),無(wú)法保證“恰好一次”的語(yǔ)義。Flink(http://flink.apache.0rg/)是一種新型的狀態(tài)流處理系統(tǒng),通過(guò)Apache Zookeeper管理并備份主節(jié)點(diǎn),通過(guò)Apache Kafka管理數(shù)據(jù)流,使用異步快照機(jī)制進(jìn)行失效恢復(fù),為數(shù)據(jù)源中的記錄標(biāo)記順序編號(hào),恢復(fù)時(shí)下游節(jié)點(diǎn)丟掉那些編號(hào)小于當(dāng)前已經(jīng)處理過(guò)的記錄編號(hào)的記錄,從而保證“恰好一次”的處理。但其將記錄保存在磁盤(pán)上大大的降低了失效恢復(fù)的速度。
[0006]通過(guò)分析現(xiàn)有流式處理框架中的失效恢復(fù)方法可以看出,提供一種輕量高效、“恰好一次”語(yǔ)義保障、盡可能低延時(shí)的失效恢復(fù)方法是順應(yīng)時(shí)代的潮流且擁有廣闊發(fā)展前景的。
【發(fā)明內(nèi)容】
[0007]本發(fā)明技術(shù)解決問(wèn)題:針對(duì)上述流式處理框架中失效恢復(fù)方法中的不足,提供一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)系統(tǒng)及方法,通過(guò)一個(gè)內(nèi)存數(shù)據(jù)網(wǎng)格平臺(tái)高效且能快速實(shí)現(xiàn)該平臺(tái)上流式數(shù)據(jù)處理的失效恢復(fù)。
[0008]本發(fā)明技術(shù)解決方案:一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)系統(tǒng),包括:調(diào)度器、狀態(tài)服務(wù)器、任務(wù)隊(duì)列和任務(wù)操作中心四個(gè)部分:
[0009]調(diào)度器,負(fù)責(zé)將從數(shù)據(jù)源接收到的數(shù)據(jù)流按照一致性哈希算法,路由到內(nèi)存數(shù)據(jù)網(wǎng)格集群中各個(gè)內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)進(jìn)行相應(yīng)的數(shù)據(jù)處理;當(dāng)感知到節(jié)點(diǎn)失效發(fā)生時(shí),會(huì)停止向失效節(jié)點(diǎn)發(fā)送數(shù)據(jù),并自動(dòng)修復(fù)和重啟失效節(jié)點(diǎn);
[0010]任務(wù)隊(duì)列,是一組基于內(nèi)存的、可串行協(xié)作的分布式任務(wù)隊(duì)列,隊(duì)列中存放的具有時(shí)序特征的任務(wù)是從調(diào)度器路由過(guò)來(lái)的數(shù)據(jù)源或是經(jīng)過(guò)任務(wù)操作中心處理后得到的中間結(jié)果;任務(wù)出隊(duì)后進(jìn)入下一個(gè)任務(wù)操作中心執(zhí)行具體的數(shù)據(jù)處理邏輯;向任務(wù)操作中心輸送任務(wù)的稱(chēng)為輸入任務(wù)隊(duì)列,從任務(wù)操作中心取出任務(wù)的稱(chēng)為輸出任務(wù)隊(duì)列;
[0011]任務(wù)操作中心,提供用于任務(wù)處理的數(shù)據(jù)處理邏輯和快照機(jī)制,數(shù)據(jù)處理邏輯由用戶自定義,可以是簡(jiǎn)單的數(shù)據(jù)操作,也可以是復(fù)雜的連接、聚合操作,快照機(jī)制在任務(wù)處理過(guò)程中隨時(shí)捕獲由任務(wù)的操作狀態(tài)等信息構(gòu)成的快照,并將該快照信息異步持久化到狀態(tài)服務(wù)器中;任務(wù)操作中心從輸入任務(wù)隊(duì)列中取出任務(wù),根據(jù)用戶定義的數(shù)據(jù)處理邏輯進(jìn)行相應(yīng)的數(shù)據(jù)處理,并將邏輯處理后得到的新的記錄信息傳遞給輸出任務(wù)隊(duì)列;
[0012]狀態(tài)服務(wù)器,一種基于內(nèi)存的分布式存儲(chǔ)系統(tǒng),用于存儲(chǔ)任務(wù)操作中心中進(jìn)行邏輯處理的記錄的操作狀態(tài)信息;當(dāng)需要進(jìn)行內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)失效恢復(fù)時(shí),狀態(tài)服務(wù)器提供全面準(zhǔn)確的記錄操作狀態(tài),從而精確的恢復(fù)到失效前一刻的狀態(tài),實(shí)現(xiàn)“恰好一次”的語(yǔ)義保障;狀態(tài)服務(wù)器支持?jǐn)?shù)據(jù)備份,集群節(jié)點(diǎn)可動(dòng)態(tài)擴(kuò)展,對(duì)于內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)失效的狀態(tài)信息,能夠定期的清理,保障內(nèi)存空間的高效利用。
[0013]一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)方法,于實(shí)現(xiàn)步驟如下:
[0014](I)節(jié)點(diǎn)啟動(dòng),初始化任務(wù)隊(duì)列以及任務(wù)操作中心,讀取系統(tǒng)配置文件獲取數(shù)據(jù)窗口大小,任務(wù)隊(duì)列初始創(chuàng)建時(shí),需給定一個(gè)唯一標(biāo)識(shí)JobContainerID,并為每個(gè)任務(wù)操作中心分配一個(gè)唯一標(biāo)識(shí)JobOperatorID和一塊用于存儲(chǔ)快照狀態(tài)信息的內(nèi)存空間,這塊內(nèi)存空間被分成兩部分:一部分用于存儲(chǔ)一個(gè)數(shù)據(jù)窗口內(nèi)的所有記錄的快照信息,并在數(shù)據(jù)窗口離開(kāi)時(shí)異步持久化到狀態(tài)服務(wù)器中,這部分存儲(chǔ)空間稱(chēng)為WindowSnapshot,即所有記錄的檢查點(diǎn)信息;另一部分用于存儲(chǔ)當(dāng)前最新的快照信息,這部分存儲(chǔ)空間稱(chēng)為L(zhǎng)atestSnapshot;
[0015](2)任務(wù)操作中心從輸入任務(wù)隊(duì)列中取出一個(gè)任務(wù)item,并更新LatestSnapshot為M: (r = item、Iv = IastState、fun、Os = false、offset = o),其中item是剛?cè)〕龅娜蝿?wù),IastState是上次更新的狀態(tài),Os為false表示該任務(wù)還沒(méi)有被處理;
[0016](3)任務(wù)操作中心對(duì)item進(jìn)行用戶定義的邏輯處理得到中間結(jié)果item’,并將中間結(jié)果item’傳遞給輸出任務(wù)隊(duì)列同時(shí)更新LatestSnapshot為M’ = (r = item、lv = newState、fun、Os = true、offset = o+l),任務(wù)操作中心將中間結(jié)果item’和快照M’作為一個(gè)原子操作;然后將快照Μ’保存到WindowSnapshot中,如果Μ’是當(dāng)前數(shù)據(jù)窗口的最后一位,則會(huì)觸發(fā)持久化操作,將WindowSnapshot中存儲(chǔ)的所有快照持久化到狀態(tài)服務(wù)器;
[0017](4)節(jié)點(diǎn)A失效后,任務(wù)隊(duì)列會(huì)通過(guò)其標(biāo)識(shí)JobContainerID從集群中獲取到失效前的所有數(shù)據(jù)源或中間結(jié)果,將任務(wù)隊(duì)列恢復(fù)到失效前的狀態(tài);獲得LatestSnapshot中存儲(chǔ)的快照信息M*= (r = task、Iv = state、fun、0s = os、offset = offset),如果os為true,說(shuō)明任務(wù)task已經(jīng)處理完,直接將中間結(jié)果state傳遞給任務(wù)輸出隊(duì)列,如果os為false,說(shuō)明任務(wù)task沒(méi)有處理完,此時(shí)的state是上次處理的中間結(jié)果,需要對(duì)task重新進(jìn)行邏輯處理,得到新的中間結(jié)果state’,并將state’傳遞給任務(wù)輸出隊(duì)列;
[0018]所述快照的形式化表示方式如下:M= (r,lv,fun,Os,offset),其中r指當(dāng)前的任務(wù)記錄,Iv指當(dāng)前邏輯狀態(tài)值(如本地變量、key/value對(duì)等),fun指當(dāng)前操作邏輯(該操作邏輯是由用戶自定義的,可應(yīng)用框架提供的接口),0s指當(dāng)前操作狀態(tài)(初始時(shí)設(shè)為false,即沒(méi)有完成該JobOperator上的邏輯操作,當(dāng)任務(wù)操作器JobOperator處理完當(dāng)前任務(wù)后,便更新為true) ,offset表示該記錄在當(dāng)前窗口中的位置。
[0019]所述數(shù)據(jù)窗口是指微批次的數(shù)據(jù)流,數(shù)據(jù)窗口的大小由配置文件中讀取,快照的異步持久化在一個(gè)數(shù)據(jù)窗口到達(dá)尾端時(shí)執(zhí)行,不會(huì)影響任務(wù)的邏輯處理過(guò)程,所述數(shù)據(jù)窗口的形式化表示如下:胃=((11,(12,(13...dn)。
[0020]與現(xiàn)有流式數(shù)據(jù)處理框架中的失效恢復(fù)技術(shù)相比,本發(fā)明具有如下優(yōu)勢(shì):
[0021 ] (I)本發(fā)明通過(guò)記錄和狀態(tài)信息的分離存儲(chǔ),使得快照中存儲(chǔ)的狀態(tài)信息減少,在降低數(shù)據(jù)處理的延遲的同時(shí),提供更加輕便快照機(jī)制。
[0022](2)本發(fā)明通過(guò)數(shù)據(jù)窗口實(shí)現(xiàn)微批次的快照持久化,并通過(guò)雙buffer的存儲(chǔ)結(jié)構(gòu)確保了 “恰好一次”的語(yǔ)義保障。
[0023](3)本發(fā)明不需借助于第三方的集群(如Kafka)對(duì)數(shù)據(jù)進(jìn)行管理,在一定程度上降低了網(wǎng)絡(luò)延遲。
【附圖說(shuō)明】
[0024]圖1為本發(fā)明基于內(nèi)存數(shù)據(jù)網(wǎng)格的流式數(shù)據(jù)處理框架圖;
[0025]圖2為本發(fā)明中異步快照生成方法流程圖;
[0026]圖3為本發(fā)明中內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)失效后調(diào)度器運(yùn)行流程圖;
[0027]圖4為本發(fā)明內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)失效恢復(fù)流程圖。
【具體實(shí)施方式】
[0028]以下結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明。
[0029]本發(fā)明提出的基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理框架的失效恢復(fù)方法,在Hazelcast內(nèi)存數(shù)據(jù)網(wǎng)格平臺(tái)上,對(duì)出租車(chē)設(shè)備上發(fā)來(lái)的車(chē)輛信息進(jìn)行轉(zhuǎn)換、聚合等操作,通過(guò)異步快照保存車(chē)輛記錄的操作狀態(tài)信息,以及數(shù)據(jù)窗口的微批次處理,實(shí)現(xiàn)一種輕量高效、“恰好一次”并盡可能低延時(shí)的失效恢復(fù)方法。
[0030]本實(shí)例的應(yīng)用框架如圖1所示。本發(fā)明實(shí)例所使用的Hazelcast是一種提供數(shù)據(jù)備份、數(shù)據(jù)分區(qū)以及各種分布式數(shù)據(jù)結(jié)構(gòu)的內(nèi)存數(shù)據(jù)網(wǎng)格,其中JobContainer 1、JobContainer2為內(nèi)存數(shù)據(jù)網(wǎng)格工具Hazelcast的分布式隊(duì)列。JobOperator I提供設(shè)備信息轉(zhuǎn)換功能,Job0perator2提供設(shè)備相關(guān)性的聚合操作。
[0031]內(nèi)存數(shù)據(jù)網(wǎng)格(IMDG)是一種提供基于分布式內(nèi)存的低時(shí)延、可擴(kuò)展數(shù)據(jù)訪問(wèn),SPCPU直接從內(nèi)存,而不是硬盤(pán)上讀取數(shù)據(jù),并進(jìn)行計(jì)算、分析的新型中間件,同時(shí)提供各種數(shù)據(jù)結(jié)構(gòu)的分布式實(shí)現(xiàn),且所有數(shù)據(jù)存儲(chǔ)在內(nèi)存中。
[0032]本發(fā)明中的基于內(nèi)存數(shù)據(jù)網(wǎng)格平臺(tái)的實(shí)時(shí)流式數(shù)據(jù)處理系統(tǒng)包含調(diào)度器、狀態(tài)服務(wù)器、任務(wù)隊(duì)列、任務(wù)操作中心四個(gè)組成部分:
[0033]I.調(diào)度器(Scheduler)
[0034]在本發(fā)明的基于內(nèi)存數(shù)據(jù)網(wǎng)格的流式處理系統(tǒng)中,調(diào)度器通過(guò)一致性哈希算法,將數(shù)據(jù)流路由到不同的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)僅需維護(hù)少量相鄰節(jié)點(diǎn)的信息,并且在節(jié)點(diǎn)加入/退出系統(tǒng)時(shí),僅有相關(guān)的少量節(jié)點(diǎn)參與到拓?fù)涞木S護(hù)中。保證了整個(gè)框架的負(fù)載均衡,同時(shí)還確保了集群的可擴(kuò)展性。
[0035]2.任務(wù)隊(duì)列(JobContainer)
[0036]在本發(fā)明的基于內(nèi)存數(shù)據(jù)網(wǎng)格的流式處理系統(tǒng)中,基于其擁有數(shù)據(jù)備份的獨(dú)特性,本發(fā)明提供的任務(wù)隊(duì)列(JobContainer)是一組基于內(nèi)存的、可串行協(xié)作的分布式任務(wù)隊(duì)列,隊(duì)列中存放具有時(shí)序特征的數(shù)據(jù)處理任務(wù)。每個(gè)隊(duì)列配置了一個(gè)任務(wù)線程池,實(shí)現(xiàn)隊(duì)列中任務(wù)出隊(duì)與任務(wù)執(zhí)行的并發(fā)性。任務(wù)出隊(duì)時(shí)將執(zhí)行具體的數(shù)據(jù)處理邏輯,然后進(jìn)入下一階段的任務(wù)隊(duì)列。開(kāi)發(fā)人員可以利用多個(gè)階段的任務(wù)隊(duì)列設(shè)計(jì)實(shí)現(xiàn)較為復(fù)雜的數(shù)據(jù)處理流程。
[0037]3.任務(wù)操作中心(JobOperator)
[0038]在本發(fā)明的基于內(nèi)存數(shù)據(jù)網(wǎng)格的流式處理框架中,任務(wù)操作中心(JobOperator)是從輸入JobContainer(IJC)中取出任務(wù),并進(jìn)行相應(yīng)的數(shù)據(jù)處理邏輯的模塊,然后將邏輯處理后得到的新的記錄信息傳遞給輸出JobContainer (OJC)。JobOperator提供的數(shù)據(jù)處理邏輯是由用戶自定義,可能是簡(jiǎn)單的數(shù)據(jù)操作,也可能是復(fù)雜的連接、聚合等操作,且包含了驅(qū)動(dòng)和恢復(fù)快照的方法。對(duì)于某些復(fù)雜的操作,為保證失效恢復(fù)的精確性,需要加鎖阻塞,保證邏輯運(yùn)算和輸出新紀(jì)錄到輸出隊(duì)列的原子性。
[0039]4.狀態(tài)服務(wù)器(State Server)
[0040]在本發(fā)明的基于內(nèi)存數(shù)據(jù)網(wǎng)格的流式處理框架中,狀態(tài)服務(wù)器將進(jìn)行流式處理的記錄的操作狀態(tài)信息存儲(chǔ)在分布式內(nèi)存中,當(dāng)需要失效恢復(fù)時(shí),狀態(tài)服務(wù)器可以提供全面準(zhǔn)確的記錄操作狀態(tài),從而精確的恢復(fù)到失效前一刻的狀態(tài),實(shí)現(xiàn)“恰好一次”的語(yǔ)義保障。狀態(tài)服務(wù)器支持?jǐn)?shù)據(jù)備份,集群節(jié)點(diǎn)可動(dòng)態(tài)擴(kuò)展,對(duì)于失效的狀態(tài)信息,能夠定期的清理,保障內(nèi)存空間的高效利用。
[0041 ]本實(shí)施例快照獲取方法流程如圖2所示。
[0042]I.節(jié)點(diǎn)啟動(dòng),初始化任務(wù)隊(duì)列JobContainerl、JobContainer2,其唯一標(biāo)識(shí)分別為JobContainerIDl、JobContainerID2(實(shí)際應(yīng)包含節(jié)點(diǎn)所在的機(jī)器IP信息、節(jié)點(diǎn)標(biāo)號(hào)信息等)。讀取配置文件獲取窗口大小W。為JobOperatorl和Job0perator2分配一個(gè)唯一標(biāo)識(shí)JobOperatorIDl 和 Job0peratorID2。并通過(guò)哈希表存儲(chǔ) WindowSnapshot 和LatestSnapshot。
[0043]2.JobOperatorl從JobContainerl 中取出記錄rl,更新其LatestSnapshot中存儲(chǔ)的快照M: (r= item、lv = null、fun、Os = false、offset = 0)。由于這是取出的第一個(gè)記錄,因此沒(méi)有IastState信息。
[0044]3.JobOperatorl對(duì)rl進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換,得到轉(zhuǎn)換后的數(shù)據(jù)rl’。
[0045]4.JobOperatorI將rl ’ 傳遞給JobContainer2,并更新LatestSnapshot為M’ = (r =rl ’、lv = rl ’、fun、Os = true、offset = I),并將該快照保存到WindowSnapshot中。如果該記錄是當(dāng)前窗口的最后一個(gè)記錄,則會(huì)觸發(fā)持久化操作,將WindowSnapshot中的快照異步持久化到狀態(tài)服務(wù)器,WindowSnapshot會(huì)繼續(xù)下個(gè)窗口的快照信息的存儲(chǔ)。
[0046]5.了0130卩6『&1:0『2從了013(]01^&;[116『2中取出記錄1'1'1,更新了013 0卩6『&1:0『2上的LatestSnapshot 中存儲(chǔ)的快照MM= (r = rr 1、Iv = null、fun、Os = false、offset = 0)。
[0047]6.Job0perator2將rrl按照設(shè)備相關(guān)性存儲(chǔ)到分布式Map中相應(yīng)的key值對(duì)應(yīng)的value中,這是一個(gè)追加操作,需要將rrl包含的經(jīng)瑋度以及時(shí)間等信息添加到設(shè)備號(hào)為key值的value中,如原來(lái)的〈key = 1111 ,value=” 111,112 ;”>,現(xiàn)在需要在value中增加rrl中包含的經(jīng)瑋度信息,如〈key = 1111 ,value=” 111,112; 113,115 ;”>。更新Job0perator2 上的LatestSnapshot中存儲(chǔ)的快照MM’ = (r = rrl、Iv =〈key = 1111,value =,,111,112;113,115;,,>、fun、0s = true、offset = l)。
[0048]7.Job0perator2從JobContainer2中取出的任務(wù)為空時(shí),即任務(wù)隊(duì)列JobContainer2中此時(shí)沒(méi)有任務(wù),Job0perator2便會(huì)將JobContainer2阻塞起來(lái),并將分布式Map中的數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)中。
[0049]本實(shí)施例在節(jié)點(diǎn)A失效后,調(diào)度器運(yùn)行流程如圖3,節(jié)點(diǎn)A失效恢復(fù)具體流程如圖4所示。
[0050]1.節(jié)點(diǎn)A失效后,調(diào)度器感知到A節(jié)點(diǎn)失效,會(huì)終止向該節(jié)點(diǎn)繼續(xù)傳遞數(shù)據(jù)流,同時(shí)將原本傳向A節(jié)點(diǎn)的流式數(shù)據(jù)通過(guò)一致性哈希算法路由到其他的節(jié)點(diǎn),并嘗試重新啟動(dòng)該失效的節(jié)點(diǎn)A。
[0051 ] 2.節(jié)點(diǎn)A重新啟動(dòng)后,JobContainerl和JobContainer2會(huì)通過(guò)其標(biāo)識(shí)JobContainerIDl,和JobContainerID2將其原有的數(shù)據(jù)從集群中其他節(jié)點(diǎn)中的備份迀移后恢復(fù)到失效之前的狀態(tài)。
[0052]3.JobOperatorl需要通過(guò)其LatestSnapshot中的狀態(tài)信息,恢復(fù)到失效之前。在獲取到 JobOperator I 的最新的快照Is I: (r = item、Iv = state、fun、0s = isFinish、off set=o)后,檢查該快照中的狀態(tài)信息,如果isFinish為true,說(shuō)明記錄item已經(jīng)處理完成,直接將其傳遞給JobContainer2即可;如果isFinish為faIse,說(shuō)明記錄item還沒(méi)有完成JobOperator I中的邏輯操作,此時(shí)需要通過(guò)IV = State將其狀態(tài)恢復(fù)到state,并重新執(zhí)行記錄item的邏輯操作,將得到的新的記錄item’傳遞給JobContainer20
[0053]4.Job0perator2需要通過(guò)其LatestSnapshot中的狀態(tài)信息,恢復(fù)到失效之前。在獲取到 Job0perator2 的最新的快照 ls2: (r = item、Iv = state、fun、0s = isFinish、off set=o)后,檢查該快照中的狀態(tài)信息,如果isFinish為true,說(shuō)明記錄item已經(jīng)處理完成;如isFinish為false,說(shuō)明記錄item還沒(méi)有完成Job0perator2中的邏輯操作,此時(shí)需要通過(guò)IV= State將其狀態(tài)恢復(fù)到state,并重新執(zhí)行記錄item的邏輯操作。
[0054]5.節(jié)點(diǎn)A啟動(dòng)后狀態(tài)全部被重置到失效之前的狀態(tài),調(diào)度器會(huì)繼續(xù)向節(jié)點(diǎn)A路由數(shù)據(jù)流,在短時(shí)間內(nèi)使整個(gè)集群重新回到一個(gè)平衡狀態(tài)。
[0055]盡管為說(shuō)明目的公開(kāi)了本發(fā)明的具體實(shí)施例和附圖,其目的在于幫助理解本發(fā)明的內(nèi)容并據(jù)以實(shí)施,但是本領(lǐng)域的技術(shù)人員可以理解:在不脫離本發(fā)明及所附的權(quán)利要求的精神和范圍內(nèi),各種替換、變化和修改都是可能的。因此,本發(fā)明不應(yīng)局限于最佳實(shí)施例和附圖所公開(kāi)的內(nèi)容。
【主權(quán)項(xiàng)】
1.一種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)系統(tǒng),其特征在于:包括調(diào)度器、狀態(tài)服務(wù)器、任務(wù)隊(duì)列和任務(wù)操作中心四個(gè)部分: 調(diào)度器,負(fù)責(zé)將從數(shù)據(jù)源接收到的數(shù)據(jù)流按照一致性哈希算法,路由到內(nèi)存數(shù)據(jù)網(wǎng)格集群中各個(gè)內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)進(jìn)行相應(yīng)的數(shù)據(jù)處理;當(dāng)感知到節(jié)點(diǎn)失效發(fā)生時(shí),會(huì)停止向失效節(jié)點(diǎn)發(fā)送數(shù)據(jù),并自動(dòng)修復(fù)和重啟失效節(jié)點(diǎn); 任務(wù)隊(duì)列,是一組基于內(nèi)存的、可串行協(xié)作的分布式任務(wù)隊(duì)列,隊(duì)列中存放的具有時(shí)序特征的任務(wù)是從調(diào)度器路由過(guò)來(lái)的數(shù)據(jù)源或是經(jīng)過(guò)任務(wù)操作中心處理后得到的中間結(jié)果;任務(wù)出隊(duì)后進(jìn)入下一個(gè)任務(wù)操作中心執(zhí)行具體的數(shù)據(jù)處理邏輯;向任務(wù)操作中心輸送任務(wù)的稱(chēng)為輸入任務(wù)隊(duì)列,從任務(wù)操作中心取出任務(wù)的稱(chēng)為輸出任務(wù)隊(duì)列; 任務(wù)操作中心,提供用于任務(wù)處理的數(shù)據(jù)處理邏輯和快照機(jī)制,數(shù)據(jù)處理邏輯由用戶自定義,可以是簡(jiǎn)單的數(shù)據(jù)操作,也可以是復(fù)雜的連接、聚合操作,快照機(jī)制在任務(wù)處理過(guò)程中隨時(shí)捕獲由任務(wù)的操作狀態(tài)等信息構(gòu)成的快照,并將該快照信息異步持久化到狀態(tài)服務(wù)器中;任務(wù)操作中心從輸入任務(wù)隊(duì)列中取出任務(wù),根據(jù)用戶定義的數(shù)據(jù)處理邏輯進(jìn)行相應(yīng)的數(shù)據(jù)處理,并將邏輯處理后得到的新的記錄信息傳遞給輸出任務(wù)隊(duì)列; 狀態(tài)服務(wù)器,一種基于內(nèi)存的分布式存儲(chǔ)系統(tǒng),用于存儲(chǔ)任務(wù)操作中心中進(jìn)行邏輯處理的記錄的操作狀態(tài)信息;當(dāng)需要進(jìn)行內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)失效恢復(fù)時(shí),狀態(tài)服務(wù)器提供全面準(zhǔn)確的記錄操作狀態(tài),從而精確的恢復(fù)到失效前一刻的狀態(tài),實(shí)現(xiàn)“恰好一次”的語(yǔ)義保障;狀態(tài)服務(wù)器支持?jǐn)?shù)據(jù)備份,集群節(jié)點(diǎn)可動(dòng)態(tài)擴(kuò)展,對(duì)于內(nèi)存數(shù)據(jù)網(wǎng)格節(jié)點(diǎn)失效的狀態(tài)信息,能夠定期的清理,保障內(nèi)存空間的高效利用。2.—種基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)方法,其特征在于實(shí)現(xiàn)步驟如下: (1)節(jié)點(diǎn)啟動(dòng),初始化任務(wù)隊(duì)列以及任務(wù)操作中心,讀取系統(tǒng)配置文件獲取數(shù)據(jù)窗口大小,任務(wù)隊(duì)列初始創(chuàng)建時(shí),需給定一個(gè)唯一標(biāo)識(shí)JobContainerID,并為每個(gè)任務(wù)操作中心分配一個(gè)唯一標(biāo)識(shí)JobOperatorID和一塊用于存儲(chǔ)快照狀態(tài)信息的內(nèi)存空間,這塊內(nèi)存空間被分成兩部分:一部分用于存儲(chǔ)一個(gè)數(shù)據(jù)窗口內(nèi)的所有記錄的快照信息,并在數(shù)據(jù)窗口離開(kāi)時(shí)異步持久化到狀態(tài)服務(wù)器中,這部分存儲(chǔ)空間稱(chēng)為WindowSnapshot,即所有記錄的檢查點(diǎn)信息;另一部分用于存儲(chǔ)當(dāng)前最新的快照信息,這部分存儲(chǔ)空間稱(chēng)為L(zhǎng)atestSnapshot ; (2)任務(wù)操作中心從輸入任務(wù)隊(duì)列中取出一個(gè)任務(wù)item,并更新LatestSnapshotSM:(r=it em、lv = lastState、fun、Os = false、offset =。),其中 i tem是剛?cè)〕龅娜蝿?wù),IastState是上次更新的狀態(tài),Os為false表示該任務(wù)還沒(méi)有被處理; (3)任務(wù)操作中心對(duì)item進(jìn)行用戶定義的邏輯處理得到中間結(jié)果item’,并將中間結(jié)果item’ 傳遞給輸出任務(wù)隊(duì)列同時(shí)更新 LatestSnapshot為M ’ = (r= item、lv = newState、fun、Os = true、off set = o+l),任務(wù)操作中心將中間結(jié)果item’和快照M ’作為一個(gè)原子操作;然后將快照M’保存到WindowSnapshot中,如果M’是當(dāng)前數(shù)據(jù)窗口的最后一位,則會(huì)觸發(fā)持久化操作,將WindowSnapshot中存儲(chǔ)的所有快照持久化到狀態(tài)服務(wù)器; (4)節(jié)點(diǎn)A失效后,任務(wù)隊(duì)列會(huì)通過(guò)其標(biāo)識(shí)JobContainerID從集群中獲取到失效前的所有數(shù)據(jù)源或中間結(jié)果,將任務(wù)隊(duì)列恢復(fù)到失效前的狀態(tài);獲得LatestSnapshot中存儲(chǔ)的快照信息M*= (r = task、IV = state、fun、0s = os、offset = offset),如果os為true,說(shuō)明任務(wù)task已經(jīng)處理完,直接將中間結(jié)果state傳遞給任務(wù)輸出隊(duì)列,如果os為false,說(shuō)明任務(wù)task沒(méi)有處理完,此時(shí)的state是上次處理的中間結(jié)果,需要對(duì)task重新進(jìn)行邏輯處理,得到新的中間結(jié)果state,,并將state,傳遞給任務(wù)輸出隊(duì)列。3.根據(jù)權(quán)利要求2所述的基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)方法,其特征在于:所述快照的形式化表示方式如下:M=(r, Iv ,fun, Os ,offset),其中r指當(dāng)前的任務(wù)記錄,Iv指當(dāng)前邏輯狀態(tài)值,fun指當(dāng)前操作邏輯該操作邏輯是由用戶自定義的,可應(yīng)用框架提供的接口 ;Os指當(dāng)前操作狀態(tài),初始時(shí)設(shè)為false,即沒(méi)有完成該JobOperator上的邏輯操作,當(dāng)任務(wù)操作器JobOperator處理完當(dāng)前任務(wù)后,便更新為true !offset表示該記錄在當(dāng)前窗口中的位置。4.根據(jù)權(quán)利要求2所述的基于內(nèi)存數(shù)據(jù)網(wǎng)格的實(shí)時(shí)流式數(shù)據(jù)處理失效恢復(fù)方法,其特征在于:所述數(shù)據(jù)窗口是指微批次的數(shù)據(jù)流,數(shù)據(jù)窗口的大小由配置文件中讀取,快照的異步持久化在一個(gè)數(shù)據(jù)窗口到達(dá)尾端時(shí)執(zhí)行,不會(huì)影響任務(wù)的邏輯處理過(guò)程,所述數(shù)據(jù)窗口的形式化表示如下:W=(dl,d2,d3...dn)。
【文檔編號(hào)】H04L12/24GK105871603SQ201610186150
【公開(kāi)日】2016年8月17日
【申請(qǐng)日】2016年3月29日
【發(fā)明人】黃濤, 鐘華, 魏峻, 王偉, 支孟軒, 鄭瑩瑩
【申請(qǐng)人】中國(guó)科學(xué)院軟件研究所