資料批處理神器-Spring Batch(1)簡介及使用場景
tags: springbatch
1.引言
最近使用Spring Batch
進行做資料遷移、資料同步、資料批處理等工作,感嘆Spring Batch
設計之簡潔,對批處理程式設計的抽象能力之強大。
眾所周知,隨著大資料技術發展,企業對資料越來越重視,如何把資料有效轉化為資訊,以幫助企業提供資料分析、商業決策、提高核心競爭力。而批處理則是實現這一目標的其中一個重要手段。通過批處理,可以完成資料載入、抽取、轉換、驗證、清洗等功能。這些工作具有資料量大、無需人工操作、與時間密切相關(如隔一段時間處理一次)等特點。
對於批處理資料,無論是資料抽取、資料庫遷移、資料同步等業務,涉及的具體操作,不外乎資料讀取,資料處理,資料寫入三種。按這個思路,在批處理程式設計過程中,如何做到結構清晰、介面通用,過程可見,出錯處理,是需要花費一定的功夫的,而Spring Batch
Spring Batch
,可以把複雜的業務問題做成簡單化的抽象,程式設計過程中,只需要關心具體的業務實現即可,把流程以及流程的控制交給Spring Batch
吧。
在學習過程中,我閱讀了Spring Batch
的官方檔案及劉相的《Spring Batch批處理框架》,本系列將對Spring Batch
進行介紹以及結合案例進行實踐,希望對入門的同學有幫助,也希望和大家一起交流。本篇先對Spring Batch
進行介紹。
2.Spring Batch簡介
2.1 Spring Batch是批處理框架
對於使用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之間的合作旨在促進軟體處理方法,框架和工具的標準化,在建立批處理應用程式時,企業或使用者可以始終如一地利用這些方法,框架和工具。無論如何,這是開發者的福利,避免重複開發。
2.2 Spring Batch不是排程框架
Spring Batch
本身是批處理邏輯的抽象,是對執行任務的規範化,跟排程框架是兩回事。它可以結合排程框架,由排程框架進行排程Spring Batch
作業,完成對批處理的任務。排程框架有相應的開源軟體可供選擇,如quartz
,cron
,xxl-job
等。
2.3 Spring Batch的簡單說明
前面說的,Spring Batch
把批處理簡單化,標準化是如何體現出來。簡單來說,Spring Batch
把批處理簡化為Job
和Job step
兩部分,在Job step
中,把資料處理分為讀資料(Reader)、處理資料(Processor)、寫資料(Writer)三個步驟,異常處理機制分為跳過、重試、重啟三種,作業方式分為多執行緒、並行、遠端、分割槽四種。開發者在開發過程中,大部分工作是根據業務要求編寫Reader、Processor和Writer即可,提高了批處理開發的效率。同時Spring Batch
本身也提供了很多預設的Reader和Writer,開箱即用。
3.Spring Batch優勢與使用場景
對於Spring Batch
的優勢和使用場景,在《Spring Batch批處理框架》書中,已經作了比較全面的說明,個人覺得寫得比較好了,現摘抄下來,可以供大家參考,以判斷Spring Batch
是否適用於自己開發的業務。
3.1 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
能力,使得企業現有的服務可以方便整合到批處理應用中。避免重新開發、達到複用企業遺留的服務資產。
3.2 Spring Batch 使用的典型場景
-
定期提交批處理任務
-
並行批處理
-
企業訊息驅動處理
-
大規模並行批處理
-
失敗後手動或定時重啟
-
按順序處理依賴的任務(可擴充套件為工作流驅動的批處理)
-
部分處理:跳過記錄(例如,回滾時)
-
批處理事務
4.Spring Batch概念預覽
上面已經列舉了很多Spring Batch
的優點和適用場景,接下來我們對它的具體架構及相應使用到的概念做個簡要說明,以便實現字尾應用實踐的開發。
4.1 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
包,即可使用基礎架構層及核心層內容,然後基於這兩層進行應用業務邏輯的實現。
4.2 Spring Batch基本概念
熟悉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中具體執行邏輯,可重複執行 |
5.批處理工具比較
在實際應用中,在批處理中用得較多的是場景是資料同步。在做資料整合工作中,常常需要從源位置把資料同步到目標位置,以便於進行後續的邏輯操作。在做這種批處理工具時,在網上查資料,發現用得比較多的是kettle及阿里的datax,對於這兩款工具,各有各的優缺點,我也試用了一段時間(有機會的話會針對它們的使用再寫一下文章),下面可以簡要做個說明,做個比較。
5.1 kettle
kettle是一款可以視覺化程式設計的開源ETL工具,把資料處理簡化為Job和Transform,在Transform中,提供了各種資料讀、寫、轉換、處理的工具。開發者僅需要以工具介面中拖拽相應的工具,進行步驟連線即可完成一個ETL工作,不同的工具及步驟結合起來可以形成相對複雜的作業流程,以完成ETL工作。它的優點就在於視覺化程式設計,非常容易上手,對於不熟悉程式設計的人員來說,是一個福利。個人感覺針對簡單(即邏輯判斷和操作不多的)的ETL工作,是比較推薦用它。但缺點也有,一是易學難精,它提供的操作非常多,要把它們都熟悉而且做到相互結合來完成任務,是有一定難度的。二是對於一些複雜的的邏輯判斷及操作,kettle雖然可以做,但操作起來就很複雜。三是不方便除錯,儘管它內建有除錯功能,但由於在轉換中,操作都是並行的,單步除錯比較難實現。四是記憶體消耗,本身kettle介面跑起來已經是比較耗記憶體的,而作業中資料量大的時候,記憶體消耗更大。
5.2 datax
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配置檔案,按規則進行配置,想自定義規則是不行的。
5.3 總體感受
相對而言,統合考慮易用性、可擴充套件性,靈活性,可程式設計性,個人感覺Spring Batch
會比較適合有點程式設計基礎(特別是使用Spring及SpringBoot框架)的開發人員,針對業務程式設計,可自由發揮。
6、總結
本文章對Spring Batch
框架進行簡要介紹,並指出它的優勢及使用場景,然後對它使用的元件基本概念進行簡要說明,最後跟現在比較通用的kettle和DataX進行比較,希望讀者通過這篇文章,對Spring Batch
有一定的瞭解。在接下來的文章,即進入實戰類的編寫,逐步構建企業級的批處理應用。
參考資源
- 1.Spring Batch官網:有Spring Batch的檔案及example
- 2.Spring Batch的github原始碼:裡麵包含原始碼,example,釋出情況等。
- 3.劉相《Spring Batch 批處理框架》:書中對Spring Batch進行了詳細的描述,本文章主要參考此書。
- 4.kettle官網:kettle的官網,可以在此處下載kettle
- 5.datax官網:datax的github,裡面有相應原始碼和檔案,示例