tags: springbatch
1.引言
最近使用Spring Batch
進(jìn)行做數(shù)據(jù)遷移则剃、數(shù)據(jù)同步拢切、數(shù)據(jù)批處理等工作,感嘆Spring Batch
設(shè)計(jì)之簡(jiǎn)潔猎物,對(duì)批處理編程的抽象能力之強(qiáng)大虎囚。
眾所周知,隨著大數(shù)據(jù)技術(shù)發(fā)展霸奕,企業(yè)對(duì)數(shù)據(jù)越來(lái)越重視溜宽,如何把數(shù)據(jù)有效轉(zhuǎn)化為信息,以幫助企業(yè)提供數(shù)據(jù)分析质帅、商業(yè)決策适揉、提高核心競(jìng)爭(zhēng)力。而批處理則是實(shí)現(xiàn)這一目標(biāo)的其中一個(gè)重要手段煤惩。通過(guò)批處理嫉嘀,可以完成數(shù)據(jù)加載、抽取魄揉、轉(zhuǎn)換剪侮、驗(yàn)證、清洗等功能洛退。這些工作具有數(shù)據(jù)量大瓣俯、無(wú)需人工操作、與時(shí)間密切相關(guān)(如隔一段時(shí)間處理一次)等特點(diǎn)兵怯。
對(duì)于批處理數(shù)據(jù)彩匕,無(wú)論是數(shù)據(jù)抽取、數(shù)據(jù)庫(kù)遷移媒区、數(shù)據(jù)同步等業(yè)務(wù)驼仪,涉及的具體操作掸犬,不外乎數(shù)據(jù)讀取,數(shù)據(jù)處理绪爸,數(shù)據(jù)寫入三種湾碎。按這個(gè)思路,在批處理編程過(guò)程中奠货,如何做到結(jié)構(gòu)清晰介褥、接口通用,過(guò)程可見(jiàn)仇味,出錯(cuò)處理呻顽,是需要花費(fèi)一定的功夫的,而Spring Batch
框架的出現(xiàn)丹墨,則填補(bǔ)這一空缺廊遍。當(dāng)初看到這個(gè)框架后,真的有相見(jiàn)恨晚的感覺(jué)贩挣,這不就是我想要的嗎喉前。讀、處理王财、寫分別抽象出來(lái)卵迂,通過(guò)Spring Batch
,可以把復(fù)雜的業(yè)務(wù)問(wèn)題做成簡(jiǎn)單化的抽象绒净,編程過(guò)程中见咒,只需要關(guān)心具體的業(yè)務(wù)實(shí)現(xiàn)即可,把流程以及流程的控制交給Spring Batch
吧挂疆。
在學(xué)習(xí)過(guò)程中改览,我閱讀了Spring Batch
的官方文檔及劉相的《Spring Batch批處理框架》,本系列將對(duì)Spring Batch
進(jìn)行介紹以及結(jié)合案例進(jìn)行實(shí)踐缤言,希望對(duì)入門的同學(xué)有幫助宝当,也希望和大家一起交流。本篇先對(duì)Spring Batch
進(jìn)行介紹胆萧。
2.Spring Batch簡(jiǎn)介
2.1 Spring Batch是批處理框架
對(duì)于使用java
技術(shù)進(jìn)行業(yè)務(wù)編程開(kāi)發(fā)的領(lǐng)域庆揩,Spring Framework
無(wú)疑是當(dāng)前企業(yè)開(kāi)發(fā)的龍頭,從早期的spring
開(kāi)發(fā)跌穗,到Spring MVC
的web開(kāi)發(fā)订晌,再到現(xiàn)在的基于Spring Boot
進(jìn)行微服務(wù)開(kāi)發(fā),都具有簡(jiǎn)化開(kāi)發(fā)蚌吸,增強(qiáng)規(guī)范锈拨,快速集成等特點(diǎn),而在數(shù)據(jù)處理領(lǐng)域套利,spring
同樣有一個(gè)開(kāi)發(fā)框架推励,那就是Spring Batch
。Spring Batch是一個(gè)輕量級(jí)肉迫,完善的批處理框架验辞,旨在幫助企業(yè)建立健壯高效的批處理應(yīng)用程序。 它是以Spring 框架為基礎(chǔ)開(kāi)發(fā)喊衫,使得原來(lái)使用Spring框架的開(kāi)發(fā)者可以更容易利用原來(lái)的服務(wù)跌造。當(dāng)前新版本的Spring Batch
更是可以直接基于Spring Boot
進(jìn)行開(kāi)發(fā),使得開(kāi)發(fā)更簡(jiǎn)單族购、快捷壳贪。
根據(jù)官方文檔說(shuō)明,Spring Batch
是由Spring Source
和Accenture
(埃森哲)合作開(kāi)發(fā)的寝杖,埃森哲貢獻(xiàn)了幾十年來(lái)在使用和構(gòu)建批量架構(gòu)方面的經(jīng)驗(yàn)违施,埃森哲與SpringSource之間的合作旨在促進(jìn)軟件處理方法,框架和工具的標(biāo)準(zhǔn)化瑟幕,在創(chuàng)建批處理應(yīng)用程序時(shí)磕蒲,企業(yè)或用戶可以始終如一地利用這些方法,框架和工具只盹。無(wú)論如何辣往,這是開(kāi)發(fā)者的福利,避免重復(fù)開(kāi)發(fā)殖卑。
2.2 Spring Batch不是調(diào)度框架
Spring Batch
本身是批處理邏輯的抽象站削,是對(duì)執(zhí)行任務(wù)的規(guī)范化,跟調(diào)度框架是兩回事孵稽。它可以結(jié)合調(diào)度框架许起,由調(diào)度框架進(jìn)行調(diào)度Spring Batch
作業(yè),完成對(duì)批處理的任務(wù)肛冶。調(diào)度框架有相應(yīng)的開(kāi)源軟件可供選擇街氢,如quartz
,cron
睦袖,xxl-job
等珊肃。
2.3 Spring Batch的簡(jiǎn)單說(shuō)明
前面說(shuō)的,Spring Batch
把批處理簡(jiǎn)單化馅笙,標(biāo)準(zhǔn)化是如何體現(xiàn)出來(lái)伦乔。簡(jiǎn)單來(lái)說(shuō),Spring Batch
把批處理簡(jiǎn)化為Job
和Job step
兩部分董习,在Job step
中烈和,把數(shù)據(jù)處理分為讀數(shù)據(jù)(Reader)、處理數(shù)據(jù)(Processor)皿淋、寫數(shù)據(jù)(Writer)三個(gè)步驟招刹,異常處理機(jī)制分為跳過(guò)恬试、重試、重啟三種疯暑,作業(yè)方式分為多線程训柴、并行、遠(yuǎn)程妇拯、分區(qū)四種幻馁。開(kāi)發(fā)者在開(kāi)發(fā)過(guò)程中,大部分工作是根據(jù)業(yè)務(wù)要求編寫Reader越锈、Processor和Writer即可仗嗦,提高了批處理開(kāi)發(fā)的效率。同時(shí)Spring Batch
本身也提供了很多默認(rèn)的Reader和Writer甘凭,開(kāi)箱即用稀拐。
3.Spring Batch優(yōu)勢(shì)與使用場(chǎng)景
對(duì)于Spring Batch
的優(yōu)勢(shì)和使用場(chǎng)景,在《Spring Batch批處理框架》書中对蒲,已經(jīng)作了比較全面的說(shuō)明钩蚊,個(gè)人覺(jué)得寫得比較好了,現(xiàn)摘抄下來(lái)蹈矮,可以供大家參考砰逻,以判斷Spring Batch
是否適用于自己開(kāi)發(fā)的業(yè)務(wù)。
3.1 Spring Batch優(yōu)勢(shì)
豐富的開(kāi)箱即用組件
開(kāi)箱即用組件包括各種資源的讀泛鸟、寫蝠咆。讀/寫:支持文本文件讀/寫、XML文件讀/寫北滥、數(shù)據(jù)庫(kù)讀/寫刚操、JMS隊(duì)列讀/寫等。還提供作業(yè)倉(cāng)庫(kù)再芋,作業(yè)調(diào)度器等基礎(chǔ)設(shè)施菊霜,大大簡(jiǎn)化開(kāi)發(fā)復(fù)雜度。面向chunk處理
支持多次讀济赎、一次寫鉴逞、避免多次對(duì)資源的寫入,大幅提升批處理效率司训。事務(wù)管理能力
默認(rèn)采用Spring提供的聲明式事務(wù)管理模型构捡,面向Chunk的操作支持事務(wù)管理,同時(shí)支持為每個(gè)tasklet操作設(shè)置細(xì)粒度的事務(wù)配置:隔離級(jí)別壳猜、傳播行為勾徽、超時(shí)設(shè)置等。元數(shù)據(jù)管理
自動(dòng)記錄Job和Step的執(zhí)行情況统扳、包括成功喘帚、失敗畅姊、失敗的異常信息、執(zhí)行次數(shù)吹由、重試次數(shù)涡匀、跳過(guò)次數(shù)、執(zhí)行時(shí)間等溉知,方便后期的維護(hù)和查看。易監(jiān)控的批處理應(yīng)用
提供了靈活的監(jiān)控模式腕够,包括直接查看數(shù)據(jù)庫(kù)级乍、通過(guò)Spring Batch
提供的API查看、JMX控制臺(tái)查看等帚湘。其中還說(shuō)到Spring Batch Admin
玫荣,不過(guò)這個(gè)項(xiàng)目已不維護(hù),改為用Spring Cloud Data Flow
了大诸。豐富的流程定義
支持順序任務(wù)捅厂、條件分支任務(wù)、基于這兩種任務(wù)可以組織復(fù)雜的任務(wù)流程资柔。健壯的批處理應(yīng)用
支持作業(yè)的跳過(guò)焙贷、重試、重啟能力贿堰、避免因錯(cuò)誤導(dǎo)致批處理作業(yè)的異常中斷辙芍。易擴(kuò)展的批處理應(yīng)用
擴(kuò)展機(jī)制包括多線程執(zhí)行一個(gè)Step(Multithreaded step)、多線程并行執(zhí)行多個(gè)Step(Parallelizing step)羹与、遠(yuǎn)程執(zhí)行作業(yè)(Remote chunking)故硅、分區(qū)執(zhí)行(partitioning step)。復(fù)用企業(yè)現(xiàn)有IT資產(chǎn)
提供多種Adapter
能力纵搁,使得企業(yè)現(xiàn)有的服務(wù)可以方便集成到批處理應(yīng)用中吃衅。避免重新開(kāi)發(fā)、達(dá)到復(fù)用企業(yè)遺留的服務(wù)資產(chǎn)腾誉。
3.2 Spring Batch 使用的典型場(chǎng)景
定期提交批處理任務(wù)
并行批處理
企業(yè)消息驅(qū)動(dòng)處理
大規(guī)模并行批處理
失敗后手動(dòng)或定時(shí)重啟
按順序處理依賴的任務(wù)(可擴(kuò)展為工作流驅(qū)動(dòng)的批處理)
部分處理:跳過(guò)記錄(例如徘层,回滾時(shí))
批處理事務(wù)
4.Spring Batch概念預(yù)覽
上面已經(jīng)列舉了很多Spring Batch
的優(yōu)點(diǎn)和適用場(chǎng)景,接下來(lái)我們對(duì)它的具體架構(gòu)及相應(yīng)使用到的概念做個(gè)簡(jiǎn)要說(shuō)明妄辩,以便實(shí)現(xiàn)后綴應(yīng)用實(shí)踐的開(kāi)發(fā)惑灵。
4.1 Spring Batch架構(gòu)
從Spring Batch
的github開(kāi)源項(xiàng)目中,可以看到主要是spring-batch-infrastructure
和spring-batch-core
模塊代碼眼耀,這也構(gòu)成了它的主要架構(gòu)英支。如下圖:
圖中突出了三個(gè)主要的高級(jí)組件:應(yīng)用層(Application
),核心層(Batch Core
)和基礎(chǔ)架構(gòu)層(Batch Infrastructure
)哮伟。其中該應(yīng)用層包含開(kāi)發(fā)人員使用Spring Batch
編寫的所有自定義的批處理作業(yè)和自定義代碼干花。 核心層包含啟動(dòng)和控制批處理作業(yè)所需的核心運(yùn)行時(shí)類妄帘。它包括 JobLauncher
,Job
和 Step
的實(shí)現(xiàn)池凄。 應(yīng)用層和核心層都建立 在通用基礎(chǔ)架構(gòu)之上抡驼。此基礎(chǔ)結(jié)構(gòu)包含通用的讀(ItemReader
)、寫(ItemWriter
)和服務(wù)處理(如RetryTemplate
)肿仑。在開(kāi)發(fā)應(yīng)用時(shí)致盟,引用spring-batch-infrastructure
和spring-batch-core
包,即可使用基礎(chǔ)架構(gòu)層及核心層內(nèi)容尤慰,然后基于這兩層進(jìn)行應(yīng)用業(yè)務(wù)邏輯的實(shí)現(xiàn)馏锡。
4.2 Spring Batch基本概念
熟悉Spring Batch
,先從基本概念學(xué)起伟端,開(kāi)發(fā)過(guò)程中不可避免會(huì)使用到這些概念杯道,因此需要先了解。下圖是Spring Batch
批處理的具體組件圖:
前面已經(jīng)提到责蝠,Spring Batch
在基礎(chǔ)架構(gòu)層党巾,把任務(wù)抽象為Job
和Step
,一個(gè)Job
由多個(gè)Step
來(lái)完成霜医,每個(gè)step
對(duì)應(yīng)一個(gè)ItemReader
齿拂、ItemProcessor
及ItemWriter
。Job
是通過(guò)JobLauncher
來(lái)啟動(dòng)肴敛,Job
及Job
的運(yùn)行結(jié)果和狀態(tài)创肥、Step
的運(yùn)行結(jié)果和狀態(tài),都會(huì)保存在JobRepository
中值朋。
概念說(shuō)明可見(jiàn)下表:
領(lǐng)域?qū)ο?/th> | 描述 |
---|---|
JobRepository | 作業(yè)倉(cāng)庫(kù)叹侄,保存Job、Step執(zhí)行過(guò)程中的狀態(tài)及結(jié)果 |
JobLauncher | 作業(yè)執(zhí)行器昨登,是執(zhí)行Job的入口 |
Job | 一個(gè)批處理任務(wù)趾代,由一個(gè)或多個(gè)Step組成 |
Step | 一個(gè)任務(wù)的具體的執(zhí)行邏輯單位 |
Item | 一條數(shù)據(jù)記錄 |
ItemReader | 從數(shù)據(jù)源讀數(shù)據(jù) |
ItemProcessor | 對(duì)數(shù)據(jù)進(jìn)行處理,如數(shù)據(jù)清洗丰辣、轉(zhuǎn)換撒强、過(guò)濾、校驗(yàn)等 |
ItemWriter | 寫入數(shù)據(jù)到指定目標(biāo) |
Chunk | 給定數(shù)量的Item集合笙什,如讀取到chunk數(shù)量后飘哨,才進(jìn)行寫操作 |
Tasklet | Step中具體執(zhí)行邏輯,可重復(fù)執(zhí)行 |
5.批處理工具比較
在實(shí)際應(yīng)用中琐凭,在批處理中用得較多的是場(chǎng)景是數(shù)據(jù)同步芽隆。在做數(shù)據(jù)集成工作中,常常需要從源位置把數(shù)據(jù)同步到目標(biāo)位置,以便于進(jìn)行后續(xù)的邏輯操作胚吁。在做這種批處理工具時(shí)牙躺,在網(wǎng)上查資料,發(fā)現(xiàn)用得比較多的是kettle及阿里的datax腕扶,對(duì)于這兩款工具孽拷,各有各的優(yōu)缺點(diǎn),我也試用了一段時(shí)間(有機(jī)會(huì)的話會(huì)針對(duì)它們的使用再寫一下文章)半抱,下面可以簡(jiǎn)要做個(gè)說(shuō)明脓恕,做個(gè)比較。
5.1 kettle
kettle是一款可以可視化編程的開(kāi)源ETL工具窿侈,把數(shù)據(jù)處理簡(jiǎn)化為Job和Transform进肯,在Transform中,提供了各種數(shù)據(jù)讀棉磨、寫、轉(zhuǎn)換学辱、處理的工具乘瓤。開(kāi)發(fā)者僅需要以工具界面中拖拽相應(yīng)的工具,進(jìn)行步驟連接即可完成一個(gè)ETL工作策泣,不同的工具及步驟結(jié)合起來(lái)可以形成相對(duì)復(fù)雜的作業(yè)流程衙傀,以完成ETL工作。它的優(yōu)點(diǎn)就在于可視化編程萨咕,非常容易上手统抬,對(duì)于不熟悉編程的人員來(lái)說(shuō),是一個(gè)福利危队。個(gè)人感覺(jué)針對(duì)簡(jiǎn)單(即邏輯判斷和操作不多的)的ETL工作聪建,是比較推薦用它。但缺點(diǎn)也有茫陆,一是易學(xué)難精金麸,它提供的操作非常多,要把它們都熟悉而且做到相互結(jié)合來(lái)完成任務(wù)簿盅,是有一定難度的挥下。二是對(duì)于一些復(fù)雜的的邏輯判斷及操作,kettle雖然可以做桨醋,但操作起來(lái)就很復(fù)雜棚瘟。三是不方便調(diào)試,盡管它內(nèi)置有調(diào)試功能喜最,但由于在轉(zhuǎn)換中偎蘸,操作都是并行的,單步調(diào)試比較難實(shí)現(xiàn)。四是內(nèi)存消耗禀苦,本身kettle界面跑起來(lái)已經(jīng)是比較耗內(nèi)存的蔓肯,而作業(yè)中數(shù)據(jù)量大的時(shí)候,內(nèi)存消耗更大振乏。
5.2 datax
DataX 是阿里巴巴集團(tuán)內(nèi)被廣泛使用的離線數(shù)據(jù)同步工具/平臺(tái)蔗包,實(shí)現(xiàn)包括 MySQL、Oracle慧邮、SqlServer调限、Postgre、HDFS误澳、Hive耻矮、ADS、HBase忆谓、TableStore(OTS)裆装、MaxCompute(ODPS)、DRDS
等各種異構(gòu)數(shù)據(jù)源之間高效的數(shù)據(jù)同步功能倡缠。DataX本身作為數(shù)據(jù)同步框架哨免,將不同數(shù)據(jù)源的同步抽象為從源頭數(shù)據(jù)源讀取數(shù)據(jù)的Reader插件,以及向目標(biāo)端寫入數(shù)據(jù)的Writer插件昙沦,理論上DataX框架可以支持任意數(shù)據(jù)源類型的數(shù)據(jù)同步工作琢唾。同時(shí)DataX插件體系作為一套生態(tài)系統(tǒng), 每接入一套新數(shù)據(jù)源該新加入的數(shù)據(jù)源即可實(shí)現(xiàn)和現(xiàn)有的數(shù)據(jù)源互通。
DataX從架構(gòu)上而言也是設(shè)計(jì)得很簡(jiǎn)潔的盾饮,它作為數(shù)據(jù)搬運(yùn)工采桃,支持任意數(shù)據(jù)類型的同步工作,跟Spring Batch
有異曲同工之妙丘损,DataX本身作為離線數(shù)據(jù)同步框架普办,采用Framework + plugin
架構(gòu)構(gòu)建。將數(shù)據(jù)源讀取和寫入抽象成為Reader/Writer
插件徘钥,納入到整個(gè)同步框架中泌豆。
Reader:Reader為數(shù)據(jù)采集模塊,負(fù)責(zé)采集數(shù)據(jù)源的數(shù)據(jù)吏饿,將數(shù)據(jù)發(fā)送給Framework踪危。
Writer: Writer為數(shù)據(jù)寫入模塊,負(fù)責(zé)不斷向Framework取數(shù)據(jù)猪落,并將數(shù)據(jù)寫入到目的端贞远。
Framework:Framework用于連接reader和writer,作為兩者的數(shù)據(jù)傳輸通道笨忌,并處理緩沖蓝仲,流控,并發(fā),數(shù)據(jù)轉(zhuǎn)換等核心技術(shù)問(wèn)題袱结。
DataX本身也提供比較豐富的Reader和Writer亮隙,按它的文檔,以它作為工具進(jìn)行數(shù)據(jù)同步垢夹,還是比較簡(jiǎn)單的溢吻。而且有阿里的背書,可放心使用果元。不過(guò)缺點(diǎn)一是不常維護(hù)更新促王,github上最近的更新是去年(2018);二是二次開(kāi)發(fā)有難度而晒,我嘗試跑源碼蝇狼,想做二次開(kāi)發(fā),雖然最終跑起來(lái)倡怎,但也費(fèi)了不少力氣迅耘。三是雖然架構(gòu)清晰,但使用規(guī)則操作起來(lái)不是很靈活监署,基本是通過(guò)json配置文件颤专,按規(guī)則進(jìn)行配置,想自定義規(guī)則是不行的焦匈。
5.3 總體感受
相對(duì)而言,統(tǒng)合考慮易用性昵仅、可擴(kuò)展性缓熟,靈活性,可編程性摔笤,個(gè)人感覺(jué)Spring Batch
會(huì)比較適合有點(diǎn)編程基礎(chǔ)(特別是使用Spring及SpringBoot框架)的開(kāi)發(fā)人員够滑,針對(duì)業(yè)務(wù)編程,可自由發(fā)揮吕世。
6彰触、總結(jié)
本文章對(duì)Spring Batch
框架進(jìn)行簡(jiǎn)要介紹,并指出它的優(yōu)勢(shì)及使用場(chǎng)景命辖,然后對(duì)它使用的組件基本概念進(jìn)行簡(jiǎn)要說(shuō)明况毅,最后跟現(xiàn)在比較通用的kettle和DataX進(jìn)行比較,希望讀者通過(guò)這篇文章尔艇,對(duì)Spring Batch
有一定的了解尔许。在接下來(lái)的文章,即進(jìn)入實(shí)戰(zhàn)類的編寫终娃,逐步構(gòu)建企業(yè)級(jí)的批處理應(yīng)用味廊。
參考資源
- 1.Spring Batch官網(wǎng):有Spring Batch的文檔及example
- 2.Spring Batch的github源碼:里面包含源碼,example,發(fā)布情況等余佛。
- 3.劉相《Spring Batch 批處理框架》:書中對(duì)Spring Batch進(jìn)行了詳細(xì)的描述柠新,本文章主要參考此書。
- 4.kettle官網(wǎng):kettle的官網(wǎng)辉巡,可以在此處下載kettle
- 5.datax官網(wǎng):datax的github恨憎,里面有相應(yīng)源碼和文檔,示例