本申請(qǐng)涉及信息
技術(shù)領(lǐng)域:
,尤其涉及一種實(shí)時(shí)處理引擎的自動(dòng)故障恢復(fù)技術(shù)。
背景技術(shù):
:隨著大數(shù)據(jù)技術(shù)的發(fā)展,企業(yè)能夠存儲(chǔ)和處理的比以往更大規(guī)模的數(shù)據(jù)量,達(dá)到TB甚至PB級(jí)別。目前企業(yè)在海量數(shù)據(jù)上實(shí)現(xiàn)主要是離線(xiàn)分析業(yè)務(wù),這類(lèi)業(yè)務(wù)從數(shù)據(jù)的產(chǎn)生到結(jié)果的生成往往需要T+1甚至更長(zhǎng)的周期。對(duì)很多對(duì)實(shí)時(shí)性要求很高的行業(yè)來(lái)說(shuō),這是不能滿(mǎn)足他們的業(yè)務(wù)要求的。如何更快地處理數(shù)據(jù)、更實(shí)時(shí)地反饋結(jié)果是大數(shù)據(jù)領(lǐng)域急需解決的問(wèn)題。實(shí)時(shí)處理引擎的出現(xiàn)為滿(mǎn)足企業(yè)實(shí)時(shí)地處理大數(shù)據(jù)的需求提供了可能,通過(guò)實(shí)時(shí)處理引擎,能夠幫助企業(yè)進(jìn)行ETL、實(shí)時(shí)報(bào)表分析、甚至實(shí)時(shí)機(jī)器學(xué)習(xí)等工作。目前市面上主流的幾個(gè)分布式實(shí)時(shí)處理引擎包括:ApacheFlink,SparkStreaming等,用戶(hù)通過(guò)這些引擎提供的API接口可以實(shí)現(xiàn)有實(shí)時(shí)性需求業(yè)務(wù)。實(shí)時(shí)處理和傳統(tǒng)的批處理業(yè)務(wù)有很大的不同,其中最重要的一點(diǎn)是實(shí)時(shí)處理業(yè)務(wù)處理的是沒(méi)有邊界的數(shù)據(jù),即數(shù)據(jù)時(shí)源源不斷的,客戶(hù)通常要求實(shí)時(shí)處理業(yè)務(wù)7×24不間斷的運(yùn)行。但是由于分布式系統(tǒng)都會(huì)因?yàn)榉N種如網(wǎng)絡(luò)、硬件故障原因?qū)е峦V狗?wù),在這種情況下需要能夠及時(shí)發(fā)現(xiàn),保證數(shù)據(jù)不發(fā)生丟失,最短的時(shí)間內(nèi)進(jìn)行故障恢復(fù)。目前如ApacheFlink以及SparkStreaming等這些主流實(shí)時(shí)處理引擎,雖然都有提供機(jī)制保證數(shù)據(jù)的可靠性,但是都沒(méi)有提供一套完整的自動(dòng)故障恢復(fù)服務(wù)。申請(qǐng)內(nèi)容本申請(qǐng)的一個(gè)目的是提供一種實(shí)時(shí)處理引擎的自動(dòng)故障恢復(fù)技術(shù)。為實(shí)現(xiàn)上述目的,本申請(qǐng)?zhí)峁┝艘环N實(shí)時(shí)處理引擎的故障恢復(fù)方法,該方法包括:在獲取到同步鎖時(shí),成為主服務(wù)器;在執(zhí)行實(shí)時(shí)處理應(yīng)用時(shí),記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以使備服務(wù)器在成為主服務(wù)器時(shí),通過(guò)獲取所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用;在發(fā)生故障時(shí),釋放所述同步鎖,以觸發(fā)備服務(wù)器申請(qǐng)所述同步鎖。進(jìn)一步地,該方法還包括:在未獲取到所述同步鎖時(shí),成為備服務(wù)器;在主服務(wù)器釋放同步鎖時(shí),申請(qǐng)所述同步鎖;在通過(guò)申請(qǐng)獲取到主服務(wù)器釋放的同步鎖時(shí),成為新的主服務(wù)器;獲取所述應(yīng)用信息,并根據(jù)所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。進(jìn)一步地,所述實(shí)時(shí)處理應(yīng)用中,通過(guò)SQL語(yǔ)句定義關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作。進(jìn)一步地,關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作,包括:創(chuàng)建所述實(shí)時(shí)處理應(yīng)用的操作;對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作。進(jìn)一步地,該方法還包括:在獲取實(shí)時(shí)處理應(yīng)用的創(chuàng)建請(qǐng)求時(shí),通過(guò)元數(shù)據(jù)存儲(chǔ)將所述實(shí)時(shí)處理應(yīng)用持久化保存至數(shù)據(jù)庫(kù)中。進(jìn)一步地,執(zhí)行實(shí)時(shí)處理應(yīng)用,包括:獲取所述實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句;根據(jù)所述SQL語(yǔ)句獲取對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的操作符;將所述操作符提交至計(jì)算集群,由所述計(jì)算集群執(zhí)行所述操作符,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的實(shí)時(shí)處理操作。進(jìn)一步地,獲取所述實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句,包括:通過(guò)元數(shù)據(jù)存儲(chǔ)從數(shù)據(jù)庫(kù)獲取所述實(shí)時(shí)處理應(yīng)用;獲取所述實(shí)時(shí)處理應(yīng)用中用于對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的SQL語(yǔ)句。進(jìn)一步地,記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,包括:在協(xié)調(diào)服務(wù)系統(tǒng)中創(chuàng)建記錄節(jié)點(diǎn),向所述記錄節(jié)點(diǎn)中寫(xiě)入關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。進(jìn)一步地,該方法還包括:在停止執(zhí)行所述實(shí)時(shí)處理應(yīng)用時(shí),刪除協(xié)調(diào)服務(wù)系統(tǒng)中所述實(shí)時(shí)處理應(yīng)用對(duì)應(yīng)的應(yīng)用信息以及記錄節(jié)點(diǎn)。進(jìn)一步地,獲取所述應(yīng)用信息,包括:從協(xié)調(diào)服務(wù)系統(tǒng)的記錄節(jié)點(diǎn)中,讀取關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息?;诒旧暾?qǐng)的另一方面,還提供了一種實(shí)時(shí)處理引擎的故障恢復(fù)服務(wù)器,該服務(wù)器包括:切換裝置,用于在獲取到同步鎖時(shí),使本服務(wù)器成為主服務(wù)器,以及在發(fā)生故障時(shí),釋放所述同步鎖,以觸發(fā)備服務(wù)器申請(qǐng)所述同步鎖;實(shí)時(shí)處理裝置,用于在執(zhí)行實(shí)時(shí)處理應(yīng)用時(shí),記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以使備服務(wù)器在成為主服務(wù)器時(shí),通過(guò)獲取所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。進(jìn)一步地,所述切換裝置,還用于在未獲取到所述同步鎖時(shí),使本服務(wù)器成為備服務(wù)器;在主服務(wù)器釋放同步鎖時(shí),申請(qǐng)所述同步鎖;以及在通過(guò)申請(qǐng)獲取到主服務(wù)器釋放的同步鎖時(shí),使本服務(wù)器成為新的主服務(wù)器;所述實(shí)時(shí)處理裝置,還用于獲取所述應(yīng)用信息,并根據(jù)所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。進(jìn)一步地,所述實(shí)時(shí)處理應(yīng)用中,通過(guò)SQL語(yǔ)句定義關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作。進(jìn)一步地,關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作,包括:創(chuàng)建所述實(shí)時(shí)處理應(yīng)用的操作;對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作。進(jìn)一步地,所述實(shí)時(shí)處理裝置,還用于在獲取實(shí)時(shí)處理應(yīng)用的創(chuàng)建請(qǐng)求時(shí),通過(guò)元數(shù)據(jù)存儲(chǔ)將所述實(shí)時(shí)處理應(yīng)用持久化保存至數(shù)據(jù)庫(kù)中。進(jìn)一步地,所述實(shí)時(shí)處理裝置,用于獲取所述實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句;根據(jù)所述SQL語(yǔ)句獲取對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的操作符;以及將所述操作符提交至計(jì)算集群,由所述計(jì)算集群執(zhí)行所述操作符,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的實(shí)時(shí)處理操作。進(jìn)一步地,所述實(shí)時(shí)處理裝置,用于通過(guò)元數(shù)據(jù)存儲(chǔ)從數(shù)據(jù)庫(kù)獲取所述實(shí)時(shí)處理應(yīng)用;以及獲取所述實(shí)時(shí)處理應(yīng)用中用于對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的SQL語(yǔ)句。進(jìn)一步地,所述實(shí)時(shí)處理裝置,用于在協(xié)調(diào)服務(wù)系統(tǒng)中創(chuàng)建記錄節(jié)點(diǎn),向所述記錄節(jié)點(diǎn)中寫(xiě)入關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。進(jìn)一步地,所述實(shí)時(shí)處理裝置,還用于在停止執(zhí)行所述實(shí)時(shí)處理應(yīng)用時(shí),刪除協(xié)調(diào)服務(wù)系統(tǒng)中所述實(shí)時(shí)處理應(yīng)用對(duì)應(yīng)的應(yīng)用信息以及記錄節(jié)點(diǎn)。進(jìn)一步地,所述實(shí)時(shí)處理裝置,用于從協(xié)調(diào)服務(wù)系統(tǒng)的記錄節(jié)點(diǎn)中,讀取關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。與現(xiàn)有技術(shù)相比,本申請(qǐng)?zhí)峁┑姆桨钢?,任意一個(gè)服務(wù)器在啟動(dòng)時(shí)若獲取到同步鎖,則成為主服務(wù)器對(duì)外提供服務(wù);在主服務(wù)器對(duì)外提供服務(wù)器的過(guò)程中,若發(fā)生故障,主服務(wù)器將釋放所述同步鎖,以觸發(fā)備服務(wù)器申請(qǐng)所述同步鎖,使得備服務(wù)器可以獲取到同步鎖從而成為新的主服務(wù)器,此外,主服務(wù)器在執(zhí)行實(shí)時(shí)處理應(yīng)用時(shí),記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以使備服務(wù)器在成為主服務(wù)器時(shí),通過(guò)獲取所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用,從而實(shí)現(xiàn)故障的自動(dòng)恢復(fù)。附圖說(shuō)明通過(guò)閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本申請(qǐng)的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:圖1為本申請(qǐng)實(shí)施例中基于Zookeeper實(shí)現(xiàn)主備模式啟動(dòng)的示意圖;圖2為本申請(qǐng)實(shí)施例中實(shí)時(shí)處理任務(wù)的數(shù)據(jù)流圖;圖3為本申請(qǐng)實(shí)施例中利用Zookeeper進(jìn)行實(shí)時(shí)處理應(yīng)用狀態(tài)追蹤的示意圖;圖4為本申請(qǐng)實(shí)施例中基于Zookeeper實(shí)現(xiàn)故障恢復(fù)的示意圖;圖5為本申請(qǐng)實(shí)施例中服務(wù)器創(chuàng)建實(shí)時(shí)處理應(yīng)用的處理流程圖;圖6為本申請(qǐng)實(shí)施例中主服務(wù)器執(zhí)行實(shí)時(shí)處理應(yīng)用的處理流程圖;圖7為本申請(qǐng)實(shí)施例中提供的一種實(shí)時(shí)處理引擎的故障恢復(fù)服務(wù)器的示意圖;附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。具體實(shí)施方式下面結(jié)合附圖對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)描述。在本申請(qǐng)一個(gè)典型的配置中,終端、服務(wù)網(wǎng)絡(luò)的設(shè)備均包括一個(gè)或多個(gè)處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(RAM)和/或非易失性?xún)?nèi)存等形式,如只讀存儲(chǔ)器(ROM)或閃存(flashRAM)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體,可以由任何方法或技術(shù)來(lái)實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、其他類(lèi)型的隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、電可擦除可編程只讀存儲(chǔ)器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤(pán)(CD-ROM)、數(shù)字多功能光盤(pán)(DVD)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁盤(pán)存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪(fǎng)問(wèn)的信息。本申請(qǐng)實(shí)施例提供了一種實(shí)時(shí)處理引擎的故障恢復(fù)方法,該方法所適用的實(shí)時(shí)處理引擎中包含多個(gè)服務(wù)器,實(shí)時(shí)處理引擎啟動(dòng)時(shí),多個(gè)服務(wù)器會(huì)同時(shí)啟動(dòng)去申請(qǐng)同步鎖(Lock)。對(duì)于任意一個(gè)服務(wù)器(Server),在獲取到同步鎖時(shí),成為主服務(wù)器(ActiveServer)。所述主服務(wù)器能夠獲得計(jì)算集群的資源使用權(quán),對(duì)外提供服務(wù),即實(shí)時(shí)處理引擎的數(shù)據(jù)處理功能,均由主服務(wù)器通過(guò)調(diào)用計(jì)算集群的資源來(lái)實(shí)現(xiàn);而相應(yīng)地,若服務(wù)器未獲取到所述同步鎖,則將成為備服務(wù)器(StandbyServer),所述備服務(wù)器不獲得計(jì)算集群的資源使用權(quán),不對(duì)外提供服務(wù)。在實(shí)際場(chǎng)景中,所述服務(wù)器會(huì)向協(xié)調(diào)服務(wù)系統(tǒng)Zookeeper申請(qǐng)同步鎖,而所述計(jì)算集群可以為SparkCluster。在服務(wù)器獲得計(jì)算集群的資源使用權(quán)時(shí),可以通過(guò)SparkCluster提供的執(zhí)行器Executor來(lái)完成相應(yīng)的實(shí)時(shí)處理任務(wù),具體如圖1所示。實(shí)時(shí)處理引擎剛啟動(dòng)時(shí),兩個(gè)服務(wù)器同時(shí)啟動(dòng),并向Zookeeper去申請(qǐng)一把同步鎖,獲得同步鎖的服務(wù)器成為ActiveServer,并開(kāi)始提供服務(wù),并獲得SparkCluster的資源使用權(quán),另外一個(gè)未獲取到同步鎖的服務(wù)器則成為StandbyServer。在此,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,圖中示出的各類(lèi)元素的數(shù)量可能小于實(shí)際場(chǎng)景中相應(yīng)元素的數(shù)量(例如服務(wù)器的數(shù)量可以超過(guò)兩個(gè),所有未獲取到同步鎖的服務(wù)器都將成為StandbyServer),但這種省略無(wú)疑地是以不會(huì)影響對(duì)本發(fā)明進(jìn)行清楚、充分的公開(kāi)為前提的。主服務(wù)器在對(duì)外提供服務(wù)時(shí),通過(guò)使用計(jì)算集群的資源執(zhí)行實(shí)時(shí)處理應(yīng)用(application)完成數(shù)據(jù)的實(shí)時(shí)處理任務(wù)。對(duì)于一個(gè)基本的數(shù)據(jù)處理任務(wù),至少包括:定義實(shí)時(shí)數(shù)據(jù)源,對(duì)來(lái)自數(shù)據(jù)源的數(shù)據(jù)進(jìn)行分析處理,將處理結(jié)果輸出到指定存儲(chǔ)中。圖2為本申請(qǐng)的一個(gè)實(shí)施例所涉及實(shí)時(shí)處理任務(wù)的數(shù)據(jù)流圖,其中,采用分布式發(fā)布訂閱消息系統(tǒng)kafka作為數(shù)據(jù)源,從kafka的某一個(gè)數(shù)據(jù)源分區(qū)(Partition)中讀取實(shí)時(shí)數(shù)據(jù),對(duì)實(shí)時(shí)數(shù)據(jù)的分析處理主要為將其中錯(cuò)誤的日志信息(包含ERROR的日志信息)寫(xiě)入到數(shù)據(jù)庫(kù)的結(jié)果表中。具體地,主服務(wù)器通過(guò)啟動(dòng)接收器Receiver從kafka中讀取數(shù)據(jù),然后通過(guò)過(guò)濾器Filter過(guò)濾不包含ERROR的日志信息,并將過(guò)濾后的數(shù)據(jù)通過(guò)Sink操作寫(xiě)到數(shù)據(jù)庫(kù)Database的結(jié)果表中。在實(shí)際場(chǎng)景中,當(dāng)主服務(wù)器發(fā)生故障時(shí),將會(huì)釋放所述同步鎖,以觸發(fā)備服務(wù)器申請(qǐng)所述同步鎖。此時(shí),對(duì)于備服務(wù)器,在主服務(wù)器釋放同步鎖時(shí),申請(qǐng)所述同步鎖,并在通過(guò)申請(qǐng)獲取到主服務(wù)器釋放的同步鎖時(shí),成為新的主服務(wù)器,由此實(shí)現(xiàn)主備服務(wù)器之間的自動(dòng)切換。由此,為了保證實(shí)時(shí)處理任務(wù)也能夠在主備切換時(shí)繼續(xù)順利進(jìn)行,本申請(qǐng)實(shí)施例提供的方案中,在執(zhí)行實(shí)時(shí)處理應(yīng)用時(shí),主服務(wù)器會(huì)記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以使備服務(wù)器在成為主服務(wù)器時(shí),通過(guò)獲取所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。即備服務(wù)器在成為新的主服務(wù)器時(shí),將會(huì)獲取所述應(yīng)用信息,并根據(jù)所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。在本申請(qǐng)的一個(gè)實(shí)施例中,主服務(wù)器可以利用協(xié)調(diào)服務(wù)系統(tǒng)(例如Zookeeper)來(lái)記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,具體處理過(guò)程包括:在協(xié)調(diào)服務(wù)系統(tǒng)中創(chuàng)建記錄節(jié)點(diǎn),然后向所述記錄節(jié)點(diǎn)中寫(xiě)入關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。圖3示出了一種利用Zookeeper進(jìn)行實(shí)時(shí)處理應(yīng)用狀態(tài)追蹤的示意圖,其中,當(dāng)實(shí)時(shí)處理應(yīng)用啟動(dòng)后,主服務(wù)器會(huì)追蹤實(shí)時(shí)處理應(yīng)用的狀態(tài),并在內(nèi)存中記錄下當(dāng)前運(yùn)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,然后在Zookeeper中創(chuàng)建一個(gè)記錄節(jié)點(diǎn)[/Running/app],用以記錄應(yīng)用信息。進(jìn)一步地,在停止執(zhí)行所述實(shí)時(shí)處理應(yīng)用時(shí),主服務(wù)器會(huì)刪除協(xié)調(diào)服務(wù)系統(tǒng)中所述實(shí)時(shí)處理應(yīng)用對(duì)應(yīng)的應(yīng)用信息以及記錄節(jié)點(diǎn)。對(duì)于圖3所示的實(shí)例,當(dāng)實(shí)時(shí)處理應(yīng)用停止執(zhí)行時(shí),主服務(wù)器會(huì)刪除內(nèi)存中關(guān)于該實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,并會(huì)將Zookeeper上對(duì)應(yīng)的記錄節(jié)點(diǎn)[/Running/app]刪除。相應(yīng)地,備服務(wù)器在成為新的主服務(wù)器時(shí),也是從協(xié)調(diào)服務(wù)系統(tǒng)的記錄節(jié)點(diǎn)中,讀取關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。通過(guò)由主服務(wù)器記錄當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以及備服務(wù)器在成為新的主服務(wù)器時(shí),讀取該應(yīng)用信息,由此繼續(xù)執(zhí)行相關(guān)實(shí)時(shí)處理應(yīng)用的方式,能夠?qū)崿F(xiàn)完整的故障自動(dòng)恢復(fù)的機(jī)制。圖4示出了本申請(qǐng)實(shí)施例的方案實(shí)現(xiàn)故障恢復(fù)的原理,當(dāng)主服務(wù)器ActiverServer發(fā)生故障時(shí),備服務(wù)器StandbyServer可以從協(xié)調(diào)服務(wù)系統(tǒng)Zookeeper中獲得同步鎖,由此成為新的ActiveServer,此時(shí)它將獲得計(jì)算集群SparkCluster的資源使用權(quán),并從Zookeeper中讀取記錄節(jié)點(diǎn)[/Running/app]中的應(yīng)用信息,也就是原來(lái)的主服務(wù)器發(fā)生故障時(shí)還在運(yùn)行的實(shí)時(shí)處理應(yīng)用的相關(guān)信息。然后,新的ActiveServer將該實(shí)時(shí)處理應(yīng)用重新提交到SparkCluster執(zhí)行,以完成之前未完成的實(shí)時(shí)處理任務(wù),實(shí)現(xiàn)故障的自動(dòng)恢復(fù)。進(jìn)一步地,本申請(qǐng)實(shí)施例的用于實(shí)現(xiàn)數(shù)據(jù)實(shí)施處理的實(shí)時(shí)處理應(yīng)用中,通過(guò)SQL語(yǔ)句定義關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作。具體地,這些關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作,可以包括創(chuàng)建所述實(shí)時(shí)處理應(yīng)用的操作,以及對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作等。相較于現(xiàn)有技術(shù)中,例如ApacheFlink、SparkStreaming等實(shí)時(shí)處理引擎,需要通過(guò)編寫(xiě)Java、Scala等應(yīng)用程序代碼來(lái)定義上述操作,用戶(hù)在定義關(guān)于實(shí)時(shí)處理應(yīng)用的處理操作時(shí),需要從頭開(kāi)始搭建編程環(huán)境、獲取依賴(lài)的SDK、打包、部署到集群進(jìn)行測(cè)試使用,需要熟悉各種API、分布式系統(tǒng)的邏輯,非常的復(fù)雜并且低效。而使用SQL語(yǔ)句來(lái)定義關(guān)于實(shí)時(shí)處理應(yīng)用的處理操作,無(wú)需搭建編程環(huán)境、不依賴(lài)SDK,簡(jiǎn)化了配置、修改的過(guò)程,具有方便管理的優(yōu)點(diǎn)。在本申請(qǐng)的一個(gè)實(shí)施例中,可以通過(guò)如下的SQL語(yǔ)句定義實(shí)時(shí)處理應(yīng)用的相關(guān)處理操作。例如,創(chuàng)建所述實(shí)時(shí)處理應(yīng)用的操作,可以是[createapplicationapp[properties(“parallelism”=”2”)]],而對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作可以包括:定義Kafka上的實(shí)時(shí)數(shù)據(jù)源的操作[createstreamsource(idint,namestring,messagestring)streamproperties(“source”=”kafka”,kafka.zookeeper”=”broker:2181”,“topic”=”source”)];定義實(shí)時(shí)數(shù)據(jù)的過(guò)濾操作:[createstreamerrorLogsasselect*fromsourcewheremessagelike“%ERROR%”];以及將過(guò)濾后的數(shù)據(jù)寫(xiě)入結(jié)果表的操作:[insertintoresultselect*fromerrorlogs]等等。由于實(shí)時(shí)處理應(yīng)用的相關(guān)處理操作需要通過(guò)SQL語(yǔ)句定義,因此本申請(qǐng)實(shí)施例所提供的方法中,實(shí)時(shí)處理應(yīng)用的具體創(chuàng)建方式如下:服務(wù)器在獲取實(shí)時(shí)處理應(yīng)用的創(chuàng)建請(qǐng)求時(shí),通過(guò)元數(shù)據(jù)存儲(chǔ)將所述實(shí)時(shí)處理應(yīng)用持久化保存至數(shù)據(jù)庫(kù)中。其中,所述創(chuàng)建請(qǐng)求可以來(lái)自于客戶(hù)端設(shè)備,用戶(hù)通過(guò)客戶(hù)端設(shè)備創(chuàng)建特定功能的實(shí)時(shí)處理應(yīng)用,以完成相應(yīng)的實(shí)時(shí)處理任務(wù)。因此,服務(wù)器Server在收到創(chuàng)建請(qǐng)求時(shí),會(huì)通過(guò)元數(shù)據(jù)存儲(chǔ)(MetaStore)將實(shí)時(shí)處理應(yīng)用的相關(guān)信息保存至數(shù)據(jù)庫(kù)中,具體地,所述數(shù)據(jù)庫(kù)可以是MySQL等使用SQL語(yǔ)言的數(shù)據(jù)庫(kù)。圖5示出了本申請(qǐng)的一個(gè)實(shí)施例中創(chuàng)建實(shí)時(shí)處理應(yīng)用的處理流程。在收到創(chuàng)建請(qǐng)求時(shí),將創(chuàng)建請(qǐng)求(createrequest)發(fā)送至MetaStore,然后MetaStore再向MySQL發(fā)送相應(yīng)的寫(xiě)入請(qǐng)求(writerequest),從而實(shí)現(xiàn)持久化的保存。具體地,實(shí)時(shí)處理應(yīng)用的相關(guān)信息可以包括如下字段:實(shí)時(shí)處理應(yīng)用的識(shí)別信息(ID)、名稱(chēng)(Name)、創(chuàng)建時(shí)間(CreateTime)、最近修改時(shí)間(LastModifyTime)以及對(duì)應(yīng)的執(zhí)行任務(wù)的SQL語(yǔ)句(Command)等,其在MySQL中的具體表結(jié)構(gòu)如表1所示:字段類(lèi)型是否為主鍵IDBigint(20)是NameVarchar(128)CreateTimeInt(11)LastModifyTimeInt(11)Commandmediumtext表1除此之外,在創(chuàng)建實(shí)時(shí)處理應(yīng)用的時(shí)候,用戶(hù)還會(huì)指定該實(shí)時(shí)處理應(yīng)用在執(zhí)行時(shí)的一些配置,表2示出了實(shí)時(shí)處理應(yīng)用的配置在MySQL中的一種表結(jié)構(gòu),可以包含如下字段:實(shí)時(shí)處理應(yīng)用的識(shí)別信息(ID)、參數(shù)鍵(PARAM_KEY)、參數(shù)值(PARAM_VALUE)等。字段類(lèi)型是否為主鍵APP_IDBigint(20)是PARAM_KEYVarchar(128)是PARAM_VALUEVarchar(4000)表2在實(shí)際處理過(guò)程中,用戶(hù)可以通過(guò)客戶(hù)端設(shè)備Client使用SQL語(yǔ)句執(zhí)行實(shí)時(shí)處理應(yīng)用,例如[startapplicationapp]。主服務(wù)器在接收到該執(zhí)行實(shí)時(shí)處理應(yīng)用的命令后,其在執(zhí)行實(shí)時(shí)處理應(yīng)用的過(guò)程,具體包括如下處理步驟:首先,主服務(wù)器獲取所述實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句。在如前例所述的場(chǎng)景中,所述實(shí)時(shí)處理應(yīng)用的相關(guān)信息通過(guò)MetaStore持久化保存于MySQL。此時(shí),主服務(wù)器在獲取SQL語(yǔ)句的處理過(guò)程中,將先通過(guò)元數(shù)據(jù)存儲(chǔ)從數(shù)據(jù)庫(kù)獲取所述實(shí)時(shí)處理應(yīng)用,即在接收到執(zhí)行實(shí)時(shí)處理應(yīng)用的命令后,向MetaStore發(fā)送請(qǐng)求,使得MetaStore再?gòu)腗ySQL的數(shù)據(jù)表中獲取關(guān)于實(shí)時(shí)處理應(yīng)用的相關(guān)信息,然后返回給主服務(wù)器。由于相關(guān)信息中包含了SQL語(yǔ)句,使得主服務(wù)器以獲取所述實(shí)時(shí)處理應(yīng)用中用于對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的SQL語(yǔ)句。例如,主服務(wù)器最終可以獲取到實(shí)時(shí)處理應(yīng)用的關(guān)于將過(guò)濾后的數(shù)據(jù)寫(xiě)入結(jié)果表的操作的SQL語(yǔ)句:[insertintoresultselect*fromerrorlogs]。然后,主服務(wù)器根據(jù)所述SQL語(yǔ)句獲取對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的操作符。在本申請(qǐng)的一個(gè)實(shí)施例中,主服務(wù)器可以通過(guò)SQL編譯器(Compiler)將實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句解析生成一個(gè)執(zhí)行計(jì)劃(ExecutionPlan),該執(zhí)行計(jì)劃包括幾個(gè)操作符:ROp是從Kafka中讀取數(shù)據(jù)的操作符、FOp是中間過(guò)濾數(shù)據(jù)的操作符、SOp是最終結(jié)果輸出的操作符。最后,主服務(wù)器將所述操作符提交至計(jì)算集群,由所述計(jì)算集群執(zhí)行所述操作符,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的實(shí)時(shí)處理操作。例如,以本申請(qǐng)實(shí)施例中的場(chǎng)景為例,主服務(wù)器將包含操作符的執(zhí)行計(jì)劃提交至SparkCluster,由SparkCluster中的執(zhí)行器Executor進(jìn)行執(zhí)行,具體執(zhí)行流程如圖6所示?;谕话l(fā)明構(gòu)思,本申請(qǐng)實(shí)施例中還提供了實(shí)時(shí)處理引擎的故障恢復(fù)服務(wù)器,該故障恢復(fù)服務(wù)器對(duì)應(yīng)的方法是前述實(shí)施例中的實(shí)時(shí)處理引擎的故障恢復(fù)方法,并且其解決問(wèn)題的原理與所述方法相似。圖7示出了本申請(qǐng)實(shí)施例提供的一種實(shí)時(shí)處理引擎的故障恢復(fù)服務(wù)器,包括切換裝置710和實(shí)時(shí)處理裝置720。實(shí)時(shí)處理引擎中包含多個(gè)上述服務(wù)器,實(shí)時(shí)處理引擎啟動(dòng)時(shí),多個(gè)服務(wù)器會(huì)同時(shí)啟動(dòng)去申請(qǐng)同步鎖。對(duì)于任意一個(gè)服務(wù)器(Server),其切換裝置710用于在獲取到同步鎖時(shí),使本服務(wù)器成為主服務(wù)器(ActiveServer)。所述主服務(wù)器能夠獲得計(jì)算集群的資源使用權(quán),對(duì)外提供服務(wù),即實(shí)時(shí)處理引擎的數(shù)據(jù)處理功能,均由主服務(wù)器通過(guò)調(diào)用計(jì)算集群的資源來(lái)實(shí)現(xiàn);而相應(yīng)地,切換裝置710用于在未獲取到所述同步鎖時(shí),使本服務(wù)器成為備服務(wù)器(StandbyServer),所述備服務(wù)器不獲得計(jì)算集群的資源使用權(quán),不對(duì)外提供服務(wù)。在實(shí)際場(chǎng)景中,所述服務(wù)器會(huì)向協(xié)調(diào)服務(wù)系統(tǒng)Zookeeper申請(qǐng)同步鎖,而所述計(jì)算集群可以為SparkCluster。在服務(wù)器獲得計(jì)算集群的資源使用權(quán)時(shí),可以通過(guò)SparkCluster提供的執(zhí)行器Executor來(lái)完成相應(yīng)的實(shí)時(shí)處理任務(wù),具體如圖1所示。實(shí)時(shí)處理引擎剛啟動(dòng)時(shí),兩個(gè)服務(wù)器同時(shí)啟動(dòng),并向Zookeeper去申請(qǐng)一把同步鎖,獲得同步鎖的服務(wù)器成為ActiveServer,并開(kāi)始提供服務(wù),并獲得SparkCluster的資源使用權(quán),另外一個(gè)未獲取到同步鎖的服務(wù)器則成為StandbyServer。在此,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,圖中示出的各類(lèi)元素的數(shù)量可能小于實(shí)際場(chǎng)景中相應(yīng)元素的數(shù)量(例如服務(wù)器的數(shù)量可以超過(guò)兩個(gè),所有未獲取到同步鎖的服務(wù)器都將成為StandbyServer),但這種省略無(wú)疑地是以不會(huì)影響對(duì)本發(fā)明進(jìn)行清楚、充分的公開(kāi)為前提的。主服務(wù)器在對(duì)外提供服務(wù)時(shí),通過(guò)使用計(jì)算集群的資源執(zhí)行實(shí)時(shí)處理應(yīng)用完成數(shù)據(jù)的實(shí)時(shí)處理任務(wù)。對(duì)于一個(gè)基本的數(shù)據(jù)處理任務(wù),至少包括:定義實(shí)時(shí)數(shù)據(jù)源,對(duì)來(lái)自數(shù)據(jù)源的數(shù)據(jù)進(jìn)行分析處理,將處理結(jié)果輸出到指定存儲(chǔ)中。圖2為本申請(qǐng)的一個(gè)實(shí)施例所涉及實(shí)時(shí)處理任務(wù)的數(shù)據(jù)流圖,其中,采用分布式發(fā)布訂閱消息系統(tǒng)kafka作為數(shù)據(jù)源,從kafka的消息隊(duì)列讀取實(shí)時(shí)數(shù)據(jù),對(duì)實(shí)時(shí)數(shù)據(jù)的分析處理主要為將其中錯(cuò)誤的日志信息(包含ERROR的日志信息)寫(xiě)入到數(shù)據(jù)庫(kù)的結(jié)果表中。具體地,主服務(wù)器通過(guò)啟動(dòng)接收器Receiver從kafka中讀取數(shù)據(jù),然后通過(guò)過(guò)濾器Filter過(guò)濾不包含ERROR的日志信息,并將過(guò)濾后的數(shù)據(jù)通過(guò)Sink操作寫(xiě)到數(shù)據(jù)庫(kù)Database的結(jié)果表中。在實(shí)際場(chǎng)景中,當(dāng)主服務(wù)器發(fā)生故障時(shí),其切換裝置710將會(huì)釋放所述同步鎖,以觸發(fā)備服務(wù)器申請(qǐng)所述同步鎖。此時(shí),對(duì)于備服務(wù)器,其切換裝置710會(huì)在主服務(wù)器釋放同步鎖時(shí),申請(qǐng)所述同步鎖,并在通過(guò)申請(qǐng)獲取到主服務(wù)器釋放的同步鎖時(shí),使本服務(wù)器成為新的主服務(wù)器,由此實(shí)現(xiàn)主備服務(wù)器之間的自動(dòng)切換。由此,為了保證實(shí)時(shí)處理任務(wù)也能夠在主備切換時(shí)繼續(xù)順利進(jìn)行,本申請(qǐng)實(shí)施例提供的方案中,在執(zhí)行實(shí)時(shí)處理應(yīng)用時(shí),主服務(wù)器的實(shí)時(shí)處理裝置720會(huì)記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以使備服務(wù)器在成為主服務(wù)器時(shí),通過(guò)獲取所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。即備服務(wù)器在成為新的主服務(wù)器時(shí),其實(shí)時(shí)處理裝置720將會(huì)獲取所述應(yīng)用信息,并根據(jù)所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用。在本申請(qǐng)的一個(gè)實(shí)施例中,主服務(wù)器可以利用協(xié)調(diào)服務(wù)系統(tǒng)(例如Zookeeper)來(lái)記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,其實(shí)時(shí)處理裝置720的具體處理過(guò)程包括:在協(xié)調(diào)服務(wù)系統(tǒng)中創(chuàng)建記錄節(jié)點(diǎn),然后向所述記錄節(jié)點(diǎn)中寫(xiě)入關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。圖3示出了一種利用Zookeeper進(jìn)行實(shí)時(shí)處理應(yīng)用狀態(tài)追蹤的示意圖,其中,當(dāng)實(shí)時(shí)處理應(yīng)用啟動(dòng)后,主服務(wù)器會(huì)追蹤實(shí)時(shí)處理應(yīng)用的狀態(tài),并在內(nèi)存中記錄下當(dāng)前運(yùn)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,然后在Zookeeper中創(chuàng)建(create)一個(gè)記錄節(jié)點(diǎn)[/Running/app],用以記錄應(yīng)用信息。進(jìn)一步地,在停止執(zhí)行所述實(shí)時(shí)處理應(yīng)用時(shí),主服務(wù)器的實(shí)時(shí)處理裝置720會(huì)刪除協(xié)調(diào)服務(wù)系統(tǒng)中所述實(shí)時(shí)處理應(yīng)用對(duì)應(yīng)的應(yīng)用信息以及記錄節(jié)點(diǎn)。對(duì)于圖3所示的實(shí)例,當(dāng)實(shí)時(shí)處理應(yīng)用停止執(zhí)行時(shí),主服務(wù)器會(huì)刪除內(nèi)存中關(guān)于該實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,并會(huì)將Zookeeper上對(duì)應(yīng)的記錄節(jié)點(diǎn)[/Running/app]刪除(Remove)。相應(yīng)地,備服務(wù)器在成為新的主服務(wù)器時(shí),其實(shí)時(shí)處理裝置720也是從協(xié)調(diào)服務(wù)系統(tǒng)的記錄節(jié)點(diǎn)中,讀取關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息。通過(guò)由主服務(wù)器記錄當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以及備服務(wù)器在成為新的主服務(wù)器時(shí),讀取該應(yīng)用信息,由此繼續(xù)執(zhí)行相關(guān)實(shí)時(shí)處理應(yīng)用的方式,能夠?qū)崿F(xiàn)完整的故障自動(dòng)恢復(fù)的機(jī)制。圖4示出了本申請(qǐng)實(shí)施例的方案實(shí)現(xiàn)故障恢復(fù)的原理,當(dāng)主服務(wù)器ActiverServer發(fā)生故障時(shí),備服務(wù)器StandbyServer可以從協(xié)調(diào)服務(wù)系統(tǒng)Zookeeper中獲得同步鎖,由此成為新的ActiveServer,此時(shí)它將獲得計(jì)算集群SparkCluster的資源使用權(quán),并從Zookeeper中讀取記錄節(jié)點(diǎn)[/Running/app]中的應(yīng)用信息,也就是原來(lái)的主服務(wù)器發(fā)生故障時(shí)還在運(yùn)行的實(shí)時(shí)處理應(yīng)用的相關(guān)信息。然后,新的ActiveServer將該實(shí)時(shí)處理應(yīng)用重新提交到SparkCluster執(zhí)行,以完成之前未完成的實(shí)時(shí)處理任務(wù),實(shí)現(xiàn)故障的自動(dòng)恢復(fù)。進(jìn)一步地,本申請(qǐng)實(shí)施例的用于實(shí)現(xiàn)數(shù)據(jù)實(shí)施處理的實(shí)時(shí)處理應(yīng)用中,通過(guò)SQL語(yǔ)句定義關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作。具體地,這些關(guān)于該實(shí)時(shí)處理應(yīng)用的處理操作,可以包括創(chuàng)建所述實(shí)時(shí)處理應(yīng)用的操作,以及對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作等。相較于現(xiàn)有技術(shù)中,例如ApacheFlink、SparkStreaming等實(shí)時(shí)處理引擎,需要通過(guò)編寫(xiě)Java、Scala等應(yīng)用程序代碼來(lái)定義上述操作,用戶(hù)在定義關(guān)于實(shí)時(shí)處理應(yīng)用的處理操作時(shí),需要從頭開(kāi)始搭建編程環(huán)境、獲取依賴(lài)的SDK、打包、部署到集群進(jìn)行測(cè)試使用,需要熟悉各種API、分布式系統(tǒng)的邏輯,非常的復(fù)雜并且低效。而使用SQL語(yǔ)句來(lái)定義關(guān)于實(shí)時(shí)處理應(yīng)用的處理操作,無(wú)需搭建編程環(huán)境、不依賴(lài)SDK,簡(jiǎn)化了配置、修改的過(guò)程,具有方便管理的優(yōu)點(diǎn)。在本申請(qǐng)的一個(gè)實(shí)施例中,可以通過(guò)如下的SQL語(yǔ)句定義實(shí)時(shí)處理應(yīng)用的相關(guān)處理操作。例如,創(chuàng)建所述實(shí)時(shí)處理應(yīng)用的操作,可以是[createapplicationapp[properties(“parallelism”=”2”)]],而對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作可以包括:定義Kafka上的實(shí)時(shí)數(shù)據(jù)源的操作[createstreamsource(idint,namestring,messagestring)streamproperties(“source”=”kafka”,kafka.zookeeper”=”broker:2181”,“topic”=”source”)];定義實(shí)時(shí)數(shù)據(jù)的過(guò)濾操作:[createstreamerrorLogsasselect*fromsourcewheremessagelike“%ERROR%”];以及將過(guò)濾后的數(shù)據(jù)寫(xiě)入結(jié)果表的操作:[insertintoresultselect*fromerrorlogs]等等。由于實(shí)時(shí)處理應(yīng)用的相關(guān)處理操作需要通過(guò)SQL語(yǔ)句定義,因此本申請(qǐng)實(shí)施例所提供的服務(wù)器中,實(shí)時(shí)處理應(yīng)用的具體創(chuàng)建方式如下:服務(wù)器在獲取實(shí)時(shí)處理應(yīng)用的創(chuàng)建請(qǐng)求時(shí),通過(guò)元數(shù)據(jù)存儲(chǔ)將所述實(shí)時(shí)處理應(yīng)用持久化保存至數(shù)據(jù)庫(kù)中。其中,所述創(chuàng)建請(qǐng)求可以來(lái)自于客戶(hù)端設(shè)備,用戶(hù)通過(guò)客戶(hù)端設(shè)備創(chuàng)建特定功能的實(shí)時(shí)處理應(yīng)用,以完成相應(yīng)的實(shí)時(shí)處理任務(wù)。因此,服務(wù)器Server在收到創(chuàng)建請(qǐng)求時(shí),會(huì)通過(guò)元數(shù)據(jù)存儲(chǔ)(MetaStore)將實(shí)時(shí)處理應(yīng)用的相關(guān)信息保存至數(shù)據(jù)庫(kù)中,具體地,所述數(shù)據(jù)庫(kù)可以是MySQL等使用SQL語(yǔ)言的數(shù)據(jù)庫(kù)。圖5示出了本申請(qǐng)的一個(gè)實(shí)施例中,創(chuàng)建實(shí)時(shí)處理應(yīng)用的處理流程。服務(wù)器在收到創(chuàng)建請(qǐng)求時(shí),將創(chuàng)建請(qǐng)求(createrequest)發(fā)送至MetaStore,然后MetaStore再向MySQL發(fā)送相應(yīng)的寫(xiě)入請(qǐng)求(writerequest),從而實(shí)現(xiàn)持久化的保存。具體地,實(shí)時(shí)處理應(yīng)用的相關(guān)信息可以包括如下字段:實(shí)時(shí)處理應(yīng)用的識(shí)別信息(ID)、名稱(chēng)(Name)、創(chuàng)建時(shí)間(CreateTime)、最近修改時(shí)間(LastModifyTime)以及對(duì)應(yīng)的執(zhí)行任務(wù)的SQL語(yǔ)句(Command)等,其在MySQL中的具體表結(jié)構(gòu)如表1所示:除此之外,在創(chuàng)建實(shí)時(shí)處理應(yīng)用的時(shí)候,用戶(hù)還會(huì)指定該實(shí)時(shí)處理應(yīng)用在執(zhí)行時(shí)的一些配置,表2示出了實(shí)時(shí)處理應(yīng)用的配置在MySQL中的一種表結(jié)構(gòu),可以包含如下字段:實(shí)時(shí)處理應(yīng)用的識(shí)別信息(ID)、參數(shù)鍵(PARAM_KEY)、參數(shù)值(PARAM_VALUE)等。在實(shí)際處理過(guò)程中,用戶(hù)可以通過(guò)客戶(hù)端設(shè)備Client使用SQL語(yǔ)句執(zhí)行實(shí)時(shí)處理應(yīng)用,例如[startapplicationapp]。主服務(wù)器在接收到該執(zhí)行實(shí)時(shí)處理應(yīng)用的命令后,其實(shí)時(shí)處理裝置72執(zhí)行實(shí)時(shí)處理應(yīng)用的過(guò)程,具體包括如下處理步驟:首先,主服務(wù)器的實(shí)時(shí)處理裝置720獲取所述實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句。在如前例所述的場(chǎng)景中,所述實(shí)時(shí)處理應(yīng)用的相關(guān)信息通過(guò)MetaStore持久化保存于MySQL。此時(shí),主服務(wù)器在獲取SQL語(yǔ)句的處理過(guò)程中,其實(shí)時(shí)處理裝置720將先通過(guò)元數(shù)據(jù)存儲(chǔ)從數(shù)據(jù)庫(kù)獲取所述實(shí)時(shí)處理應(yīng)用,即在接收到執(zhí)行實(shí)時(shí)處理應(yīng)用的命令后,向MetaStore發(fā)送請(qǐng)求,使得MetaStore再?gòu)腗ySQL的數(shù)據(jù)表中獲取關(guān)于實(shí)時(shí)處理應(yīng)用的相關(guān)信息,然后返回給主服務(wù)器。由于相關(guān)信息中包含了SQL語(yǔ)句,使得主服務(wù)器以獲取所述實(shí)時(shí)處理應(yīng)用中用于對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的SQL語(yǔ)句。例如,主服務(wù)器最終可以獲取到實(shí)時(shí)處理應(yīng)用的關(guān)于將過(guò)濾后的數(shù)據(jù)寫(xiě)入結(jié)果表的操作的SQL語(yǔ)句:[insertintoresultselect*fromerrorlogs]。然后,主服務(wù)器的實(shí)時(shí)處理裝置720根據(jù)所述SQL語(yǔ)句獲取對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)處理的操作的操作符。在本申請(qǐng)的一個(gè)實(shí)施例中,主服務(wù)器可以通過(guò)SQL編譯器(Compiler)將實(shí)時(shí)處理應(yīng)用的SQL語(yǔ)句解析生成一個(gè)執(zhí)行計(jì)劃(ExecutionPlan),該執(zhí)行計(jì)劃包括幾個(gè)操作符:ROp是從Kafka中讀取數(shù)據(jù)的操作符、FOp是中間過(guò)濾數(shù)據(jù)的操作符、SOp是最終結(jié)果輸出的操作符。最后,主服務(wù)器的實(shí)時(shí)處理裝置720將所述操作符提交至計(jì)算集群,由所述計(jì)算集群執(zhí)行所述操作符,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的實(shí)時(shí)處理操作。例如,以本申請(qǐng)實(shí)施例中的場(chǎng)景為例,主服務(wù)器將包含操作符的執(zhí)行計(jì)劃提交至SparkCluster,由SparkCluster中的執(zhí)行器Executor進(jìn)行執(zhí)行,具體執(zhí)行流程如圖6所示。綜上所述,本申請(qǐng)?zhí)峁┑姆桨钢校我庖粋€(gè)服務(wù)器在啟動(dòng)時(shí)若獲取到同步鎖,則成為主服務(wù)器對(duì)外提供服務(wù);在主服務(wù)器對(duì)外提供服務(wù)器的過(guò)程中,若發(fā)生故障,主服務(wù)器將釋放所述同步鎖,以觸發(fā)備服務(wù)器申請(qǐng)所述同步鎖,使得備服務(wù)器可以獲取到同步鎖從而成為新的主服務(wù)器,此外,主服務(wù)器在執(zhí)行實(shí)時(shí)處理應(yīng)用時(shí),記錄關(guān)于當(dāng)前執(zhí)行的實(shí)時(shí)處理應(yīng)用的應(yīng)用信息,以使備服務(wù)器在成為主服務(wù)器時(shí),通過(guò)獲取所述應(yīng)用信息繼續(xù)執(zhí)行對(duì)應(yīng)的實(shí)時(shí)處理應(yīng)用,從而實(shí)現(xiàn)故障的自動(dòng)恢復(fù)。此外,本申請(qǐng)的方案使用SQL語(yǔ)句來(lái)定義關(guān)于實(shí)時(shí)處理應(yīng)用的處理操作,無(wú)需搭建編程環(huán)境、不依賴(lài)SDK,簡(jiǎn)化了配置、修改的過(guò)程,具有方便管理的優(yōu)點(diǎn)。需要注意的是,本申請(qǐng)可在軟件和/或軟件與硬件的組合體中被實(shí)施,例如,可采用專(zhuān)用集成電路(ASIC)、通用目的計(jì)算機(jī)或任何其他類(lèi)似硬件設(shè)備來(lái)實(shí)現(xiàn)。在一個(gè)實(shí)施例中,本申請(qǐng)的軟件程序可以通過(guò)處理器執(zhí)行以實(shí)現(xiàn)上文所述步驟或功能。同樣地,本申請(qǐng)的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲(chǔ)到計(jì)算機(jī)可讀記錄介質(zhì)中,例如,RAM存儲(chǔ)器,磁或光驅(qū)動(dòng)器或軟磁盤(pán)及類(lèi)似設(shè)備。另外,本申請(qǐng)的一些步驟或功能可采用硬件來(lái)實(shí)現(xiàn),例如,作為與處理器配合從而執(zhí)行各個(gè)步驟或功能的電路。另外,本申請(qǐng)的一部分可被應(yīng)用為計(jì)算機(jī)程序產(chǎn)品,例如計(jì)算機(jī)程序指令,當(dāng)其被計(jì)算機(jī)執(zhí)行時(shí),通過(guò)該計(jì)算機(jī)的操作,可以調(diào)用或提供根據(jù)本申請(qǐng)的方法和/或技術(shù)方案。而調(diào)用本申請(qǐng)的方法的程序指令,可能被存儲(chǔ)在固定的或可移動(dòng)的記錄介質(zhì)中,和/或通過(guò)廣播或其他信號(hào)承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲(chǔ)在根據(jù)所述程序指令運(yùn)行的計(jì)算機(jī)設(shè)備的工作存儲(chǔ)器中。在此,根據(jù)本申請(qǐng)的一個(gè)實(shí)施例包括一個(gè)裝置,該裝置包括用于存儲(chǔ)計(jì)算機(jī)程序指令的存儲(chǔ)器和用于執(zhí)行程序指令的處理器,其中,當(dāng)該計(jì)算機(jī)程序指令被該處理器執(zhí)行時(shí),觸發(fā)該裝置運(yùn)行基于前述根據(jù)本申請(qǐng)的多個(gè)實(shí)施例的方法和/或技術(shù)方案。對(duì)于本領(lǐng)域技術(shù)人員而言,顯然本申請(qǐng)不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背離本申請(qǐng)的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本申請(qǐng)。因此,無(wú)論從哪一點(diǎn)來(lái)看,均應(yīng)將實(shí)施例看作是示范性的,而且是非限制性的,本申請(qǐng)的范圍由所附權(quán)利要求而不是上述說(shuō)明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本申請(qǐng)內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。裝置權(quán)利要求中陳述的多個(gè)單元或裝置也可以由一個(gè)單元或裝置通過(guò)軟件或者硬件來(lái)實(shí)現(xiàn)。當(dāng)前第1頁(yè)1 2 3