⼤数据批处理框架SpringBatch+springboot+quartz
1简介
1.1概述
⼤数据时代,数据的收集、处理、存储、分析、挖掘、检索、展⽰,环环相扣。其中数据处理环节是⼀个典型的批处理场景——定期对海量数据进⾏格式化,各种业务规范校验,复杂的业务逻辑处理,并通过事务的⽅式处理到⾃⼰的数据库中,同时还应该具备⾼效率,⽆⼈⼯⼲预能⼒。
Spring Batch的出现,很好的应对了该类需求。Spring Batch是⼀个轻量级的综合性批处理框架,可以应⽤于企业级⼤数据量处理系统。SpringBatch可以提供⼤量的,可重复的数据处理功能,包括⽇志/跟踪(tracing),事务管理,任务处理(processing)统计,任务重启,忽略(skip),和资源管理等功能。此外还提供了许多⾼级服务和特性,使之能够通过优化(optimization)和分⽚技术(partitioning techniques)来⾼效地执⾏超⼤型数据集的批处理任务。需要注意的是,Spring Batch并不提供定时之类的功能,那是
quartz,Tivoli,Control-M等调度框架做的事情,它们是协作关系,⽽不是取代。
1.2背景
在微服务架构讨论的如⽕如荼之际,基于Java的批处理框架却⽆⼈问津。即使企业中⼀直都有批处理的需求,但因缺乏⼀个标准的、可重⽤的批处理框架,致使项⽬/产品中出现⼤量⼀次编写,⼀次使⽤的代码⽚段,以及很多其他不同的临时解决⽅案。
SpringSource和Accenture(埃森哲)联⼿协作,致⼒于改善这种状况。埃森哲在实现批处理架构上有着丰富的产业实践经
验,SpringSource有深⼊的技术开发积累,背靠Spring框架提供的编程模型,强强联合,势必创造出⾼质量的、市场认可的企业级java解决⽅案——SpringBatch,基于埃森哲数⼗年宝贵的经验并基于最新的软件平台(如COBOL/Mainframe,C++/Unix 及现在⾮常流⾏的Java平台)来构建的项⽬。Spring Batch未来将会由开源社区提交者来驱动项⽬的开发、增强、以及未来的路线图。⽽埃森哲咨询公司与SpringSource合作的⽬标是促进软件处理⽅法、框架和⼯具的标准化改进。
1.3场景
典型的批处理流程是读数据、处理数据、写数据的三步式架构——从数据库、⽂件或队列中读取⼤量数据,然后通过业务规则处理数据,最后将处理完的数据按需求⽅式写(数据库、⽂件等)。通常Spring Batch⼯作在离线模式下,不需要⽤户⼲预、就能⾃动进⾏基本的批处理迭代,进⾏类似事务⽅式的处理。
1.3.1 适⽤业务
Ø 定期提交批处理任务(⽇终处理)
Ø 并发批处理:并⾏执⾏任务
Ø 分阶段,企业消息驱动处理
Ø ⾼并发批处理任务
Ø 失败后⼿动或定时重启
Ø 按顺序处理依赖任务 (使⽤⼯作流驱动的批处理插件)
Ø 局部处理:跳过记录(例如在回滚时)
Ø 完整的批处理事务:因为可能有⼩数据量的批处理或存在存储过程/脚本
1.3.2核⼼能⼒
Ø 利⽤Spring编程模式:使开发者专注于业务逻辑,让框架解决基础功能
Ø 明确划分在批处理基础架构、执⾏环境、应⽤
Ø 通⽤的核⼼服务以接⼝形式提供
Ø 提供简单的默认实现,以实现核⼼执⾏接⼝的“开箱即⽤”
Ø 易于配置、定制和扩展服务
Ø 核⼼服务很容易扩展与替换,且不会影响基础层
Ø 简单部署模型
2关键架构与领域术语
2.1层次架构
Spring Batch的架构设计是充分考虑了系统的可扩展性和各类终端开发的普适性。下图2.1.1是Spring Batch的层次架构⽰意图。
图2.1.1-SpringBatch层次架构图
Spring Batch架构主要分为三类⾼级组件: 应⽤层(Application), 核⼼层(Core) 和基础架构层(Infrastructure)。
应⽤层(Application):指开发⼈员编写的所有批处理业务作业和⾃定义代码。
核⼼层(Core):指加载和控制批处理作业所必需的核⼼类。含JobLauncher,Job和 Step的实现。
基础架构层(Infrastructure):应⽤层与核⼼层都构建在基础架构层之上。基础架构包括通⽤的readers(ItemReader)和
writers(ItemWriter),以及services (如重试模块 RetryTemplate),可以被应⽤层和核⼼层所使⽤。
2.2领域术语
Step:表⽰作业Job中的⼀个完整业务逻辑步骤,⼀个Job可以有⼀个或者多个Step组成。
StepExecution:表⽰试运⾏⼀个步骤step的句柄。只有步骤step真的得到运⾏才会被创建。
Job(作业):作业是封装整个批处理过程的实体。⼀个简单的作业需要配置作业名、有序的步骤step、及是否重启。
JobInstance(作业实例):⼀个作业实例与其要加载的数据⽆硬性关联,这完全是由数据读⼊器ItemReader决定。⽐如:是否使⽤同⼀个作业实例,是由ItemReader根据前⼀次执⾏的状态位(state)决定。⽤新的JobInstance意味从开头读取数据,⽤已有的表⽰从上次结束的地⽅开始。
JobParameter(作业参数):是指⼀个批量作业开始的参数集。同时,可以⽤于标识JobInstance的唯⼀性。所以可以认为
JobInstance=Job+JobParameter。
JobExecution:表⽰试运⾏⼀个作业的句柄。
如下图2.2.1所⽰,Job好⽐是容器,可以包含多个业务逻辑步骤step与多个JobInstance,来组织作业的执⾏(亦可以保证作业的重启),⽽JobExecution则是致⼒于记录执⾏状态。每⼀次执⾏中JobExecution和step都会进⾏数据信息传输,⽐如:commitCount、rollbackCount、startTime、endTime等,这些都会记录进StepExecution。
图2.2.1-批处理框架运⾏期的模型
JobLauncher(作业调度器):是Spring Batch框架基础设施层提供运⾏Job的能⼒。对于将给定Job名称和作Job Parameters的Job,由Java程序、命令⾏或者其它调度框架(如Quartz)中调⽤JobLauncher执⾏Job。
JobRepository(作业仓库):来存储Job执⾏期的元数据(这⾥的元数据是指Job Instance、Job Execution、Job Parameters、Step Execution、Execution Context等数据)。有两种默认实现——内
存或数据库。若将元数据存放在数据库中,可以随时监控批处理Job的执⾏状态。Job执⾏结果是成功还是失败,并且使失败Job重新启动Job成为可能。
ItemReader:是对step的输⼊的抽象,每次只读⼊⼀条记录,读取完所有记录后,则返回null。
ItemProcessor:是对每条记录按业务逻辑处理的抽象。
ItemWriter:是对step的输出的抽象,每次只可以提供给⼀次批作业或记录队(chunk)。
下图2.2.2显⽰了完整的SpringBatch领域概念模型。JobLancaster启动Job,Job可有多个Step组合,每⼀个step对应⼀个ItemReader、ItemProcessor及ItemWriter,⽽JobRepository记录Job执⾏信息。
2.2.2-Spring Batch领域概念模型
3实战演习
光说不练假把式,这个章节就让我们⼀起实战操练下。
3.1What I’ll build
定时每天凌晨1点,按业务需求将TEST_TASK_PROPERTY表和DQP_TEST_FILE表数据汇总整合到表DQP_REPORT_A,即将结果数据表汇总到统计表中。
3.2What you’ll need
Eclipse
JDK 1.7 or later
Maven 3.0
3.3Set up the project
本⼯程是由maven构建,使⽤SpringBoot简化复杂的依赖配置及部署,使⽤Quartz作为任务调度框架,SpringBatch作为批处理框架,数据持久化使⽤JPA。
3.l⽂件
<?xml version="1.0"encoding="UTF-8"?>
<projectxmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.william.lab.springboot.springbatch</groupId>
<artifactId>springbatch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springbatch</name>
<description>Testproject for Spring Boot + Spring Batch + Quartz</description>
<parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
&porting.outputEncoding>UTF-8</porting.outputEncoding> <java.version>1.7</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jboss-logging</artifactId>
<groupId>org.jboss.logging</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
springboot框架的作用<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!--sftp连接 jar -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
</plugins>
</build>
</project>
3.3.2Batch作业模块配置
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论