Springbatch框架系列(1-1)Spring batch介绍

2023-10-12 08:08

本文主要是介绍Springbatch框架系列(1-1)Spring batch介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本博文主要从以下几个方面进行介绍:

  • 了解当下批处理框架
  • 介绍下spring batch的主要特点
  • 批处理高效的读写数据
  • 用Spring batch实现一个批处理任务
  • Spring batch任务测试

Spring
batch之所以出现,是因为批处理应用对于写是一种挑战:使得数据的write操作更加容易实现,并且程序处理更加健壮、更加可靠。那么什么是批处理应用呢?批处理任务不在人工介入的情况下处理大规模数据。你可以选择使用批处理程序进行计算生成金融报表、计算统计以及处理索引文件等。将会在后续的文章中介绍大量的批处理应用。你就会了解到对于大规模数据处理的准确、高效、可靠、高性能有多么搞得要求。那么Spring
batch具备实现上述功能的条件,spring batch能够处理多种类型的数据源,包括:数据库、文件。队列等

1.1 什么是批处理应用

常见的批处理应用就是从文件中导入数据然后在另一个系统中处理数据。当你需要在两个系统间交换数据时,先从系统A导入元数据,然后经过一定转换导入系统B。如图:
在这里插入图片描述
批处理任务是自动进行的,所以它必须具备很强的容错能力,不会人为处理异常。批处理要处理的数据量越大,花费的时间越长。由于批量任务可能是在特定的时间段执行,这就必须要保证任务的执行效率。因此,批处理任务有以下几方面的要求:

  • 数据量大:批处理应用必须能够实现大规模数据的导入、导出以及计算;
  • 自动的:排除特殊场景外,批处理要能在非人工干预下自动执行;
  • 鲁棒性:批处理应用必须能够具备处理无效数据的能力,防止过早的崩掉、退出;
  • 可靠性:批处理任务必须对任务的异常进行跟踪、日志记录发生的时间、原因;
  • 高性能:批处理必须是在特定的时间段内完成计算,避免影响其他应用。

Tips:批处理任务如何适应当下的软件结构?
高性能计算与数据转导是批处理应用的典型案例,但是这些类型的应用并没什么关联性。计算型的应用必须在特定的时间内处理大量的数据,并进行大量计算的,使用的较多的是边缘切割算法MapReduce。对于数据转导型的应用,基于消息的解决方案较为流行。有着将批量任务转为准实时的好处。尽管消息是一种很有效的设计模式,但受限于特定的适用场景。很明显,消息的短板在使用的时候需要慎重选择。消息和批处理任务并不是相互独立的解决方式:可以选择用消息交换数据,然后用批处理应用来处理数据,这样也就在应用中保证了应用的安全、可靠。

1.2 认识Spring batch

Spring batch的目标是提供一个开源的批处理框架,以致于能够涵盖大多数应用场景。Spring batch项目是2007年埃森哲咨询公司与SpringSource提出的,埃森哲提供了多年来批处理方面的处理经验,进而出现了现在基于Spring架构的批处理框架Spring batch。下面说下Spring batch的主要特点:

特点描述
基于Spring框架受益于企业的支持,spring的依赖注入、切面编程
基于批处理的在读写数据上有很好的表现
简单易用提供的组件能够支持大多数批处理场景(包括从文件以及数据库中对数据的读写)
鲁棒性、可靠性可以显式定义时间的跳过、重试,失败时允许重启

通过使用Spring batch,就会发现sping框架的诸多优点,并且spring batch提供了很多现成的组件来适应当下比较流行的场景、技术。下表主要描述了spring batch对读写技术的支持:

数据源类型技术组件描述
DatabaseJDBC分页、游标、批量更新
DatabaseHibernate分页、游标
DatabaseJPA(Java Persisitence API)分页
DatabaseiBatis分页
FileFlat file支持划定分隔符的、限定长度的文件
Filexml使用Stax(Streaming API for XML)进行解析;在Sping OXM上进行构建,支持JAXB,XStream和Castor

Tips:Spring batch不是一种执行计划?
Spring batch能够驱动批量任务的执行,但它不会提供一种高级的手段去调用它,而框架使用的调度框架是Quartz和Corn。批量任务的触发通过获取Spring batch的运行时,或者加载特定的JVM进程。有时顺序加载批量任务:如果job a执行成功了再执行job B,如果job A失败了就执行Job C。这种执行计划能够用文件进行配置,spring batch中能够通过配置自己的执行顺序,spring batch的任务是由step组合而成的。

1.2.1 鲁棒性、可靠性

一条错误格式的记录不应该导致job的失败。至少不应该总是这样的,对于错误行的或者错误记录的跳过在Spring batch中是可以显式声明的,配置完成即可。
当重启一项失败的任务时有可能会发生:是否应该从头开始启动,有可能会重复处理数据;是否能够准确的从失败退出的位置重启?Spring batch使得后者的实现变得简单:组件能够跟踪job的运行状态,框架能够提供重启的必要数据。组件能够准确的知道job是从何处退出的,并且能够在正确的位置重启任务。

