一種事件觸發(fā)調(diào)度系統(tǒng)和方法
【技術領域】
[0001]本發(fā)明涉及作業(yè)流調(diào)度技術領域,尤其涉及一種事件觸發(fā)調(diào)度系統(tǒng)和方法。
【背景技術】
[0002]目前,企業(yè)生產(chǎn)過程中,一般使用工作流任務調(diào)度器對工作流任務進行調(diào)度,以實現(xiàn)企業(yè)對工作流的批量管理。
[0003]其中,Azkaban是由Linkedin開源的一個批量工作流任務調(diào)度器。為了得到想要的數(shù)據(jù),通常需要執(zhí)行很多作業(yè),一批作業(yè)執(zhí)行完畢,再將中間結果進一步處理,最后得到有價值的數(shù)據(jù),因此作業(yè)之間執(zhí)行有先后順序和依賴關系。這樣的一組作業(yè)稱為一個工作流,Azkaban就是用來構建、運行和管理工作流的工具,它提供友好的Web用戶界面來維護和跟蹤用戶的工作流程。
[0004]Azkaban由三個重要的組件組成,mysql數(shù)據(jù)庫,executor和Webserver。其中Azkaban的Webserver除了提供web頁面響應服務,還負責項目管理,認證,調(diào)度,監(jiān)控和發(fā)起執(zhí)行,它是azkaban的大腦。executor則負責作業(yè)的執(zhí)行,對執(zhí)行過程及結果進行監(jiān)控,并將執(zhí)行狀況匯報給AzkabanWebServer,兩者采用http接口進行通信。
[0005]Azkaban中的調(diào)度主要是時間觸發(fā)調(diào)度,工作流內(nèi)依賴調(diào)度執(zhí)行。而對于跨作業(yè)流,跨部門的作業(yè),或者執(zhí)行過程中對其他作業(yè)流的事件觸發(fā)并不能很好的支持。因為,Azkaban主要是創(chuàng)建一個大的作業(yè)流,包含所有的作業(yè),或者是執(zhí)行定時調(diào)度。而把所有的作業(yè)都組成一個大的作業(yè)流,無形中增加了作業(yè)流的復雜度,并且難以理解和維護,如果是跨部門合作的話,作業(yè)流溝通也是一項很大的成本。而使用定時調(diào)度的方案也有可能產(chǎn)生信息滯后性,如當某項作業(yè)產(chǎn)生錯誤執(zhí)行失敗時,而后面的定時作業(yè)還會照常執(zhí)行,就會產(chǎn)生后續(xù)的一系列錯誤,再進行作業(yè)恢復既耗時又耗力,耽誤正常的作業(yè)流程。
[0006]而在企業(yè)生產(chǎn)過程中,數(shù)據(jù)來源于多個部門,多個作業(yè)流進行交叉運算,某個部門的作業(yè)流中的部分數(shù)據(jù)可能依賴于其他部門的計算結果,因此,對于作業(yè)流外依賴azkaban支持并不是很好。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的在于提供一種事件觸發(fā)調(diào)度系統(tǒng)和方法,從而解決現(xiàn)有技術中存在的前述問題。
[0008]為了實現(xiàn)上述目的,本發(fā)明采用的技術方案如下:
[0009]一種事件觸發(fā)調(diào)度的方法,包括如下步驟:
[0010]SI,判斷當前執(zhí)行作業(yè)是否執(zhí)行成功,如果是,則轉到S2,否則,繼續(xù)執(zhí)行;
[0011]S2,獲取包括所述當前執(zhí)行作業(yè)id和狀態(tài)的待觸發(fā)作業(yè);
[0012]S3,獲取所述待觸發(fā)作業(yè)的每個狀態(tài)的統(tǒng)計數(shù),將所述當前執(zhí)行作業(yè)狀態(tài)的統(tǒng)計數(shù)增量加一并更新,得到待觸發(fā)作業(yè)第一次更新后的每個狀態(tài)的統(tǒng)計數(shù);
[0013]S4,將待觸發(fā)作業(yè)更新后的每個狀態(tài)的統(tǒng)計數(shù)均減一并更新,得到待觸發(fā)作業(yè)第二次更新后的每個狀態(tài)的統(tǒng)計數(shù);
[0014]S5,判斷待觸發(fā)作業(yè)第二次更新后的每個狀態(tài)的統(tǒng)計數(shù)是否均大于等于0,如果是,則執(zhí)行待觸發(fā)作業(yè);否則,轉到S3。
[0015]進一步地,SI之前,還包括:獲取所有作業(yè)流中所有作業(yè)子節(jié)點之間的依賴關系。
[0016]優(yōu)選地,所述獲取所有作業(yè)流中所有作業(yè)子節(jié)點之間的依賴關系之后,將依賴作業(yè)流存入redis中,則S2包括:
[0017]S201,獲取當前執(zhí)行作業(yè)的狀態(tài)state ;
[0018]S202,在 redis 中查找 key 為 state 的 set 集合;
[0019]S203,遍歷set集合中所有的數(shù)據(jù),根據(jù)當前執(zhí)行作業(yè)的id為key,執(zhí)行狀態(tài)值為field,查找包括所述當前執(zhí)行作業(yè)id和狀態(tài)的待觸發(fā)作業(yè)。
[0020]優(yōu)選地,S203中,所述當前執(zhí)行作業(yè)的id為key,執(zhí)行狀態(tài)值為field的結構為redis 中的 map 集合["p—projectid—flowid—jobid",state, O]。
[0021]優(yōu)選地,SI中,所述判斷當前執(zhí)行作業(yè)是否執(zhí)行成功,如果是,則轉到S2,同時,將當前執(zhí)行作業(yè)執(zhí)行成功的狀態(tài)存儲在隊列中,則在S5中,所述則執(zhí)行待觸發(fā)作業(yè),之后還包括,將隊列中當前執(zhí)行作業(yè)執(zhí)行成功的狀態(tài)清空,等待下一次填充。
[0022]進一步地,SI和S2之間還包括步驟:調(diào)用觸發(fā)調(diào)度系統(tǒng)的http接口:http://hosts:port/trigger ? project = PROJECTID&flow = FLOWID&job = JOBID&state =STATE,填充參數(shù),然后發(fā)送請求到調(diào)度系統(tǒng)。
[0023]一種事件觸發(fā)調(diào)度系統(tǒng),包括:
[0024]計算模塊:用于在待觸發(fā)作業(yè)的狀態(tài)中,將所述當前執(zhí)行作業(yè)狀態(tài)的統(tǒng)計數(shù)增量加一并更新;還用于將待觸發(fā)作業(yè)更新后的每個狀態(tài)的統(tǒng)計數(shù)均減一并更新;
[0025]判斷模塊:用于判斷當前執(zhí)行作業(yè)是否執(zhí)行成功,還用于判斷待觸發(fā)作業(yè)第二次更新后的每個狀態(tài)的統(tǒng)計數(shù)是否均大于等于O ;
[0026]當前執(zhí)行作業(yè)模塊:用于獲取當前執(zhí)行作業(yè)的id和狀態(tài);
[0027]待觸發(fā)作業(yè)模塊:用于獲取待觸發(fā)作業(yè)的id和狀態(tài)。
[0028]進一步地,還包括
[0029]存儲模塊:用于存儲所有作業(yè)流中所有作業(yè)子節(jié)點之間的依賴關系;還用于存儲當前執(zhí)行作業(yè)執(zhí)行成功的狀態(tài)。
[0030]進一步地,還包括
[0031]查找模塊:用于在redis中查找key為state的set集合;還用于遍歷set集合中所有的數(shù)據(jù),根據(jù)當前執(zhí)行作業(yè)的id為key,執(zhí)行狀態(tài)值為field,查找包括所述當前執(zhí)行作業(yè)id和狀態(tài)的待觸發(fā)作業(yè)。
[0032]進一步地,還包括
[0033]接口模塊:用于調(diào)用觸發(fā)調(diào)度系統(tǒng)的http接口。
[0034]本發(fā)明的有益效果是:本發(fā)明實施例提供的事件觸發(fā)調(diào)度系統(tǒng)和方法,是根據(jù)實際生產(chǎn)中,上一項作業(yè)執(zhí)行成功之后才執(zhí)行下一項的原則而開發(fā)的,所以,符合企業(yè)數(shù)據(jù)流的處理規(guī)范,不會出現(xiàn)上一項執(zhí)行失敗而執(zhí)行下一項的情況,避免了后續(xù)產(chǎn)生一系列的錯誤,同時,由于通過事件觸發(fā)下一項任務的執(zhí)行,所以,作業(yè)流簡單,減少了資源的浪費與占用。
【附圖說明】
[0035]圖1是本發(fā)明實施例提供的事件觸發(fā)調(diào)度方法流程示意圖;
[0036]圖2是本發(fā)明實施例提供的事件觸發(fā)調(diào)度系統(tǒng)的結構示意圖。
【具體實施方式】
[0037]為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖,對本發(fā)明進行進一步詳細說明。應當理解,此處所描述的【具體實施方式】僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0038]本發(fā)明主要是針對azkaban為主的調(diào)度系統(tǒng)的依賴關系進行改進,改進了對作業(yè)流的外部調(diào)用。提出的解決方案主要為:在執(zhí)行作業(yè)流時,對作業(yè)流中每個作業(yè)子節(jié)點的執(zhí)行作態(tài)存儲到隊列中,當隊列中某個狀態(tài)的產(chǎn)生正好觸發(fā)某個其他作業(yè)流的執(zhí)行條件,就觸發(fā)另一條作業(yè)流的執(zhí)行,并把存儲隊列清空,進行下一次等待。
[0039]本發(fā)明技術的關鍵點在于對現(xiàn)有的任務調(diào)度設計方案進行了擴展,增強適應業(yè)務復雜度的能力。在本發(fā)明中,使用redis作為存儲容器,并對job結果狀態(tài)的累積值做加減運算。當執(zhí)行完發(fā)送一個狀態(tài)值時,相應的作業(yè)狀態(tài)值累計數(shù)加一,判斷某條作業(yè)流所有的依賴值的累計數(shù)是否都大于0,如果都大于0,則執(zhí)行一次,并遍歷減一,否則,進行下一次等待。
[0040]具體的技術方案詳述如下。
[0041]實施例一
[0042]如圖1所示,本發(fā)明實施例提供了一種事件觸發(fā)調(diào)度的方法,包括如下步驟:
[0043]SI,判斷當前執(zhí)行作業(yè)是否執(zhí)行成功,如果是,則轉到S2,否則,繼續(xù)執(zhí)行;
[0044]S2,獲取包括所述當前執(zhí)行作業(yè)id和狀態(tài)的待觸發(fā)作業(yè);
[0045]S3,獲取所述待觸發(fā)作業(yè)的每個狀態(tài)的統(tǒng)計數(shù),將所述當前執(zhí)行作業(yè)狀態(tài)的統(tǒng)計數(shù)增量加一并更新,得到待觸發(fā)作業(yè)第一次更新后的每個狀態(tài)的統(tǒng)計數(shù);
[0046]S4,將待觸發(fā)作業(yè)更新后的每個狀態(tài)的統(tǒng)計數(shù)均減一并更新,得到待觸發(fā)作業(yè)第二次更新后的每個狀態(tài)的統(tǒng)計數(shù);
[0047]S5,判斷待觸發(fā)作業(yè)第二次更新后的每個狀態(tài)的統(tǒng)計數(shù)是否均大于等于0,如果是,則執(zhí)行待觸發(fā)作業(yè);否則,轉到S3。
[0048]在本發(fā)明的一個優(yōu)選實施例中,SI之前,還包括:獲取所有作業(yè)流中所有作業(yè)子節(jié)點之間的依賴關系。
[0049]在實際的企業(yè)生產(chǎn)中,可能存在多個作業(yè)流,而每個作業(yè)流中的作業(yè)子節(jié)點之間可能存在依賴關系,所以,可以通過該依賴關系,完成對另一個作業(yè)流的觸發(fā)調(diào)度。
[0050]在本發(fā)明的一個更加優(yōu)選實施例中,所述獲取所有作業(yè)流中所有作業(yè)子節(jié)點之間的依賴關系之后,將依賴作業(yè)流存入redis中,則S2包括:
[0051]S201,獲取當前執(zhí)行作業(yè)的狀態(tài)state ;
[0052]S202,在 redis 中查找 key 為 state 的 set 集合;
[0053]S203,遍歷set集合中所有的數(shù)據(jù),根據(jù)當前執(zhí)行作業(yè)的id為key,執(zhí)行狀態(tài)值為field,查找包括所述當前執(zhí)行作業(yè)id和狀態(tài)的待觸發(fā)作業(yè)。
[0054]本發(fā)明中采用的是redis作為存儲,因為redis可支持的存儲結構可以很好的滿足作業(yè)狀態(tài)的存儲類型。如本領域技術人員可以理解的,不同企業(yè)或不同場景也可以根據(jù)自身的環(huán)境選擇其他存儲組件進行開發(fā)調(diào)用,常見的其他存儲組件有zookeeper, mysql, ZeroMQ 等。
[0055]其中,S203中,所述當前執(zhí)行作業(yè)的id為key,執(zhí)行狀態(tài)值為field的結構為redis 中的 map 集合["p—projectid—flowid—jobid",state, 0]。
[0056]在本發(fā)明的一個優(yōu)選實施例中,SI中,所述判斷當前執(zhí)行作業(yè)是否執(zhí)行成功,如果是,則轉到S2,同時,將當前執(zhí)行作業(yè)執(zhí)行成功的狀態(tài)存儲在隊列中,則在S5中,所述則執(zhí)行待觸發(fā)作業(yè),之后還包括,將隊列中當前執(zhí)行作業(yè)執(zhí)行成功的狀態(tài)清空,等待下一次填充。
[0057]在本發(fā)明的另一個優(yōu)選實施例中,SI和S2之間還包括步驟:調(diào)用觸發(fā)調(diào)度系統(tǒng)的http 接 P:
[0058]http://hosts:port/trigger ? project = PROJECTID&flow = FLOWID&job =JOBID&st ate = STATE,填充參數(shù),然后發(fā)送請求到調(diào)度系統(tǒng)。
[0059]上述實施例的實際操作過程可以為:
[0060]步驟一,把作業(yè)流依賴存入redis中。
[0061]步驟二,當其中一個作業(yè)流:A作業(yè)流中的作業(yè)子節(jié)點任務a-ljob執(zhí)行成功后,調(diào)用觸發(fā)調(diào)度系統(tǒng)的http接口:
[0062]http://hosts:port/trigger ? project = PROJECTID&flow = FLOWID&job =JOBID&st ate = STATE,填充參數(shù)后發(fā)送請求