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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2