tags: springbatchjava
最近使用Spring Batch
進行作數據遷移、數據同步、數據批處理等工做,感嘆Spring Batch
設計之簡潔,對批處理編程的抽象能力之強大。git
衆所周知,隨着大數據技術發展,企業對數據愈來愈重視,如何把數據有效轉化爲信息,以幫助企業提供數據分析、商業決策、提升核心競爭力。而批處理則是實現這一目標的其中一個重要手段。經過批處理,能夠完成數據加載、抽取、轉換、驗證、清洗等功能。這些工做具備數據量大、無需人工操做、與時間密切相關(如隔一段時間處理一次)等特色。github
對於批處理數據,不管是數據抽取、數據庫遷移、數據同步等業務,涉及的具體操做,不外乎數據讀取,數據處理,數據寫入三種。按這個思路,在批處理編程過程當中,如何作到結構清晰、接口通用,過程可見,出錯處理,是須要花費必定的功夫的,而Spring Batch
框架的出現,則填補這一空缺。當初看到這個框架後,真的有相見恨晚的感受,這不就是我想要的嗎。讀、處理、寫分別抽象出來,經過Spring Batch
,能夠把複雜的業務問題作成簡單化的抽象,編程過程當中,只須要關心具體的業務實現便可,把流程以及流程的控制交給Spring Batch
吧。web
在學習過程當中,我閱讀了Spring Batch
的官方文檔及劉相的《Spring Batch批處理框架》,本系列將對Spring Batch
進行介紹以及結合案例進行實踐,但願對入門的同窗有幫助,也但願和你們一塊兒交流。本篇先對Spring Batch
進行介紹。spring
對於使用java
技術進行業務編程開發的領域,Spring Framework
無疑是當前企業開發的龍頭,從早期的spring
開發,到Spring MVC
的web開發,再到如今的基於Spring Boot
進行微服務開發,都具備簡化開發,加強規範,快速集成等特色,而在數據處理領域,spring
一樣有一個開發框架,那就是Spring Batch
。Spring Batch是一個輕量級,完善的批處理框架,旨在幫助企業創建健壯高效的批處理應用程序。 它是以Spring 框架爲基礎開發,使得原來使用Spring框架的開發者能夠更容易利用原來的服務。當前新版本的Spring Batch
更是能夠直接基於Spring Boot
進行開發,使得開發更簡單、快捷。數據庫
根據官方文檔說明,Spring Batch
是由Spring Source
和Accenture
(埃森哲)合做開發的,埃森哲貢獻了幾十年來在使用和構建批量架構方面的經驗,埃森哲與SpringSource之間的合做旨在促進軟件處理方法,框架和工具的標準化,在建立批處理應用程序時,企業或用戶能夠始終如一地利用這些方法,框架和工具。不管如何,這是開發者的福利,避免重複開發。編程
Spring Batch
自己是批處理邏輯的抽象,是對執行任務的規範化,跟調度框架是兩回事。它能夠結合調度框架,由調度框架進行調度Spring Batch
做業,完成對批處理的任務。調度框架有相應的開源軟件可供選擇,如quartz
,cron
,xxl-job
等。json
前面說的,Spring Batch
把批處理簡單化,標準化是如何體現出來。簡單來講,Spring Batch
把批處理簡化爲Job
和Job step
兩部分,在Job step
中,把數據處理分爲讀數據(Reader)、處理數據(Processor)、寫數據(Writer)三個步驟,異常處理機制分爲跳過、重試、重啓三種,做業方式分爲多線程、並行、遠程、分區四種。開發者在開發過程當中,大部分工做是根據業務要求編寫Reader、Processor和Writer便可,提升了批處理開發的效率。同時Spring Batch
自己也提供了不少默認的Reader和Writer,開箱即用。多線程
對於Spring Batch
的優點和使用場景,在《Spring Batch批處理框架》書中,已經做了比較全面的說明,我的以爲寫得比較好了,現摘抄下來,能夠供你們參考,以判斷Spring Batch
是否適用於本身開發的業務。架構
豐富的開箱即用組件 開箱即用組件包括各類資源的讀、寫。讀/寫:支持文本文件讀/寫、XML文件讀/寫、數據庫讀/寫、JMS隊列讀/寫等。還提供做業倉庫,做業調度器等基礎設施,大大簡化開發複雜度。
面向chunk處理 支持屢次讀、一次寫、避免屢次對資源的寫入,大幅提高批處理效率。
事務管理能力 默認採用Spring提供的聲明式事務管理模型,面向Chunk的操做支持事務管理,同時支持爲每一個tasklet操做設置細粒度的事務配置:隔離級別、傳播行爲、超時設置等。
元數據管理 自動記錄Job和Step的執行狀況、包括成功、失敗、失敗的異常信息、執行次數、重試次數、跳過次數、執行時間等,方便後期的維護和查看。
易監控的批處理應用 提供了靈活的監控模式,包括直接查看數據庫、經過Spring Batch
提供的API查看、JMX控制檯查看等。其中還說到Spring Batch Admin
,不過這個項目已不維護,改成用Spring Cloud Data Flow
了。
豐富的流程定義 支持順序任務、條件分支任務、基於這兩種任務能夠組織複雜的任務流程。
健壯的批處理應用 支持做業的跳過、重試、重啓能力、避免因錯誤致使批處理做業的異常中斷。
易擴展的批處理應用 擴展機制包括多線程執行一個Step(Multithreaded step)、多線程並行執行多個Step(Parallelizing step)、遠程執行做業(Remote chunking)、分區執行(partitioning step)。
複用企業現有IT資產 提供多種Adapter
能力,使得企業現有的服務能夠方便集成到批處理應用中。避免從新開發、達到複用企業遺留的服務資產。
按期提交批處理任務
並行批處理
企業消息驅動處理
大規模並行批處理
失敗後手動或定時重啓
按順序處理依賴的任務(可擴展爲工做流驅動的批處理)
部分處理:跳過記錄(例如,回滾時)
批處理事務
上面已經列舉了不少Spring Batch
的優勢和適用場景,接下來咱們對它的具體架構及相應使用到的概念作個簡要說明,以便實現後綴應用實踐的開發。
從Spring Batch
的github開源項目中,能夠看到主要是spring-batch-infrastructure
和spring-batch-core
模塊代碼,這也構成了它的主要架構。以下圖:
圖中突出了三個主要的高級組件:應用層(Application
),核心層(Batch Core
)和基礎架構層(Batch Infrastructure
)。其中該應用層包含開發人員使用Spring Batch
編寫的全部自定義的批處理做業和自定義代碼。 核心層包含啓動和控制批處理做業所需的核心運行時類。它包括 JobLauncher
,Job
和 Step
的實現。 應用層和核心層都創建 在通用基礎架構之上。此基礎結構包含通用的讀(ItemReader
)、寫(ItemWriter
)和服務處理(如RetryTemplate
)。在開發應用時,引用spring-batch-infrastructure
和spring-batch-core
包,便可使用基礎架構層及核心層內容,而後基於這兩層進行應用業務邏輯的實現。
熟悉Spring Batch
,先從基本概念學起,開發過程當中不可避免會使用到這些概念,所以須要先了解。下圖是Spring Batch
批處理的具體組件圖:
前面已經提到,Spring Batch
在基礎架構層,把任務抽象爲Job
和Step
,一個Job
由多個Step
來完成,每一個step
對應一個ItemReader
、ItemProcessor
及ItemWriter
。Job
是經過JobLauncher
來啓動,Job
及Job
的運行結果和狀態、Step
的運行結果和狀態,都會保存在JobRepository
中。 概念說明可見下表:
領域對象 | 描述 |
---|---|
JobRepository | 做業倉庫,保存Job、Step執行過程當中的狀態及結果 |
JobLauncher | 做業執行器,是執行Job的入口 |
Job | 一個批處理任務,由一個或多個Step組成 |
Step | 一個任務的具體的執行邏輯單位 |
Item | 一條數據記錄 |
ItemReader | 從數據源讀數據 |
ItemProcessor | 對數據進行處理,如數據清洗、轉換、過濾、校驗等 |
ItemWriter | 寫入數據到指定目標 |
Chunk | 給定數量的Item集合,如讀取到chunk數量後,才進行寫操做 |
Tasklet | Step中具體執行邏輯,可重複執行 |
在實際應用中,在批處理中用得較多的是場景是數據同步。在作數據集成工做中,經常須要從源位置把數據同步到目標位置,以便於進行後續的邏輯操做。在作這種批處理工具時,在網上查資料,發現用得比較多的是kettle及阿里的datax,對於這兩款工具,各有各的優缺點,我也試用了一段時間(有機會的話會針對它們的使用再寫一下文章),下面能夠簡要作個說明,作個比較。
kettle是一款能夠可視化編程的開源ETL工具,把數據處理簡化爲Job和Transform,在Transform中,提供了各類數據讀、寫、轉換、處理的工具。開發者僅須要以工具界面中拖拽相應的工具,進行步驟鏈接便可完成一個ETL工做,不一樣的工具及步驟結合起來能夠造成相對複雜的做業流程,以完成ETL工做。它的優勢就在於可視化編程,很是容易上手,對於不熟悉編程的人員來講,是一個福利。我的感受針對簡單(即邏輯判斷和操做很少的)的ETL工做,是比較推薦用它。但缺點也有,一是易學難精,它提供的操做很是多,要把它們都熟悉並且作到相互結合來完成任務,是有必定難度的。二是對於一些複雜的的邏輯判斷及操做,kettle雖然能夠作,但操做起來就很複雜。三是不方便調試,儘管它內置有調試功能,但因爲在轉換中,操做都是並行的,單步調試比較難實現。四是內存消耗,自己kettle界面跑起來已是比較耗內存的,而做業中數據量大的時候,內存消耗更大。
DataX 是阿里巴巴集團內被普遍使用的離線數據同步工具/平臺,實現包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS
等各類異構數據源之間高效的數據同步功能。DataX自己做爲數據同步框架,將不一樣數據源的同步抽象爲從源頭數據源讀取數據的Reader插件,以及向目標端寫入數據的Writer插件,理論上DataX框架能夠支持任意數據源類型的數據同步工做。同時DataX插件體系做爲一套生態系統, 每接入一套新數據源該新加入的數據源便可實現和現有的數據源互通。
DataX從架構上而言也是設計得很簡潔的,它做爲數據搬運工,支持任意數據類型的同步工做,跟Spring Batch
有殊途同歸之妙,DataX自己做爲離線數據同步框架,採用Framework + plugin
架構構建。將數據源讀取和寫入抽象成爲Reader/Writer
插件,歸入到整個同步框架中。 Reader:Reader爲數據採集模塊,負責採集數據源的數據,將數據發送給Framework。 Writer: Writer爲數據寫入模塊,負責不斷向Framework取數據,並將數據寫入到目的端。 Framework:Framework用於鏈接reader和writer,做爲二者的數據傳輸通道,並處理緩衝,流控,併發,數據轉換等核心技術問題。
DataX自己也提供比較豐富的Reader和Writer,按它的文檔,以它做爲工具進行數據同步,仍是比較簡單的。並且有阿里的背書,可放心使用。不過缺點一是不常維護更新,github上最近的更新是去年(2018);二是二次開發有難度,我嘗試跑源碼,想作二次開發,雖然最終跑起來,但也費了很多力氣。三是雖然架構清晰,但使用規則操做起來不是很靈活,基本是經過json配置文件,按規則進行配置,想自定義規則是不行的。
相對而言,統合考慮易用性、可擴展性,靈活性,可編程性,我的感受Spring Batch
會比較適合有點編程基礎(特別是使用Spring及SpringBoot框架)的開發人員,針對業務編程,可自由發揮。
本文章對Spring Batch
框架進行簡要介紹,並指出它的優點及使用場景,而後對它使用的組件基本概念進行簡要說明,最後跟如今比較通用的kettle和DataX進行比較,但願讀者經過這篇文章,對Spring Batch
有必定的瞭解。在接下來的文章,即進入實戰類的編寫,逐步構建企業級的批處理應用。