本發(fā)明涉及一種高可靠分布式數(shù)據(jù)流實時統(tǒng)計方法及系統(tǒng),屬于大數(shù)據(jù)
技術(shù)領域:
。
背景技術(shù):
:提到數(shù)據(jù)流統(tǒng)計處理,目前業(yè)界的解決方案絕大多數(shù)都是基分布式內(nèi)存計算,這是因為分布式系統(tǒng)的并發(fā)性可以很好的應對大規(guī)模的數(shù)據(jù)流,使用內(nèi)存計算而不是傳統(tǒng)的本地或者分布式文件系統(tǒng),是因為系統(tǒng)需要盡快的處理流入系統(tǒng)的數(shù)據(jù),因為在數(shù)據(jù)流計算場景下,數(shù)據(jù)是高頻流動的,具有時效性,當一包數(shù)據(jù)流過去就無法再次拿到這包數(shù)據(jù)。在這樣的分布式內(nèi)存計算架構(gòu)下,存在著諸多需要解決的問題,從一致性、可用性、分區(qū)容忍三選二的折中,到可靠性、擴展性和靈活性等等特性。現(xiàn)有的產(chǎn)品例如s4、storm、spark都已經(jīng)一定程度上得到了業(yè)界的認可及應用,但是在更加苛刻的場景下,他們的表現(xiàn)并不理想。s4的不足主要有兩個不足,首先是可靠性,s4僅能保證at-most-once語義,當processingnode宕機后,任務可轉(zhuǎn)移,但是內(nèi)存中的數(shù)據(jù)會全部丟失。另外s4不可動態(tài)擴展節(jié)點,這對于一個分布式系統(tǒng)來說是不可接受的。storm存在的問題有兩點:一是弱中心化結(jié)構(gòu)帶來的單點故障,在nimbus節(jié)點或者ui節(jié)點發(fā)生宕機后,統(tǒng)計任務的執(zhí)行會出現(xiàn)問題;二是語義保證,即可靠性,盡管提供了trident機制保證了exactly-once語義,但是該機制會嚴重影響處理性能。sparkstreaming存在的問題同樣有兩點:一是處理延遲較高,秒級的延遲無法滿足某些對實時性要求較高的應用場景;二是在語義保證上,需要借助特定的數(shù)據(jù)源保證不丟失數(shù)據(jù)。綜上,可靠性是
背景技術(shù):
存在的核心問題,由可靠性帶來的性能問題、兼容性問題同樣值得關(guān)注。技術(shù)實現(xiàn)要素:本發(fā)明的目的在于針對高精確性需求的數(shù)據(jù)流實時統(tǒng)計場景下,提供一個高可靠、并最大程度上保證性能(吞吐量)的數(shù)據(jù)流實時統(tǒng)計系統(tǒng),使得在發(fā)生宕機、故障時,可以保證數(shù)據(jù)可恢復、任務可轉(zhuǎn)移。本發(fā)明的技術(shù)方案為:一種高可靠分布式數(shù)據(jù)流實時統(tǒng)計方法,其步驟為:1)根據(jù)當前的統(tǒng)計任務生成分布式集群mapreducer的map任務和reducer任務;2)針對每個計算任務為mapper集群中的每一mapper節(jié)點初始化一mapper序號、為reducer集群中的每一reducer節(jié)點初始化一reducer序號;其中,mapper序號初始化為mapper集群已經(jīng)在分布式緩存中生成的中間數(shù)據(jù)集個數(shù);reducer序號初始化為reducer集群下一輪計算即將從分布式緩存中取得的中間數(shù)據(jù)集序號;3)mapper集群中的mapper節(jié)點根據(jù)當前的mapper序號從消息中間件拉取消息并處理;其中,當一個mapper節(jié)點處理完一個時間粒度的輸入數(shù)據(jù)產(chǎn)生初步計算結(jié)果后,將mapper序號自增1并把初步計算結(jié)果以自增后的mapper序號存儲在分布式緩存系統(tǒng)redis中;4)reducer集群從分布式緩存系統(tǒng)redis中順序讀取所述初步計算結(jié)果并處理,得到當前統(tǒng)計任務的最終統(tǒng)計結(jié)果;其中,每個reducer節(jié)點處理任務時,從分布式緩存系統(tǒng)redis中得到reducer序列號,然后從分布式緩存系統(tǒng)redis中讀取該reducer序號的數(shù)據(jù);如果reducer節(jié)點需要歸并多個reducer序號的數(shù)據(jù)集,則該reducer節(jié)點保存增加后的reducer序號,直到該多個reducer序號的數(shù)據(jù)集處理完成后,將該reducer節(jié)點的reducer序號更新到分布式緩存系統(tǒng)redis中。進一步的,reducer集群首先選取一節(jié)點作為master節(jié)點,然后該master節(jié)點使用一致性哈希算法計算各個節(jié)點處理的任務編號,并根據(jù)計算結(jié)果向各個節(jié)點發(fā)送調(diào)度信號,告知各節(jié)點需要處理的任務;各節(jié)點監(jiān)聽自己的任務狀態(tài),在接收到調(diào)度信號時啟動對應的計算任務或停止不再處理的計算任務。進一步的,選取master節(jié)點的方法為:每個reducer節(jié)點上線時在指定目錄注冊命名相同的臨時順序節(jié)點;將最先上線注冊的節(jié)點作為master節(jié)點。進一步的,該master節(jié)點使用一致性哈希算法計算各個節(jié)點處理的任務編號的方法為:該master節(jié)點首先將各reducer節(jié)點以節(jié)點ip為key注冊在哈希環(huán)上;然后對于每一個任務,將該任務的id加上混淆字符串注冊在該哈希環(huán)上;然后在該哈希環(huán)上尋找遇到的第一個節(jié)點并將該任務分配給該節(jié)點。進一步的,每個數(shù)據(jù)流統(tǒng)計任務有兩種狀態(tài):等待狀態(tài)和運行狀態(tài),以及兩種信號:就緒信號和限制信號;通過就緒信號和限制信號控制當前統(tǒng)計任務在等待狀態(tài)和運行狀態(tài)之間轉(zhuǎn)換。進一步的,步驟3)中,利用分布式緩存系統(tǒng)redis提供的自增原子操作將mapper序號自增1。進一步的,步驟4)中,在reducer集群中,每個reducer任務的一個并行度僅對應一個reducer節(jié)點。一種高可靠分布式數(shù)據(jù)流實時統(tǒng)計系統(tǒng),其特征在于,包括任務數(shù)據(jù)庫、消息中間件、map集群、reducer集群、分布式緩存系統(tǒng)redis和分布式協(xié)調(diào)系統(tǒng);其中,針對每個計算任務為mapper集群中的每一mapper節(jié)點初始化一mapper序號、為reducer集群中的每一reducer節(jié)點初始化一reducer序號;其中,mapper序號初始化為mapper集群已經(jīng)在分布式緩存中生成的中間數(shù)據(jù)集個數(shù);reducer序號初始化為reducer集群下一輪計算即將從分布式緩存中取得的中間數(shù)據(jù)集序號;mapper集群,各mapper節(jié)點根據(jù)當前的mapper序號從消息中間件拉取消息并處理;當一個mapper節(jié)點處理完一個時間粒度的輸入數(shù)據(jù)產(chǎn)生初步計算結(jié)果后,將mapper序號自增1并把初步計算結(jié)果以自增后的mapper序號存儲在分布式緩存系統(tǒng)redis中;reducer集群,用于從分布式緩存系統(tǒng)redis中順序讀取所述初步計算結(jié)果并處理,得到當前統(tǒng)計任務的最終統(tǒng)計結(jié)果;其中,每個reducer節(jié)點處理任務時,從分布式緩存系統(tǒng)redis中得到reducer序列號,然后從分布式緩存系統(tǒng)redis中讀取該reducer序號的數(shù)據(jù);如果reducer節(jié)點需要歸并多個reducer序號的數(shù)據(jù)集,則該reducer節(jié)點保存增加后的reducer序號,直到該多個reducer序號的數(shù)據(jù)集處理完成后,將該reducer節(jié)點的reducer序號更新到分布式緩存系統(tǒng)redis中;任務數(shù)據(jù)庫,用于存儲分布式集群mapreducer的map任務和reducer任務;分布式消息中間件,用于提供消息服務,以及統(tǒng)計任務數(shù)據(jù)庫儲存用戶的統(tǒng)計需求;分布式協(xié)調(diào)系統(tǒng),用于提供對分布式集群運行時的狀態(tài)管理;分布式緩存系統(tǒng)redis,用于緩存分布式中間計算結(jié)果。本發(fā)明包括三項核心技術(shù):1.基于mapreduce編程模型的分布式數(shù)據(jù)流計算模型2.帶序號的并發(fā)數(shù)據(jù)傳遞機制3.基于狀態(tài)與信號的分布式任務管理調(diào)度機制如圖1所示,其中技術(shù)1通過保證分布式系統(tǒng)的可擴展性,解決了吞吐量的問題。技術(shù)二和技術(shù)三分別解決了數(shù)據(jù)可靠性和任務可用性的問題,從而保證了可靠的語義。1基于mr的分布式數(shù)據(jù)流計算模型本發(fā)明的系統(tǒng)架構(gòu)圖如圖2所示,粗箭頭表示數(shù)據(jù)流向,細箭頭表示組件之間的交互,mapper集群、reducer集群是mars的核心組件。mapper集群從消息中間件拉取消息并處理,將中間結(jié)果順序緩存在分布式緩存中,reducer集群從分布式緩存中順序讀取分布式緩存中的中間數(shù)據(jù),處理后將最終的統(tǒng)計結(jié)果再發(fā)送回消息隊列。mars將mapreducer模型的思想擴展到了集群概念上,每一個map或者reducer計算單元都是分布式集群中的一個節(jié)點,分別稱作mapper或reducer。所有的mapper節(jié)點組成mapper集群,所有的reducer節(jié)點組成reducer集群。mars依賴的外部組件有四個:數(shù)據(jù)庫、消息中間件、分布式緩存系統(tǒng)redis和分布式協(xié)調(diào)服務zookeeper。其中分布式消息中間件提供消息服務,mars的輸入和輸出都通過分布式消息中間件完成,統(tǒng)計任務數(shù)據(jù)庫儲存用戶的統(tǒng)計需求,分布式協(xié)調(diào)系統(tǒng)提供對分布式集群運行時的狀態(tài)管理等等,分布式緩存負責異步解耦和緩存中間計算結(jié)果。在本發(fā)明中,每個數(shù)據(jù)流統(tǒng)計任務都分為map和reduce兩個階段,分別由mapper集群和reducer集群完成。以一個分組統(tǒng)計任務為例,如圖3。需要特別指出的是,這里的map和reduce與傳統(tǒng)的mapreduce模型不同。傳統(tǒng)的mapreduce模型用于離線批處理,數(shù)據(jù)批量輸入系統(tǒng),當mapper處理完全部數(shù)據(jù)后才會開始reduce階段。本發(fā)明中對mapreduce的思想進行了延伸,應用到了數(shù)據(jù)流實時處理領域。在處理流數(shù)據(jù)時,數(shù)據(jù)經(jīng)過mapper處理結(jié)束后直接進入reduce階段,不必等待所有數(shù)據(jù)處理完成,保證了流數(shù)據(jù)處理的實時性。同時,本發(fā)明中每個mapper和reducer都是一個物理節(jié)點,更粗的粒度有利于節(jié)約故障恢復時的開銷。2帶序號的并發(fā)數(shù)據(jù)傳遞技術(shù)在本發(fā)明中,針對每個計算任務為mapper集群和reducer集群初始化一個序號:mapper的序號表示mapper已經(jīng)在分布式緩存中生成的中間數(shù)據(jù)集個數(shù);reducer的序號表示reducer下一輪計算即將從分布式緩存中取得的中間數(shù)據(jù)集序號。圖4是數(shù)據(jù)從mapper發(fā)送到分布式緩存的過程。mapper集群采用自增mapper序號的策略,也就是說,當一個mapper節(jié)點處理完一個時間粒度的輸入數(shù)據(jù)、產(chǎn)生初步計算結(jié)果后,利用redis提供的自增原子操作將mapper序號自增1,并把初步計算結(jié)果以自增后的序號存儲在redis中。由于自增為原子操作,所以多個節(jié)點并行處理同一task時,每個mapper節(jié)點所得到的序號一定是全局唯一的,不會將計算結(jié)果存儲為同一序號,造成數(shù)據(jù)覆蓋。mapper和reducer的序號策略示意圖如圖5。reducer集群使用了延遲更新reducer序列號的策略。在reducer集群中,每個任務的一個并行度僅對應一個reducer節(jié)點,每個reducer節(jié)點處理任務時,從分布式緩存中得到reducer序列號,上文中定義reducer序列號為本次計算即將要處理的數(shù)據(jù)集序號,因此reducer節(jié)點得到序號后則從redis中讀取該reducer序列號的數(shù)據(jù),如果reducer需要歸并多個序號的數(shù)據(jù)集,reducer也僅在內(nèi)存中保存增加后的序列號,直到所有序號處理完成后才將reducer序列號更新到redis。這一策略主要是出于容錯性考慮。綜上,這一技術(shù)使得mapper集群和reducer集群間以一種序號機制保證消息的順序和可靠性,保證了數(shù)據(jù)級別的可靠性,使得在mapper集群或reducer集群中發(fā)生節(jié)點宕機時,數(shù)據(jù)不會丟失。3基于狀態(tài)與信號的分布式任務管理調(diào)度技術(shù)在本發(fā)明中,每個數(shù)據(jù)流統(tǒng)計任務有兩種狀態(tài):waiting和running,另外有兩種信號:ready和term可以使得兩種狀態(tài)發(fā)生轉(zhuǎn)換,轉(zhuǎn)換關(guān)系如圖6。reducer集群中master(領導者)選舉后,master使用一致性哈希算法計算各個節(jié)點處理的任務編號,并根據(jù)計算結(jié)果向各個節(jié)點發(fā)送調(diào)度信號(即節(jié)點對應的任務編號),告知該節(jié)點需要處理的任務。所有節(jié)點監(jiān)聽自己的任務狀態(tài),在接收到調(diào)度信號時啟動對應的計算任務或停止不再處理的計算任務。同時,所有節(jié)點監(jiān)聽集群節(jié)點在線狀態(tài),在新節(jié)點上線、運行中節(jié)點發(fā)生故障時,重新校驗master身份,并由master重新分配任務并根據(jù)任務分配變化情況發(fā)送相應調(diào)度信號。reducer的master選舉機制依賴于zookeeper。zookeeper有一種臨時順序節(jié)點類型叫做ephemeral_sequential,臨時順序節(jié)點的特性是注冊節(jié)點時會在client指定的命名后添加一個序號,按照注冊該節(jié)點的順序,序號遞增。利用這一機制,reducer的領導者選舉機制實現(xiàn)如下:每個reducer節(jié)點上線時在指定目錄注冊命名相同的臨時順序節(jié)點(ephemeral_sequential_node)。reducer集群各個節(jié)點上線的時間是有順序的,使最先上線注冊的節(jié)點成為master。以圖7為例,r1、r2、r3為3個reducer節(jié)點,ip分別為192.168.1.1、192.168.1.2、192.168.1.3,它們上線時都去創(chuàng)建名為/master-election/lock的zookeeper節(jié)點,并將zookeeper節(jié)點賦值為自己的ip。reducer的一致性哈希分配算法敘述如下:首先,master節(jié)點將所有reducer節(jié)點以節(jié)點ip為key注冊在哈希環(huán)上;接著,對于每一個task,將task的id加上混淆字符串注冊在哈希環(huán)上;然后,在哈希環(huán)上尋找遇到的第一個節(jié)點;最后,將該task分配給這個節(jié)點。這些機制使得在集群規(guī)模發(fā)生變化時(新節(jié)點上線或工作節(jié)點宕機),計算任務能夠得以正確的調(diào)度和轉(zhuǎn)移,保證了任務級別的可靠性。與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為:本發(fā)明能夠滿足高精確性需求的數(shù)據(jù)流實時統(tǒng)計,具有高可靠、并最大程度上保證性能(吞吐量),使得在系統(tǒng)發(fā)生宕機、故障時,可以保證數(shù)據(jù)可恢復、任務可轉(zhuǎn)移。本發(fā)明在處理流數(shù)據(jù)統(tǒng)計任務,以及預處理、統(tǒng)計的混合任務方面的吞吐量比現(xiàn)有的流處理系統(tǒng)stom、sparkstreaming大。具體對比數(shù)據(jù)如圖8。附圖說明圖1為本發(fā)明技術(shù)架構(gòu)框圖;圖2為本發(fā)明的系統(tǒng)架構(gòu)圖;圖3為一個分組統(tǒng)計任務實例圖;圖4為數(shù)據(jù)從mapper發(fā)送到分布式緩存的過程圖;圖5為mapper和reducer的序號策略示意圖;圖6為轉(zhuǎn)換關(guān)系圖;圖7為注冊流程示例圖;圖8為對比數(shù)據(jù)圖;(a)數(shù)據(jù)流統(tǒng)計任務吞吐量對比;(b)混合任務吞吐量對比;圖9為map階段處理流程圖;圖10為reduce階段處理流程圖。具體實施方式下面結(jié)合具體實例對本發(fā)明進行進一步具體描述。示例1假設數(shù)據(jù)源數(shù)據(jù)的格式包含4個字段,id、時間戳(timestamp)、源ip(sip)、目標ip(dip),其中一段數(shù)據(jù)流如下:idtimestampsipdip109:251.1.1.12.2.2.2109:251.1.1.13.3.3.3109:261.1.1.16.6.6.6109:263.3.3.35.5.5.5209:274.4.4.42.2.2.2209:284.4.4.43.3.3.3209:286.6.6.61.1.1.1現(xiàn)需要在3min的窗口上統(tǒng)計出現(xiàn)的所有id使用某ip產(chǎn)生了多少條信息。使用本技術(shù)發(fā)明,將上述需求配置為一個服務規(guī)則如下:數(shù)據(jù)源map粒度reduce粒度發(fā)送到數(shù)據(jù)處理規(guī)則info_mq1min3minresult_mqgroup_by_and_count:id,sipmap節(jié)點和reduce節(jié)點都會讀取到這一規(guī)則,并將規(guī)則解析成map和reduce對應的任務。其中,數(shù)據(jù)處理規(guī)則由冒號分為兩部分:“group_by_and_count”和“id,sip”。前一部分是規(guī)則名稱,意味著我們需要對數(shù)據(jù)做分組計數(shù)的操作;后一部分是操作對象,由逗號隔開,意味著我們對“id”和“sip”兩個字段進行分組。按照規(guī)則中的粒度,map節(jié)點在每個map粒度(1min)上將id和源ip作為判斷依據(jù),相同的累加數(shù)量,不同的新建一個計數(shù),各個map節(jié)點將如下的統(tǒng)計結(jié)果發(fā)送到分布式緩存中。109:251.1.1.12109:261.1.1.11109:263.3.3.31209:274.4.4.41209:284.4.4.41209:286.6.6.61最終,reduce節(jié)點將這些結(jié)果按照reduce的粒度(最終統(tǒng)計粒度)聚合起來,產(chǎn)生如下的最終統(tǒng)計結(jié)果,發(fā)送到分布式消息隊列的指定話題中。109:251.1.1.13109:263.3.3.31209:274.4.4.42209:286.6.6.61map階段處理流程如圖9所示:1.首先從配置庫中獲取需要處理的需求號以及對應規(guī)則,并初始化對應的需求處理者;2.根據(jù)需求號從消息隊列中拉取數(shù)據(jù);3.處理完成后向消息隊列返回“消費成功”信號;4.將數(shù)據(jù)分配給各個處理者處理;5.數(shù)據(jù)處理完成后,進行如下事務操作:(1)在緩存中累加并取得該需求的mapper序列號;(2)根據(jù)該序列號將細粒度統(tǒng)計結(jié)果寫入分布式緩存;6.至此,mapper部分數(shù)據(jù)處理流程結(jié)束。reduce階段處理流程如圖10所示:1.從分布式緩存獲得要讀取的reducer序列號;2.根據(jù)該序列號從緩存中讀取多個細粒度統(tǒng)計結(jié)果;3.講數(shù)據(jù)聚合成1包最終結(jié)果;4.向消息隊列發(fā)送最終結(jié)果;5.將讀取數(shù)據(jù)后的序列號累加回分布式緩存,更新序列號;6.至此,reducer部分數(shù)據(jù)處理流程結(jié)束。當前第1頁12