如今微服務(wù)架構(gòu)討論的如火如荼。但在企業(yè)架構(gòu)里除了大量的OLTP交易外,還存在海量的批處理交易。在諸如銀行的金融機(jī)構(gòu)中,每天有3-4萬(wàn)筆的批處理作業(yè)需要處理。針對(duì)OLTP,業(yè)界有大量的開(kāi)源框架、優(yōu)秀的架構(gòu)設(shè)計(jì)給予支撐;但批處理領(lǐng)域的框架確鳳毛麟角。是時(shí)候和我們一起來(lái)了解下批處理的世界哪些優(yōu)秀的框架和設(shè)計(jì)了,今天我將以Spring Batch為例,和大家一起探秘批處理的世界。
成都創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元九江做網(wǎng)站,已為上家服務(wù),為九江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):18980820575
批處理典型業(yè)務(wù)場(chǎng)景
對(duì)賬是典型的批處理業(yè)務(wù)處理場(chǎng)景,各個(gè)金融機(jī)構(gòu)的往來(lái)業(yè)務(wù)和跨主機(jī)系統(tǒng)的業(yè)務(wù)都會(huì)涉及到對(duì)賬的過(guò)程,如大小額支付、銀聯(lián)交易、人行往來(lái)、現(xiàn)金管理、POS業(yè)務(wù)、ATM業(yè)務(wù)、證券公司資金賬戶(hù)、證券公司與證券結(jié)算公司。
下面是某行網(wǎng)銀的部分日終跑批實(shí)例場(chǎng)景需求。
涉及到的需求點(diǎn)包括:
批量的每個(gè)單元都需要錯(cuò)誤處理和回退;
每個(gè)單元在不同平臺(tái)中運(yùn)行;
需要有分支選擇;
每個(gè)單元需要監(jiān)控和獲取單元處理日志;
提供多種觸發(fā)規(guī)則,按日期,日歷,周期觸發(fā);
除此之外典型的批處理適用于如下的業(yè)務(wù)場(chǎng)景:
定期提交批處理任務(wù)(日終處理)
并行批處理:并行處理任務(wù)
企業(yè)消息驅(qū)動(dòng)處理
大規(guī)模的并行處理
手動(dòng)或定時(shí)重啟
按順序處理依賴(lài)的任務(wù)(可擴(kuò)展為工作流驅(qū)動(dòng)的批處理)
部分處理:忽略記錄(例如在回滾時(shí))
完整的批處理事務(wù)
與OLTP類(lèi)型交易不同,批處理作業(yè)兩個(gè)典型特征是批量執(zhí)行與自動(dòng)執(zhí)行(需要無(wú)人值守):前者能夠處理大批量數(shù)據(jù)的導(dǎo)入、導(dǎo)出和業(yè)務(wù)邏輯計(jì)算;后者無(wú)需人工干預(yù),能夠自動(dòng)化執(zhí)行批量任務(wù)。
在關(guān)注其基本功能之外,還需要關(guān)注如下的幾點(diǎn):
健壯性:不會(huì)因?yàn)闊o(wú)效數(shù)據(jù)或錯(cuò)誤數(shù)據(jù)導(dǎo)致程序崩潰;
可靠性:通過(guò)跟蹤、監(jiān)控、日志及相關(guān)的處理策略(重試、跳過(guò)、重啟)實(shí)現(xiàn)批作業(yè)的可靠執(zhí)行;
擴(kuò)展性:通過(guò)并發(fā)或者并行技術(shù)實(shí)現(xiàn)應(yīng)用的縱向和橫向擴(kuò)展,滿(mǎn)足海量數(shù)據(jù)處理的性能需求;
苦于業(yè)界真的缺少比較好的批處理框架,Spring Batch是業(yè)界目前為數(shù)不多的優(yōu)秀批處理框架(Java語(yǔ)言開(kāi)發(fā)),SpringSource和Accenture(埃森哲)共同貢獻(xiàn)了智慧。
Accenture在批處理架構(gòu)上有著豐富的工業(yè)級(jí)別的經(jīng)驗(yàn),貢獻(xiàn)了之前專(zhuān)用的批處理體系框架(這些框架歷經(jīng)數(shù)十年研發(fā)和使用,為Spring Batch提供了大量的參考經(jīng)驗(yàn))。
SpringSource則有著深刻的技術(shù)認(rèn)知和Spring框架編程模型,同時(shí)借鑒了JCL(Job Control Language)和COBOL的語(yǔ)言特性。2013年JSR-352將批處理納入規(guī)范體系,并被包含在了JEE7之中。這意味著,所有的JEE7應(yīng)用服務(wù)器都會(huì)有批處理的能力,目前第一個(gè)實(shí)現(xiàn)此規(guī)范的應(yīng)用服務(wù)器是Glassfish 4。當(dāng)然也可以在Java SE中使用。
但最為關(guān)鍵的一點(diǎn)是:JSR-352規(guī)范大量借鑒了Spring Batch框架的設(shè)計(jì)思路,從上圖中的核心模型和概念中可以看出究竟,核心的概念模型完全一致。完整的JSR-252規(guī)范可以從https://jcp.org/aboutJava/communityprocess/final/jsr352/index.html下載。
通過(guò)Spring Batch框架可以構(gòu)建出輕量級(jí)的健壯的并行處理應(yīng)用,支持事務(wù)、并發(fā)、流程、監(jiān)控、縱向和橫向擴(kuò)展,提供統(tǒng)一的接口管理和任務(wù)管理。
框架提供了諸如以下的核心能力,讓大家更關(guān)注在業(yè)務(wù)處理上。更是提供了如下的豐富能力:
明確分離批處理的執(zhí)行環(huán)境和應(yīng)用
將通用核心的服務(wù)以接口形式提供
提供“開(kāi)箱即用” 的簡(jiǎn)單的默認(rèn)的核心執(zhí)行接口
提供Spring框架中配置、自定義、和擴(kuò)展服務(wù)
所有默認(rèn)實(shí)現(xiàn)的核心服務(wù)能夠容易的被擴(kuò)展與替換,不會(huì)影響基礎(chǔ)層
提供一個(gè)簡(jiǎn)單的部署模式,使用Maven進(jìn)行編譯
批處理關(guān)鍵領(lǐng)域模型及關(guān)鍵架構(gòu)
先來(lái)個(gè)Hello World示例,一個(gè)典型的批處理作業(yè)。
典型的一個(gè)作業(yè)分為3部分:作業(yè)讀、作業(yè)處理、作業(yè)寫(xiě),也是典型的三步式架構(gòu)。整個(gè)批處理框架基本上圍繞Read、Process、Writer來(lái)處理。除此之外,框架提供了作業(yè)調(diào)度器、作業(yè)倉(cāng)庫(kù)(用以存放Job的元數(shù)據(jù)信息,支持內(nèi)存、DB兩種模式)。
完整的領(lǐng)域概念模型參加下圖:
Job Launcher(作業(yè)調(diào)度器)是Spring Batch框架基礎(chǔ)設(shè)施層提供的運(yùn)行Job的能力。通過(guò)給定的Job名稱(chēng)和作Job Parameters,可以通過(guò)Job Launcher執(zhí)行Job。
通過(guò)Job Launcher可以在Java程序中調(diào)用批處理任務(wù),也可以在通過(guò)命令行或者其它框架(如定時(shí)調(diào)度框架Quartz)中調(diào)用批處理任務(wù)。
Job Repository來(lái)存儲(chǔ)Job執(zhí)行期的元數(shù)據(jù)(這里的元數(shù)據(jù)是指Job Instance、Job Execution、Job Parameters、Step Execution、Execution Context等數(shù)據(jù)),并提供兩種默認(rèn)實(shí)現(xiàn)。
一種是存放在內(nèi)存中;另一種將元數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中。通過(guò)將元數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中,可以隨時(shí)監(jiān)控批處理Job的執(zhí)行狀態(tài)。Job執(zhí)行結(jié)果是成功還是失敗,并且使得在Job失敗的情況下重新啟動(dòng)Job成為可能。Step表示作業(yè)中的一個(gè)完整步驟,一個(gè)Job可以有一個(gè)或者多個(gè)Step組成。
批處理框架運(yùn)行期的模型也非常簡(jiǎn)單:
Job Instance(作業(yè)實(shí)例)是一個(gè)運(yùn)行期的概念,Job每執(zhí)行一次都會(huì)涉及到一個(gè)Job Instance。
Job Instance來(lái)源可能有兩種:一種是根據(jù)設(shè)置的Job Parameters從Job Repository(作業(yè)倉(cāng)庫(kù))中獲取一個(gè);如果根據(jù)Job Parameters從Job Repository沒(méi)有獲取Job Instance,則新創(chuàng)建一個(gè)新的Job Instance。
Job Execution表示Job執(zhí)行的句柄,一次Job的執(zhí)行可能成功也可能失敗。只有Job執(zhí)行成功后,對(duì)應(yīng)的Job Instance才會(huì)被完成。因此在Job執(zhí)行失敗的情況下,會(huì)有一個(gè)Job Instance對(duì)應(yīng)多個(gè)Job Execution的場(chǎng)景發(fā)生。
總結(jié)下批處理的典型概念模型,其設(shè)計(jì)非常精簡(jiǎn)的十個(gè)概念,完整支撐了整個(gè)框架。
Job提供的核心能力包括作業(yè)的抽象與繼承,類(lèi)似面向?qū)ο笾械母拍?。?duì)于執(zhí)行異常的作業(yè),提供重啟的能力。
框架在Job層面,同樣提供了作業(yè)編排的概念,包括順序、條件、并行作業(yè)編排。
在一個(gè)Job中配置多個(gè)Step。不同的Step間可以順序執(zhí)行,也可以按照不同的條件有選擇的執(zhí)行(條件通常使用Step的退出狀態(tài)決定),通過(guò)next元素或者decision元素來(lái)定義跳轉(zhuǎn)規(guī)則;
為了提高多個(gè)Step的執(zhí)行效率,框架提供了Step并行執(zhí)行的能力(使用split進(jìn)行聲明,通常該情況下需要Step之間沒(méi)有任何的依賴(lài)關(guān)系,否則容易引起業(yè)務(wù)上的錯(cuò)誤)。Step包含了一個(gè)實(shí)際運(yùn)行的批處理任務(wù)中的所有必需的信息,其實(shí)現(xiàn)可以是非常簡(jiǎn)單的業(yè)務(wù)實(shí)現(xiàn),也可以是非常復(fù)雜的業(yè)務(wù)處理,Step的復(fù)雜程度通常是業(yè)務(wù)決定的。
每個(gè)Step由ItemReader、ItemProcessor、ItemWriter組成,當(dāng)然根據(jù)不同的業(yè)務(wù)需求,ItemProcessor可以做適當(dāng)?shù)木?jiǎn)。同時(shí)框架提供了大量的ItemReader、ItemWriter的實(shí)現(xiàn),提供了對(duì)FlatFile、XML、Json、DataBase、Message等多種數(shù)據(jù)類(lèi)型的支持。
框架還為Step提供了重啟、事務(wù)、重啟次數(shù)、并發(fā)數(shù);以及提交間隔、異常跳過(guò)、重試、完成策略等能力?;赟tep的靈活配置,可以完成常見(jiàn)的業(yè)務(wù)功能需求。其中三步走(Read、Processor、Writer)是批處理中的經(jīng)典抽象。
作為面向批的處理,在Step層提供了多次讀、處理,一次提交的能力。
在Chunk的操作中,可以通過(guò)屬性commit-interval設(shè)置read多少條記錄后進(jìn)行一次提交。通過(guò)設(shè)置commit-interval的間隔值,減少提交頻次,降低資源使用率。Step的每一次提交作為一個(gè)完整的事務(wù)存在。默認(rèn)采用Spring提供的聲明式事務(wù)管理模式,事務(wù)編排非常方便。如下是一個(gè)聲明事務(wù)的示例:
框架對(duì)于事務(wù)的支持能力包括:
Chunk支持事務(wù)管理,通過(guò)commit-interval設(shè)置每次提交的記錄數(shù);
支持對(duì)每個(gè)Tasklet設(shè)置細(xì)粒度的事務(wù)配置:隔離界別、傳播行為、超時(shí);
支持rollback和no rollback,通過(guò)skippable-exception-classes和no-rollback-exception-classes進(jìn)行支撐;
支持JMS Queue的事務(wù)級(jí)別配置;
另外,在框架資深的模型抽象方面,Spring Batch也做了極為精簡(jiǎn)的抽象。
僅僅使用六張業(yè)務(wù)表存儲(chǔ)了所有的元數(shù)據(jù)信息(包括Job、Step的實(shí)例,上下文,執(zhí)行器信息,為后續(xù)的監(jiān)控、重啟、重試、狀態(tài)恢復(fù)等提供了可能)。
BATCH_JOB_INSTANCE:作業(yè)實(shí)例表,用于存放Job的實(shí)例信息
BATCH_JOB_EXECUTION_PARAMS:作業(yè)參數(shù)表,用于存放每個(gè)Job執(zhí)行時(shí)候的參數(shù)信息,該參數(shù)實(shí)際對(duì)應(yīng)Job實(shí)例的。
BATCH_JOB_EXECUTION:作業(yè)執(zhí)行器表,用于存放當(dāng)前作業(yè)的執(zhí)行信息,比如創(chuàng)建時(shí)間,執(zhí)行開(kāi)始時(shí)間,執(zhí)行結(jié)束時(shí)間,執(zhí)行的那個(gè)Job實(shí)例,執(zhí)行狀態(tài)等。
BATCH_JOB_EXECUTION_CONTEXT:作業(yè)執(zhí)行上下文表,用于存放作業(yè)執(zhí)行器上下文的信息。
BATCH_STEP_EXECUTION:作業(yè)步執(zhí)行器表,用于存放每個(gè)Step執(zhí)行器的信息,比如作業(yè)步開(kāi)始執(zhí)行時(shí)間,執(zhí)行完成時(shí)間,執(zhí)行狀態(tài),讀寫(xiě)次數(shù),跳過(guò)次數(shù)等信息。
實(shí)現(xiàn)作業(yè)的健壯性與擴(kuò)展性
批處理要求Job必須有較強(qiáng)的健壯性,通常Job是批量處理數(shù)據(jù)、無(wú)人值守的,這要求在Job執(zhí)行期間能夠應(yīng)對(duì)各種發(fā)生的異常、錯(cuò)誤,并對(duì)Job執(zhí)行進(jìn)行有效的跟蹤。
一個(gè)健壯的Job通常需要具備如下的幾個(gè)特性:
在Job執(zhí)行期間非致命的異常,Job執(zhí)行框架應(yīng)能夠進(jìn)行有效的容錯(cuò)處理,而不是讓整個(gè)Job執(zhí)行失??;通常只有致命的、導(dǎo)致業(yè)務(wù)不正確的異常才可以終止Job的執(zhí)行。
Job執(zhí)行期間任何發(fā)生錯(cuò)誤的地方都需要進(jìn)行有效的記錄,方便后期對(duì)錯(cuò)誤點(diǎn)進(jìn)行有效的處理。例如在Job執(zhí)行期間任何被忽略處理的記錄行需要被有效的記錄下來(lái),應(yīng)用程序維護(hù)人員可以針對(duì)被忽略的記錄后續(xù)做有效的處理。
Job執(zhí)行期間如果因?yàn)楫惓?dǎo)致失敗,應(yīng)該能夠在失敗的點(diǎn)重新啟動(dòng)Job;而不是從頭開(kāi)始重新執(zhí)行Job。
框架提供了支持上面所有能力的特性,包括Skip(跳過(guò)記錄處理)、Retry(重試給定的操作)、Restart(從錯(cuò)誤點(diǎn)開(kāi)始重新啟動(dòng)失敗的Job):
Skip,在對(duì)數(shù)據(jù)處理期間,如果數(shù)據(jù)的某幾條的格式不能滿(mǎn)足要求,可以通過(guò)Skip跳過(guò)該行記錄的處理,讓Processor能夠順利的處理其余的記錄行。
Retry,將給定的操作進(jìn)行多次重試,在某些情況下操作因?yàn)槎虝旱漠惓?dǎo)致執(zhí)行失敗,如網(wǎng)絡(luò)連接異常、并發(fā)處理異常等,可以通過(guò)重試的方式避免單次的失敗,下次執(zhí)行操作時(shí)候網(wǎng)絡(luò)恢復(fù)正常,不再有并發(fā)的異常,這樣通過(guò)重試的能力可以有效的避免這類(lèi)短暫的異常。
Restart,在Job執(zhí)行失敗后,可以通過(guò)重啟功能來(lái)繼續(xù)完成Job的執(zhí)行。在重啟時(shí)候,批處理框架允許在上次執(zhí)行失敗的點(diǎn)重新啟動(dòng)Job,而不是從頭開(kāi)始執(zhí)行,這樣可以大幅提高Job執(zhí)行的效率。
對(duì)于擴(kuò)展性,框架提供的擴(kuò)展能力包括如下的四種模式 :
Multithreaded Step 多線(xiàn)程執(zhí)行一個(gè)Step;
Parallel Step 通過(guò)多線(xiàn)程并行執(zhí)行多個(gè)Step;
Remote Chunking 在遠(yuǎn)端節(jié)點(diǎn)上執(zhí)行分布式Chunk操作;
Partitioning Step 對(duì)數(shù)據(jù)進(jìn)行分區(qū),并分開(kāi)執(zhí)行;
我們先來(lái)看第一種的實(shí)現(xiàn)Multithreaded Step:
批處理框架在Job執(zhí)行時(shí)默認(rèn)使用單個(gè)線(xiàn)程完成任務(wù)的執(zhí)行,同時(shí)框架提供了線(xiàn)程池的支持(Multithreaded Step模式),可以在Step執(zhí)行時(shí)候進(jìn)行并行處理,這里的并行是指同一個(gè)Step使用線(xiàn)程池進(jìn)行執(zhí)行,同一個(gè)Step被并行的執(zhí)行。使用tasklet的屬性task-executor可以非常容易的將普通的Step變成多線(xiàn)程Step。
Multithreaded Step的實(shí)現(xiàn)示例:
需要注意的是Spring Batch框架提供的大部分的ItemReader、ItemWriter等操作都是線(xiàn)程不安全的。
可以通過(guò)擴(kuò)展的方式顯現(xiàn)線(xiàn)程安全的Step。
下面為大家展示一個(gè)擴(kuò)展的實(shí)現(xiàn):
需求:針對(duì)數(shù)據(jù)表的批量處理,實(shí)現(xiàn)線(xiàn)程安全的Step,并且支持重啟能力,即在執(zhí)行失敗點(diǎn)可以記錄批處理的狀態(tài)。
對(duì)于示例中的數(shù)據(jù)庫(kù)讀取組件JdbcCursorItemReader,在設(shè)計(jì)數(shù)據(jù)庫(kù)表時(shí),在表中增加一個(gè)字段Flag,用于標(biāo)識(shí)當(dāng)前的記錄是否已經(jīng)讀取并處理成功,如果處理成功則標(biāo)識(shí)Flag=true,等下次重新讀取的時(shí)候,對(duì)于已經(jīng)成功讀取且處理成功的記錄直接跳過(guò)處理。
Multithreaded Step(多線(xiàn)程步)提供了多個(gè)線(xiàn)程執(zhí)行一個(gè)Step的能力,但這種場(chǎng)景在實(shí)際的業(yè)務(wù)中使用的并不是非常多。
更多的業(yè)務(wù)場(chǎng)景是Job中不同的Step沒(méi)有明確的先后順序,可以在執(zhí)行期并行的執(zhí)行。
Parallel Step:提供單個(gè)節(jié)點(diǎn)橫向擴(kuò)展的能力
使用場(chǎng)景:Step A、Step B兩個(gè)作業(yè)步由不同的線(xiàn)程執(zhí)行,兩者均執(zhí)行完畢后,Step C才會(huì)被執(zhí)行。
框架提供了并行Step的能力??梢酝ㄟ^(guò)Split元素來(lái)定義并行的作業(yè)流,并制定使用的線(xiàn)程池。
Parallel Step模式的執(zhí)行效果如下:
每個(gè)作業(yè)步并行處理不同的記錄,示例中三個(gè)作業(yè)步,處理同一張表中的不同數(shù)據(jù)。
并行Step提供了在一個(gè)節(jié)點(diǎn)上橫向處理,但隨著作業(yè)處理量的增加,有可能一臺(tái)節(jié)點(diǎn)無(wú)法滿(mǎn)足Job的處理,此時(shí)我們可以采用遠(yuǎn)程Step的方式將多個(gè)機(jī)器節(jié)點(diǎn)組合起來(lái)完成一個(gè)Job的處理。
Remote Chunking:遠(yuǎn)程Step技術(shù)本質(zhì)上是將對(duì)Item讀、寫(xiě)的處理邏輯進(jìn)行分離;通常情況下讀的邏輯放在一個(gè)節(jié)點(diǎn)進(jìn)行操作,將寫(xiě)操作分發(fā)到另外的節(jié)點(diǎn)執(zhí)行。
遠(yuǎn)程分塊是一個(gè)把step進(jìn)行技術(shù)分割的工作,不需要對(duì)處理數(shù)據(jù)的結(jié)構(gòu)有明確了解。
任何輸入源能夠使用單進(jìn)程讀取并在動(dòng)態(tài)分割后作為"塊"發(fā)送給遠(yuǎn)程的工作進(jìn)程。
遠(yuǎn)程進(jìn)程實(shí)現(xiàn)了監(jiān)聽(tīng)者模式,反饋請(qǐng)求、處理數(shù)據(jù)最終將處理結(jié)果異步返回。請(qǐng)求和返回之間的傳輸會(huì)被確保在發(fā)送者和單個(gè)消費(fèi)者之間。
在Master節(jié)點(diǎn),作業(yè)步負(fù)責(zé)讀取數(shù)據(jù),并將讀取的數(shù)據(jù)通過(guò)遠(yuǎn)程技術(shù)發(fā)送到指定的遠(yuǎn)端節(jié)點(diǎn)上,進(jìn)行處理,處理完畢后Master負(fù)責(zé)回收Remote端執(zhí)行的情況。
在Spring Batch框架中通過(guò)兩個(gè)核心的接口來(lái)完成遠(yuǎn)程Step的任務(wù),分別是ChunkProvider與ChunkProcessor。
ChunkProvider:根據(jù)給定的ItemReader操作產(chǎn)生批量的Chunk操作;
ChunkProcessor:負(fù)責(zé)獲取ChunkProvider產(chǎn)生的Chunk操作,執(zhí)行具體的寫(xiě)邏輯;
Spring Batch中對(duì)遠(yuǎn)程Step沒(méi)有默認(rèn)的實(shí)現(xiàn),但我們可以借助SI或者AMQP實(shí)現(xiàn)來(lái)實(shí)現(xiàn)遠(yuǎn)程通訊能力。
基于SI實(shí)現(xiàn)Remote Chunking模式的示例:
Step本地節(jié)點(diǎn)負(fù)責(zé)讀取數(shù)據(jù),并通過(guò)MessagingGateway將請(qǐng)求發(fā)送到遠(yuǎn)程Step上;遠(yuǎn)程Step提供了隊(duì)列的監(jiān)聽(tīng)器,當(dāng)請(qǐng)求隊(duì)列中有消息時(shí)候獲取請(qǐng)求信息并交給ChunkHander負(fù)責(zé)處理。
接下來(lái)我們看下最后一種分區(qū)模式;Partitioning Step:分區(qū)模式需要對(duì)數(shù)據(jù)的結(jié)構(gòu)有一定的了解,如主鍵的范圍、待處理的文件的名字等。
這種模式的優(yōu)點(diǎn)在于分區(qū)中每一個(gè)元素的處理器都能夠像一個(gè)普通Spring Batch任務(wù)的單步一樣運(yùn)行,也不必去實(shí)現(xiàn)任何特殊的或是新的模式,來(lái)讓他們能夠更容易配置與測(cè)試。
通過(guò)分區(qū)可以實(shí)現(xiàn)以下的優(yōu)點(diǎn):
分區(qū)實(shí)現(xiàn)了更細(xì)粒度的擴(kuò)展;
基于分區(qū)可以實(shí)現(xiàn)高性能的數(shù)據(jù)切分;
分區(qū)比遠(yuǎn)程通常具有更高的擴(kuò)展性;
分區(qū)后的處理邏輯,支持本地與遠(yuǎn)程兩種模式;
分區(qū)作業(yè)典型的可以分成兩個(gè)處理階段,數(shù)據(jù)分區(qū)、分區(qū)處理;
數(shù)據(jù)分區(qū):根據(jù)特殊的規(guī)則(例如:根據(jù)文件名稱(chēng),數(shù)據(jù)的唯一性標(biāo)識(shí),或者哈希算法)將數(shù)據(jù)進(jìn)行合理的數(shù)據(jù)切片,為不同的切片生成數(shù)據(jù)執(zhí)行上下文Execution Context、作業(yè)步執(zhí)行器Step Execution。可以通過(guò)接口Partitioner生成自定義的分區(qū)邏輯,Spring Batch批處理框架默認(rèn)實(shí)現(xiàn)了對(duì)多文件的實(shí)現(xiàn)org.springframework.batch.core.partition.support.MultiResourcePartitioner;也可以自行擴(kuò)展接口Partitioner來(lái)實(shí)現(xiàn)自定義的分區(qū)邏輯。
分區(qū)處理:通過(guò)數(shù)據(jù)分區(qū)后,不同的數(shù)據(jù)已經(jīng)被分配到不同的作業(yè)步執(zhí)行器中,接下來(lái)需要交給分區(qū)處理器進(jìn)行作業(yè),分區(qū)處理器可以本地執(zhí)行也可以遠(yuǎn)程執(zhí)行被劃分的作業(yè)。接口PartitionHandler定義了分區(qū)處理的邏輯,Spring Batch批處理框架默認(rèn)實(shí)現(xiàn)了本地多線(xiàn)程的分區(qū)處理org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler;也可以自行擴(kuò)展接口PartitionHandler來(lái)實(shí)現(xiàn)自定義的分區(qū)處理邏輯。
Spring Batch框架提供了對(duì)文件分區(qū)的支持,實(shí)現(xiàn)類(lèi)org.springframework.batch.core.partition.support.MultiResourcePartitioner提供了對(duì)文件分區(qū)的默認(rèn)支持,根據(jù)文件名將不同的文件處理進(jìn)行分區(qū),提升處理的速度和效率,適合有大量小文件需要處理的場(chǎng)景。
示例展示了將不同文件分配到不同的作業(yè)步中,使用MultiResourcePartitioner進(jìn)行分區(qū),意味著每個(gè)文件會(huì)被分配到一個(gè)不同的分區(qū)中。如果有其它的分區(qū)規(guī)則,可以通過(guò)實(shí)現(xiàn)接口Partitioner來(lái)進(jìn)行自定義的擴(kuò)展。有興趣的TX,可以自己實(shí)現(xiàn)基于數(shù)據(jù)庫(kù)的分區(qū)能力哦。
總結(jié)一下,批處理框架在擴(kuò)展性上提供了4中不同能力,每種都是各自的使用場(chǎng)景,我們可以根據(jù)實(shí)際的業(yè)務(wù)需要進(jìn)行選擇。
批處理框架的不足與增強(qiáng)
Spring Batch批處理框架雖然提供了4種不同的監(jiān)控方式,但從目前的使用情況來(lái)看,都不是非常的友好。
通過(guò)DB直接查看,對(duì)于管理人員來(lái)講,真的不忍直視;
通過(guò)API實(shí)現(xiàn)自定義的查詢(xún),這是程序員的天堂,確實(shí)運(yùn)維人員的地獄;
提供了Web控制臺(tái),進(jìn)行Job的監(jiān)控和操作,目前提供的功能太裸露,無(wú)法直接用于生產(chǎn);
提供JMX查詢(xún)方式,對(duì)于非開(kāi)發(fā)人員太不友好;
但在企業(yè)級(jí)應(yīng)用中面對(duì)批量數(shù)據(jù)處理,僅僅提供批處理框架僅能滿(mǎn)足批處理作業(yè)的快速開(kāi)發(fā)、執(zhí)行能力。
企業(yè)需要統(tǒng)一的批處理平臺(tái)來(lái)處理復(fù)雜的企業(yè)批處理應(yīng)用,批處理平臺(tái)需要解決作業(yè)的統(tǒng)一調(diào)度、批處理作業(yè)的集中管理和管控、批處理作業(yè)的統(tǒng)一監(jiān)控等能力。
那完美的解決方案是什么呢?
企業(yè)級(jí)批處理平臺(tái)需要在Spring Batch批處理框架的基礎(chǔ)上,集成調(diào)度框架,通過(guò)調(diào)度框架可以將任務(wù)按照企業(yè)的需求進(jìn)行任務(wù)的定期執(zhí)行;
豐富目前Spring Batch Admin(Spring Batch的管理監(jiān)控平臺(tái),目前能力比較薄弱)框架,提供對(duì)Job的統(tǒng)一管理功能,增強(qiáng)Job作業(yè)的監(jiān)控、預(yù)警等能力;
通過(guò)與企業(yè)的組織機(jī)構(gòu)、權(quán)限管理、認(rèn)證系統(tǒng)進(jìn)行合理的集成,增強(qiáng)平臺(tái)對(duì)Job作業(yè)的權(quán)限控制、安全管理能力。
結(jié)語(yǔ)
感謝您的觀看,如有不足之處,歡迎批評(píng)指正。
為了幫助大家讓學(xué)習(xí)變得輕松、高效,給大家免費(fèi)分享一大批資料,幫助大家在成為大數(shù)據(jù)工程師,乃至架構(gòu)師的路上披荊斬棘。在這里給大家推薦一個(gè)大數(shù)據(jù)學(xué)習(xí)交流圈:658558542 歡迎大家進(jìn)×××流討論,學(xué)習(xí)交流,共同進(jìn)步。
當(dāng)真正開(kāi)始學(xué)習(xí)的時(shí)候難免不知道從哪入手,導(dǎo)致效率低下影響繼續(xù)學(xué)習(xí)的信心。
但最重要的是不知道哪些技術(shù)需要重點(diǎn)掌握,學(xué)習(xí)時(shí)頻繁踩坑,最終浪費(fèi)大量時(shí)間,所以有有效資源還是很有必要的。
最后祝福所有遇到瓶疾且不知道怎么辦的大數(shù)據(jù)程序員們,祝福大家在往后的工作與面試中一切順利。