如何设计一套轻量级的批处理技术?

对于任何应用程序而言,可以说批处理都是一种基础设施类的技术组件。批处理技术应用非常广泛,数据报表、统计分析、定时任务等场景实际上都可以应用批处理技术。如何在不需要人工参与的情况下进行离线、自动、高效地进行复杂数据分析是批处理程序需要考虑的核心问题。市面上也存在一些轻量级的批处理开源框架,包括Spring家族中的Spring Batch。本文将对批处理的基本架构和Spring Batch框架的基本实现过程进行展开讨论。

在日常开发过程中,或多或少我们都会涉及到数据报表、统计分析、定时任务之类的应用场景。针对这些场景,我们可以采用Hadoop生态圈中的相关技术。但是Hadoop是一种重量级的实现方案,实际应用过程中存在入门门槛过高、学习周期过长、开发和维护困难等问题,对于某些体量并不是特别大的应用场景而言并建议使用。相反,我们希望找到一种轻量级实现方案来支持日常批处理功能,这就是今天我们要讨论的话题。

那么,如何实现轻量级的批处理呢?让我们先从相关设计理念开始讲起。

轻量级批处理基本架构

在考虑批处理架构之前,我们站在最高的抽象度上,可以把批处理过程看作是一个流程,包括读数据、处理数据和写数据,而这些数据背后是各种数据存储媒介。


批处理架构的抽象过程

和普通应用程序一样,对于如何实现上述流程,我们第一个需要考虑的设计问题是如何确定所需要实现组件之间的职责和功能,这就需要引入分层思想。

分层结构上,批处理架构可以抽象为三个主要层次,基础架构层、核心处理层和应用开发层。基础架构层提供了通用的读、写、处理服务,是对各种数据媒介的操作封装;核心处理层关注于批处理的执行过程,包括对批处理任务和流程的抽象以及如何启动、控制这些任务与流程;应用开发层则包含应用程序需要实现的业务代码。


有了分层架构之后,我们接下来对批处理的处理对象进行建模,从而引出任务(Job)的概念。Job就是批处理的基本对象,每个Job可以包含一个或多个步骤(Step),每个Step负责与具体的外部媒介交互并产生计算结果。

我们知道,对于批处理应用而言,处理的对象并不是一条数据,而是一批数据的集合(Batch)。因此,在读取数据阶段,读取器(Reader)可以单条执行读取操作,并交由数据处理器(Processor)进行转换或过滤处理,但在写数据的过程中,数据写入器(Writer)往往会以一批数据为基本操作单元。


批处理的健壮性

在上面这个时序图中,每一步都可能出现问题。因此,我们需要在出现问题时仍然能够确保批处理流程执行完毕,这就需要引入健壮性(Robustness)的概念。我们可以把批处理的健壮性简单理解为是一种智能化机制,即在长时间不需要开发人员或业务人员干预的情况下仍然可以自动处理各种异常情况。

那么,如何实现健壮性呢?结合批处理的处理特性,我们可以梳理健壮性的不同实现策略,常见的保护三种,即忽略、重试和重启。


忽略的含义在于,对于那些并不影响批处理执行流程的异常情况,我们没有必要停止整个任务,而是可以选择性的忽略这些异常。场景的可以忽略的异常包括数字格式错误等。

有时候,导致任务执行出现异常的原因并不是数据或代码有问题,而是那些瞬态异常,常见的包括网络访问失败或数据库锁等。针对这些瞬态异常,我们可以采取带有重试次数限制的重试策略。

与前面两种情况不同,有时候因为业务处理异常同样会导致批处理执行失败。显然这时候采用忽略或重试策略是解决不了问题的。我们需要暂停任务,然后修复代码问题之后再重新执行任务,这就是重启策略。

在一个成熟的批处理基本架构中,开发人员可以综合使用这三种健壮性处理策略。而这三种策略的采用时机也是可以动态调整的,典型的例子包含:但刚开始出现异常情况时,我们可以采用重试机制,但当重试出现三次之后如果仍然抛出异常,那么我们就需要转为采用重启策略了。

轻量级批处理框架:Spring Batch

介绍完轻量级批处理的基本架构之后,我们来讨论它的实现工具。在Spring家族中,专门针对轻量级批处理技术提供了对应的解决方案,这就是Spring Batch。

Spring Batch基于Spring和Java,实现了批处理的基本架构,并支持批处理健壮性。Spring Batch内置包括文件、数据库、消息中间件、外部服务在内的多种数据读取和写入机制,也对数据处理过程做了转换和过滤抽象。

针对使用场景,Spring Batch也给提供了系统化的支持。使用Spring Batch可以应用于定期提交批处理任务、按顺序处理依赖的任务、部分处理、批处理事务支持以及消息传递等基础设施集成等场景。

