本發(fā)明屬于大數(shù)據(jù)處理,具體涉及一種基于責(zé)任鏈快速構(gòu)造器的大數(shù)據(jù)流批一體處理架構(gòu)方法。
背景技術(shù):
1、流批一體技術(shù)主要涉及到大數(shù)據(jù)處理領(lǐng)域的兩個主要處理模式:流處理和批處理,以及它們之間的整合。這種技術(shù)理念旨在通過統(tǒng)一的技術(shù)框架和工具,同時支持這兩種處理模式,以提高數(shù)據(jù)處理效率和數(shù)據(jù)一致性。流處理主要處理實(shí)時數(shù)據(jù)流,而批處理則處理歷史數(shù)據(jù)。流批一體技術(shù)通過整合這兩種處理模式,使得企業(yè)能夠更高效地處理和分析數(shù)據(jù),同時保持?jǐn)?shù)據(jù)的一致性和可靠性。
2、流批一體技術(shù)的理念和實(shí)踐背景可以追溯到大數(shù)據(jù)技術(shù)的發(fā)展歷程中。隨著企業(yè)對數(shù)據(jù)處理速度和實(shí)時性要求的提高,流處理技術(shù)逐漸成為主流,但與此同時,批處理技術(shù)仍然有其不可替代的作用,尤其是在歷史數(shù)據(jù)的分析和處理方面。因此,流批一體技術(shù)的提出,旨在解決流處理和批處理各自為政的問題,通過統(tǒng)一的計算引擎和開發(fā)框架,實(shí)現(xiàn)兩種處理模式的無縫銜接和高效協(xié)同。
3、在技術(shù)實(shí)現(xiàn)上,流批一體技術(shù)通過采用統(tǒng)一的計算引擎、語義開發(fā)層的統(tǒng)一、以及數(shù)據(jù)存儲和處理邏輯的統(tǒng)一,來保證數(shù)據(jù)的一致性和處理的效率。
4、責(zé)任鏈?zhǔn)且环N設(shè)計模式,它允許請求在多個對象之間傳遞,直到找到能夠處理該請求的對象:
5、1.動態(tài)分配責(zé)任:責(zé)任鏈模式允許系統(tǒng)在運(yùn)行時動態(tài)地重新組織和分配責(zé)任,這意味著請求的處理者可以在不改變客戶端代碼的情況下被替換或添加。這種靈活性使得系統(tǒng)更加可擴(kuò)展和維護(hù)。
6、2.請求傳遞:在責(zé)任鏈中,請求從一個對象傳遞到下一個對象,直到找到能夠處理該請求的對象。這種傳遞機(jī)制可以確保每個請求都能得到處理,避免了某些請求被忽略的情況。
7、3.解耦:通過將請求的處理邏輯從客戶端代碼中分離出來,責(zé)任鏈模式減少了客戶端與處理對象之間的耦合度。這使得客戶端不需要了解具體是哪個對象處理了請求,從而提高了系統(tǒng)的可維護(hù)性和可擴(kuò)展性。
8、4.適用于處理多個對象的場景:當(dāng)一個問題或請求需要由多個對象按照一定順序處理時,責(zé)任鏈模式非常有用。例如,在請假審批流程中,不同的管理層級可以根據(jù)各自的權(quán)限審批不同級別的請假申請。
9、5.抽象和具體處理者:責(zé)任鏈模式包括抽象處理者角色和具體處理者角色。抽象處理者定義了一個處理請求的接口,而具體處理者則實(shí)現(xiàn)了這個接口并決定是否處理請求或?qū)⑵鋫鬟f給下一個處理者。
10、在《一種基于流批一體的大數(shù)據(jù)批量計算的優(yōu)化計算方法》中根據(jù)業(yè)務(wù)訴求確定字段組合,將數(shù)據(jù)流按照所述字段組合進(jìn)行分組,以形成多組不同的數(shù)據(jù)流,將多組不同的數(shù)據(jù)流分別在keyedprocessfunction中按照呈階梯遞減的時間窗口進(jìn)行計算,以處理數(shù)據(jù)邏輯。當(dāng)計算完成時,輸出符合所述業(yè)務(wù)訴求的數(shù)據(jù)子集。
11、現(xiàn)有技術(shù)的缺點(diǎn)如下:
12、1.架構(gòu)和業(yè)務(wù)維護(hù)成本高:流批一體的實(shí)現(xiàn)可能涉及到不同的技術(shù)和工具,這增加了架構(gòu)和業(yè)務(wù)的維護(hù)成本。
13、2.數(shù)據(jù)轉(zhuǎn)換耦合性強(qiáng):數(shù)據(jù)處理過程中存在多個轉(zhuǎn)換算子、過程,且多個算子間耦合性較強(qiáng),不利于通用架構(gòu)的構(gòu)建。
14、3.調(diào)試?yán)щy:上述方案涉及較長且包含多個環(huán)節(jié)的處理過程,調(diào)試過程可能會變得非常復(fù)雜。
15、4.應(yīng)用構(gòu)建速度低:該技術(shù)權(quán)利要求書中涉及的多個過程很難將其靈活的按照用戶所需快速構(gòu)建用于生產(chǎn)的應(yīng)用軟件;
16、5.該技術(shù)主要對批量計算場景的優(yōu)化,沒有針對流批一體框架的編碼主體進(jìn)行架構(gòu)優(yōu)化。
17、目前流批一體架構(gòu)中進(jìn)行數(shù)據(jù)轉(zhuǎn)換的多個transformer過程中多是采用在代碼中將多個transform方法進(jìn)行手動疊加處理,這在大規(guī)模并行開發(fā)場景中會造成代碼實(shí)現(xiàn)沖突、架構(gòu)不夠清晰,并且在transform先后順序在需要調(diào)整時需要改動原始代碼。
技術(shù)實(shí)現(xiàn)思路
1、為了克服現(xiàn)有技術(shù)的不足,本發(fā)明提供了一種基于責(zé)任鏈快速構(gòu)造器的大數(shù)據(jù)流批一體處理架構(gòu)方法,首先,架構(gòu)需要申請讀取數(shù)據(jù)流、文件流,進(jìn)行執(zhí)行環(huán)境的初始化;第二步,在數(shù)據(jù)變換過程中進(jìn)行數(shù)據(jù)的映射和key值分組等操作;第三步,執(zhí)行責(zé)任鏈,通過在每個工作節(jié)點(diǎn)新建職責(zé)鏈對象并對滾動窗口中的批量數(shù)據(jù)進(jìn)行批量處理;第四步,對經(jīng)過責(zé)任鏈的數(shù)據(jù)進(jìn)行聚合計算,輸出統(tǒng)計數(shù)據(jù);最后,將轉(zhuǎn)換過程中的產(chǎn)生的數(shù)據(jù)輸出到sink端輸出到消息隊(duì)列系統(tǒng)。本發(fā)明簡化了對象,降低了模塊間的耦合度,增強(qiáng)了對象指派職責(zé)的靈活性,可快捷的構(gòu)建通用的分布式軟件架構(gòu),同時,構(gòu)造了在不同模式下的運(yùn)行入口,簡化了開發(fā)人員和工程部署人員的工作流程。
2、本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案如下:
3、步驟1:初始化引擎環(huán)境;
4、包括鏈接數(shù)據(jù)源、初始化運(yùn)行環(huán)境、責(zé)任鏈handler初始化和啟動流批一體引擎四個步驟;
5、步驟1-1:鏈接數(shù)據(jù)源;
6、通過設(shè)置抽象函數(shù)streamexecutionenvironment初始化流批一體引擎的執(zhí)行環(huán)境,通過addsource操作將數(shù)據(jù)源加載到執(zhí)行環(huán)境中;
7、步驟1-2:初始化運(yùn)行環(huán)境;
8、通過定義flashtransform(t?datastream,u?factory)作為引擎變量,第一個參數(shù)為輸入數(shù)據(jù)流,第二個是責(zé)任鏈對象;同時繼承引擎中的通用引擎接口abstractengine進(jìn)行引擎的初始化,創(chuàng)建調(diào)測模式、集群模式、文件模式,在不同角色的軟件生態(tài)圈,針對開發(fā)人員和工程人員設(shè)置與之相應(yīng)的工作模式進(jìn)行,并且在選擇執(zhí)行模式的同時引擎創(chuàng)建輸入流;
9、步驟1-3:責(zé)任鏈初始化;
10、責(zé)任鏈在引擎執(zhí)行前完成初始化,實(shí)現(xiàn)messagehandlerfactory責(zé)任鏈接口中的createhandler方法,并且將責(zé)任鏈的構(gòu)造用時輸出日志,方便運(yùn)維人員實(shí)時監(jiān)測鏈條中的各個環(huán)節(jié)是否正常運(yùn)行;
11、步驟1-4:啟動流批一體引擎;
12、通過調(diào)用步驟1-2的引擎變量,同時繼承engine接口的start方法,進(jìn)行引擎的啟動;
13、步驟2:進(jìn)行transformer操作;
14、對接入的數(shù)據(jù)流進(jìn)行負(fù)載均衡rebalance;負(fù)載均衡對所有的并行子任務(wù)進(jìn)行輪詢分配,對不同線程讀取的散列的數(shù)據(jù)進(jìn)行打散重分組,幫助軟件在分布式環(huán)境中實(shí)現(xiàn)公平性和容錯性;
15、步驟3:對數(shù)據(jù)進(jìn)行map循環(huán)映射設(shè)定key值;
16、首先定義變量random,其次調(diào)用map方法對散列在工作節(jié)點(diǎn)的數(shù)據(jù)調(diào)用random.next(100)設(shè)置隨機(jī)數(shù);
17、步驟4:設(shè)置時間戳和生成水??;
18、允許事件時間為較晚的事件設(shè)置較晚的時間戳,但僅在這些事件與當(dāng)前處理時間的差值不超過指定的容忍度時才允許框架需要知曉每個元素的時間戳和了解事件時間的進(jìn)度,以確定那些元素已經(jīng)被處理;
19、步驟5:按照框架要求,對數(shù)據(jù)進(jìn)行步驟3的key值設(shè)定和分組用于實(shí)現(xiàn)基于key的聚合操作,通過對key的值進(jìn)行hash取模運(yùn)算,對數(shù)據(jù)進(jìn)行hash分區(qū)操作生成keyedstream數(shù)據(jù)流對象;
20、步驟6:申請滾動處理時間窗口(tumblingprocessingtimewindows);
21、基于數(shù)據(jù)處理時間的窗口類型,將數(shù)據(jù)分組成固定大小的窗格,每個窗格都是不重疊的;窗格的開始時間是根據(jù)數(shù)據(jù)處理時間來確定的,控制批量數(shù)據(jù)的數(shù)據(jù)規(guī)模,在流式處理過程中積攢用戶設(shè)定時間的數(shù)據(jù)作為批量步驟8的數(shù)據(jù)來源;
22、步驟7:初始化責(zé)任鏈鏈條;
23、在步驟6的時間窗口處理中通過process函數(shù)操作調(diào)用責(zé)任鏈的初始化方法,函數(shù)參數(shù)為context、iterable<t>、collector<tuple2<string,long>>,在初始化鏈條時定義messagehandlerfactory接口,接口中定義createhandler()方法,鏈條的基礎(chǔ)對象為apachechainhandler,通過定義chain-config.xml配置文件中的配置項(xiàng)來設(shè)置鏈條的執(zhí)行功能,將這些功能都通過addcommand()方法加入到初始化鏈條對象中,在添加對象的同時會初始化鏈條中的執(zhí)行器對象對所定義的類對象進(jìn)行快速初始化,在執(zhí)行器的構(gòu)造中會進(jìn)行必要的使用對象的初始化和一些靜態(tài)對象的一次初始化,以后再調(diào)用中不再需要對這些對象再次進(jìn)行,此操作會加速構(gòu)造鏈條,再通過execute方法執(zhí)行鏈條,責(zé)任鏈鏈條在數(shù)據(jù)對象產(chǎn)生時重新生成,每批數(shù)據(jù)都會生成新的鏈條,包含鏈條中需要初始化的臨時對象,最終通過定義的返回數(shù)據(jù)結(jié)構(gòu)collector<tuple2<string,long>>將執(zhí)行結(jié)果返回;
24、步驟8:組織批量數(shù)據(jù);
25、對來源自步驟6中的滾動窗口中的數(shù)據(jù)設(shè)置接收列表,并將這批數(shù)據(jù)塞到列表中作為責(zé)任鏈條執(zhí)行時的數(shù)據(jù)對象,這些數(shù)據(jù)對象會被以引用的方式在鏈條中傳遞,其中包括數(shù)據(jù)的刪除、復(fù)制、修改;
26、步驟9:職責(zé)鏈的觸發(fā)執(zhí)行;
27、在執(zhí)行過程中多個處理模塊繼承同一處理接口commandbase,接口中定義了excute和close兩個主要方法,各模塊接收批量數(shù)據(jù)對象進(jìn)行相應(yīng)的處理,需要注意下一鏈條接收的數(shù)據(jù)是引用上一鏈條更新過的數(shù)據(jù)對象,這樣能夠保證數(shù)據(jù)處理的先后順序和數(shù)據(jù)對象的唯一性,執(zhí)行完后通過close()方法對職責(zé)鏈資源申請的其他資源進(jìn)行回收,同時銷毀該鏈條;
28、步驟10:經(jīng)過步驟8后的數(shù)據(jù)進(jìn)行重新key值分組,該步驟的key值針對處理后的數(shù)據(jù)進(jìn)行聚合統(tǒng)計;
29、步驟11:再次申請滾動執(zhí)行時間窗口,用于統(tǒng)計輸出頻率設(shè)置,控制輸出數(shù)據(jù)流的聚合時間;
30、步驟12:對步驟11產(chǎn)生的輸出數(shù)據(jù)按照key值進(jìn)行聚合reduce操作,并對步驟7輸出的二元組數(shù)據(jù)(tuple2<string,long>),按照二元組數(shù)據(jù)的元素1分組對元素2進(jìn)行count統(tǒng)計,輸出二元組數(shù)據(jù);
31、步驟13:打印步驟12輸出的二元組數(shù)據(jù),該步驟完成后框架同時結(jié)束transformer操作;
32、步驟14:sink操作將數(shù)據(jù)輸出到kafka消息流:通過繼承sinkfunction接口的kafkasink,再通過設(shè)置kafka的鏈接參數(shù)setkafkaproducerconfig和序列化參數(shù)setrecordserializer,最后設(shè)置kafka地址信息setbootstrapservers,最終通過實(shí)現(xiàn)sink接口的invoke方法將數(shù)據(jù)持續(xù)輸出到kafka中。
33、優(yōu)選地,所述步驟2中的輸入的流數(shù)據(jù)是kafka實(shí)時流消息數(shù)據(jù)、離線批量數(shù)據(jù)文件。
34、本發(fā)明的有益效果如下:
35、本發(fā)明克服了大數(shù)據(jù)處理架構(gòu)中工作模式單一,同軟件各模塊間不能靈活拆裝的痛點(diǎn)問題,實(shí)現(xiàn)了:1)流批一體架構(gòu)和責(zé)任鏈設(shè)計模式的融合;2)靈活的拆裝功能模塊,即插即用的處理架構(gòu);打破了流批一體架構(gòu)和責(zé)任鏈設(shè)計模式深度融合的瓶頸,實(shí)現(xiàn)了快速構(gòu)建大數(shù)據(jù)處理領(lǐng)域在流式處理架構(gòu)中引入責(zé)任鏈模式,為大數(shù)據(jù)應(yīng)用的快速上線提供一種開放,敏捷,高效,統(tǒng)一的架構(gòu)開發(fā)方法;3)快速的構(gòu)建責(zé)任鏈模式,克服了基本責(zé)任鏈模式中因?yàn)轭l繁消費(fèi)鏈條而造成的資源額外占用;4)多場景的運(yùn)行模式的應(yīng)用,使得同時適應(yīng)開發(fā)人員和運(yùn)維人員的通用框架。