1.2.2 伸缩策略

Spring batch处理数据是按块进行处理的,在数据的读、写上都是按照一小块实现的。块处理也就使得流数据不会一下都加载到内存,一般来说,块处理是单线程的,性能优异。但是一些特殊场景要求Spring batch任务要处理更快,Spring batch也提供了支持多线程,在多台物理节点上处理的机制。这种伸缩,用到了**分区【partition】**的概念。
分区的划分将一个step分成了多个子step,每个子step都会处理数据的一部分。数据的分区也就要求你要事先了解数据的结构,提前规划数据如何在子步骤上进行拆分。数据的分配可以按照数据库主键的范围进行拆分,也可以按照文件目录进行拆分。子步骤能够本地执行也可以远程执行,Spring batch提供了多线程子步骤。下图示例展示了子步骤是按照文件名进行拆分的:
在这里插入图片描述

Tips:Spring batch与网格计算
当处理PB级别的数据时,一般将任务拆分成小任务按照batch进行处理,并行计算,然后合并结果。一些开源的分布式框架能够处理任务的分发、并行工作,所以开发人员只关注业务逻辑的实现就好。Spring batch与网格计算比较来讲:Spring batch是一个轻量级的解决方案;只要安装了jvm就可以。而网格计算需要一些基础框架,像hadoop等。Spring batch提供了一些扁平文件处理的功能,网格计算通常不会提供高级处理接口。

1.3 介绍下本文的案例

本节介绍一个真实的,在本系列博文中会一直用来讲述Spring batch的例子:在线存储系统。这个例子简单、小巧,但也真实反映出现实场景对批处理技术的需求。不仅能说明Spring batch的特点,还能在企业的角度来更好的整合技术的使用。
通过对例子的实现,会对框架有进一步的认识:Spring batch是如何在批量数据中实现高效的读写操作的,以及如何使用内置的组件,构建自己的组件以及如何配置Spring batch任务

1.3.1 在线存储应用

ACME公司想通过网站销售产品以拓展业务。为此,ACME创建的一个明确的在线交易系统。使用Spring batch任务将交易日志构建到一个数据库当中。应用会处理每晚的数据,在日志中插入新产品并更新已有商品。
在这里插入图片描述

1.3.2 为什么用Spring batch构筑在线存储系统?

为什么ACME会创建一个在线的、基于web的应用来卖产品?这是最好的方式来拓展业务并发展客户?web应用部署方便、容易构建、用户体验佳。ACME决定把他们的应用部署到当地的一个服务提供商的服务器上,而不是用自己的网络。第一版的应用会提供一个简单、方便的UI,而在这之前更关注的应该是日志的事务问题。
之后,考虑下为什么ACME会选择将数据从一个系统转到另一个系统而不是两部分数据之间交互?软件提供了一个API,之所以不用是为了保证安全。如图所示,ACME自己的网络管理登记日志信息,公司不想将这部分数据直接暴露给外网,只能通过一个外部应用来实现。这种防范手段是必须要有的。
在这里插入图片描述
使用这种结构的另一个原因是登记日志系统的API和数据格式不适合在线存储系统。ACME想展示的是一个总结性的产品信息,这里也会牵扯大量请求的调用,因此会对日志系统的系统造成影响。

1.3.3 为什么使用批处理任务?

在线存储的应用是两个系统数据交换场景的很好的例子。ACME按天来更新登记系统、增加新产品、以及更新已有产品。web应用没有必要暴露实时数据,买家可以通过之前的数据来浏览产品数据。
在这里插入图片描述

Tips: 提取、转换、加载【ETL】
简单讲,ETL是数据库与数据仓库创建的一个关键环节,主要分为两步处理:
1 从外部数据源提取数据
2 根据特定的目的对数据进行处理
3 将转换后的数据回写到数据库中
有很多免费的、开源软件能帮助我们完成ETL处理。这里是我们要探讨的一个重要方面。但一般会简单分为三步进行处理。

在上图中ETL处理将创建一个flat文件灌入到在线数据库,从一个外部的数据库系统提取数据并转换成符合在线存储系统使用的文件格式。对于这种目的的处理,ETL就像一个黑盒子,开发人员只需要关注数据的读写操作。

1.3.4 产品信息导入

未完待续…

这篇关于Springbatch框架系列(1-1)Spring batch介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/194481

相关文章

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Java高效实现Word转PDF的完整指南

《Java高效实现Word转PDF的完整指南》这篇文章主要为大家详细介绍了如何用Spire.DocforJava库实现Word到PDF文档的快速转换,并解析其转换选项的灵活配置技巧,希望对大家有所帮助... 目录方法一:三步实现核心功能方法二:高级选项配置性能优化建议方法补充ASPose 实现方案Libre