Spring Batch的设计理念之一在于以接口形式暴露通用核心的服务并提供了完整的默认实现。Spring Batch的核心接口如下,分别对应批处理的三个主要步骤。可以看到读和处理操作的对象是一个Item,而写操作则使用Item列表。这点与我们前面的分析完全一致。

public interface ItemReader<T> {

    T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;

}

public interface ItemProcessor<I, O> {

    O process(I item) throws Exception;

}

public interface ItemWriter<T> {

    void write(List<? extends T> items) throws Exception;

}

其中,ItemReader和ItemWriter分别实现数据读取和数据写入,对象可以包括文本文件、XML文件、数据库、服务和JMS等多种形式。

然后,ItemProcessor代表处理器模型,Spring Batch中的数据处理有转换(Transformation)和过滤(Filtering)两种主要的场景。转换的形式有多种,基本的数据状态和数据结构转换比较常见。而过滤的目的是决定是否进行Writer操作。无论是转换还是过滤,Spring Batch都为开发人员提供了扩展接口,我们可以基于业务逻辑实现自定义的复杂机制。

针对批处理的健壮性,Spring Batch也同时支持Skip、Retry和Restart这三种策略。为了实现这三种策略,Spring Batch都Job进行了进一步抽象。对于任何一个Job,运行过程中都存在一种一对多关系,即Job的定义应该只有一份,但可以有多次执行。因此,Spring Batch中针对每个Job会生成一个Job Instance,然后每次Job执行对应一个Job Execution。这样,健壮性策略在过程中会根据Job Instance生成一个新的Job Execution并放在Job Repository中。


上图中的Job Repository保存批处理运行时详细信息,Spring Batch支持In-memory和JDBC两种持久化实现策略。

全文小结

本文系统分析了轻量级批处理技术的方方面面。我们看到作为一个常见的技术体系,想要实现批处理,开发人员需要考虑的维度也非常多。我们首先站在架构设计的角度,对批处理执行过程进行了抽象,并给出了分层架构。在分层架构的基础上,我们就引出了批处理的健壮性需求,并同样阐述了三种实现方案。基于这些讨论的设计思想,业界也存在一些代表性的轻量级批处理框架。本文内容讨论了Spring家族的Spring Batch框架,可以看到该框架的实现过程和我们的设计思想是高度一致的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/585318.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何消除SmartScreen“未知发布者”警告?

在互联网高速发展、应用程序遍地开花的当今时代&#xff0c;作为企业&#xff0c;我们通常会开发自己的应用程序来开展自己的业务&#xff0c;以便与客户建立更深入的联系。不少应用程序所有者可能会面临一个难题&#xff0c;那就是用户下载时&#xff0c;系统会弹出SmartScree…

可以在手机端运行的大模型标杆:微软发布第三代Phi-3系列模型,评测结果超过同等参数规模水平,包含三个版本,最小38亿,最高140亿参数

本文原文来自DataLearnerAI官方网站&#xff1a; 可以在手机端运行的大模型标杆&#xff1a;微软发布第三代Phi-3系列模型&#xff0c;评测结果超过同等参数规模水平&#xff0c;包含三个版本&#xff0c;最小38亿&#xff0c;最高140亿参数 | 数据学习者官方网站(Datalearner…

Docker-harbor——私有仓库部署与管理

目录 一、搭建本地私有仓库 1.下载Registry镜像 2.添加本地私有仓库配置 3.重启服务并运行Registry容器 4.容器的操作 4.1拉取Nginx镜像并为镜像打标签 4.2上传到私有仓库 4.3列出私有仓库所有镜像 4.4列出私有仓库的镜像的所有标签 5.先删除原有镜像再拉取私有仓库镜…

Python 全栈体系【四阶】(三十七)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.1 R-CNN 系列 3.1.1 R-CNN 3.1.1.1 定义 R-CNN(全称 Regions with CNN features) &#xff0c;是 R-CNN 系列的第一代算法&#xff0c;其实没有过多的使用“深度学习”思想&#xff0c;而是将“深度学习”和传统的“计算…

华为配置mDNS网关示例(AP与AC间二层转发)

华为配置mDNS网关示例&#xff08;AP与AC间二层转发&#xff09; 组网图形 图1 配置mDNS网关组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业的移动终端通过WLAN连接网络&#xff0c;AP_1和AP_2分别与AC之间采用二层转发。部门1和部门2分别属…

RakSmart站群服务器租用注意事项科普

随着互联网的飞速发展&#xff0c;站群运营成为越来越多企业和个人的选择。而RakSmart作为知名的服务器提供商&#xff0c;其站群服务器租用服务备受关注。在租用RakSmart站群服务器时&#xff0c;源库建议有一些关键的注意事项需要特别留意&#xff0c;以确保服务器的稳定运行…

SpringBoot学习之SpringBoot3集成OpenApi(三十八)

Springboot升级到Springboot3以后,就彻底放弃了对之前swagger的支持,转而重新支持最新的OpenApi,今天我们通过一个实例初步看看OpenApi和Swagger之间的区别. 一、POM依赖 我的POM文件如下,仅作参考: <?xml version="1.0" encoding="UTF-8"?>…

鼓吹开源无前途,Meta却开源了Llama 3模型,无需注册在线即可使用

Meta AI一直是人工智能领域开源领域的领导者&#xff0c;一边是OpenAI鼓吹闭源才是人工智能大模型的未来&#xff0c;但是Meta AI却开源了自己的Llama 3大模型&#xff0c;且Llama 3开源模型支持80亿与700亿参数&#xff0c;而未来更大的4000亿参数大模型还在继续训练中。其Lla…

webpack3升级webpack4遇到的各种问题汇总

webpack3升级webpack4遇到的各种问题汇总 问题1 var outputNamecompilation.mainTemplate.applyPluginWaterfull(asset-path,outputOptions.filename,{......)TypeError: compilation.mainTemplate.applyPluginsWaterfall is not a function解决方法 html-webpack-plugin 版…

机器学习实战-聚类算法

聚类算法是一种无监督学习的算法&#xff0c;用于将数据集中的数据分成不同的聚类或组。聚类算法是数据挖掘和机器学习领域中常见的技术之一&#xff0c;具有广泛的应用。 以下是聚类算法的一些知识点&#xff1a; 聚类算法的目的是将数据集划分为不同的组&#xff0c;使得组内…

【酱浦菌-爬虫项目】爬取百度文库文档

1. 首先&#xff0c;定义了一个变量url&#xff0c;指向百度文库的搜索接口 ‘https://wenku.baidu.com/gsearch/rec/pcviewdocrec’。 2. 然后&#xff0c;设置了请求参数data&#xff0c;包括文档ID&#xff08;docId&#xff09;和查询关键词&#xff08;query&#xff09;。…

【蓝桥杯C++A组省三 | 一场勇敢的征途与致19岁的信】

随着4.13西大四楼考场的倒计时结束… 就这样蓝桥杯落幕了 省三的名次既满足又不甘心&#xff0c;但又确乎说得上是19岁途中的又一枚勋章 从去年得知&#xff0c;纠结是否要报名、到寒假开始战战兢兢地准备、陆续开始创作博客&#xff0c;记录好题和成长……感谢你们的关注&…

Flask表单详解

Flask表单详解 概述跨站请求伪造保护表单类把表单渲染成HTML在视图函数中处理表单重定向和用户会话Flash消息 概述 尽管 Flask 的请求对象提供的信息足够用于处理 Web 表单&#xff0c;但有些任务很单调&#xff0c;而且要重复操作。比如&#xff0c;生成表单的 HTML 代码和验…

偏自相关系数的等价定义

第k个回归系数的值 原始定义

将两个YOLO格式的数据集合并,并保持相同类别

1. 需求分析 最近在做两个YOLO格式的数据集合并&#xff0c;第一个数据集包含了第二个数据集的类别&#xff0c;但是相应的类别id对应不住&#xff0c;需要修改第二个数据集的类别标签与第一个数据集对应住。 2. 修改第二个数据集标签对应 2.1 实现思路 导入所需的库&#x…

CCF-CSP真题题解:201409-2 画图

201409-2 画图 #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int N 110;int n; bool a[N][N];int main() {scanf("%d", &n);while (n--) {int x1, y1, x2, y2;scanf("%d%d%d%d", &…

R语言的学习——day1

将数据框中某一列数据改成行名 代码 结果

社交媒体数据恢复:Skype国内、际版

恢复已删除的Skype聊天记录可能需要一些操作&#xff0c;但请注意&#xff0c;这不一定总是可行的&#xff0c;并且可能需要一些技术知识。以下是一些步骤&#xff0c;您可以尝试恢复您的Skype聊天记录&#xff1a; 1. 检查备份&#xff1a; - 如果您有Skype备份&#xff0…

Ollama配置webui连接大预言模型

Ollama配置Web UI连接大预言模型 默认ollama安装后&#xff0c;chat对话只有命令行界面&#xff0c;交互体验较差。借助open-webui可以通过web界面连接ollama&#xff0c;从而实现类似chatgpt式的web交互体验。 使用家用PC实践记录如下&#xff1a; 1. 环境配置 本次使用的操作…

智能私信软件:转化率提升的神器

在数字化营销领域&#xff0c;利用智能私信软件策略提升转化率已经成为一种不可忽视的趋势。随着人工智能技术的发展&#xff0c;这些软件变得越来越智能&#xff0c;能够根据用户的行为和偏好提供个性化的沟通体验。在这篇文章中&#xff0c;我们将探讨如何有效地运用智能私信…
最新文章