分布式批处理方案

一、背景

在现代企业应用当中,面对复杂的业务以及海量的数据,除了通过庞杂的人机交互界面进行各种处理外,还有一类工作,不需要人工干预,只需要定期读入大批量数据,然后完成相应业务处理并进行归档。有大批量的业务数据需要应用程序去批量计算处理,而通过单机模式去执行会耗费很长的处理时间,也不能充分发挥业务集群中每个应用节点处理能力。通过一些常见的分布式批处理方案,可以有效地让业务集群中所有业务应用节点协同完成一个大批量数据处理的任务,从而提升整体的处理效率和处理可靠性

批处理模型:

在简单单机场景下可以开启多线程来同时处理一个大任务,在多个机器下可以由多台机器同时并行处理同一个任务。因此,分布式批处理方案需要为开发者在代码开发层面屏蔽上述任务切分后分发、并行执行、结果汇聚、失败容错、动态扩容等业务应用集群间的分布式协调逻辑,让使用者仅聚焦于上述红框描述的业务逻辑分片规则和业务逻辑处理即可。 

二、批量处理中的关键设计

批量处理中两个关键环节是批量任务设计和任务调度设计:

1、批量任务设计:统一规定了作业的定义、编排、执行等过程,良好的作业模型可以隐藏了内部复杂性,简化具体作业开发难度,更好的支持调度过程。

2、任务调度设计:通俗的说调度就是控制作业在什么时候由那些资源(节点、线程等)去执行,同时还包含作业执行失败后的处理等内容。

三、常见的批处理方案

1、ElasticJob:是一款分布式任务调度框架,其主要特点是在 Quartz 基础上实现定时调度并提供在业务集群中对任务进行分片协调处理能力。在整个架构上基于 Zookeeper 来实现任务分片执行、应用集群动态弹性调度、子任务执行高可用。分片调度模型可支持大批量业务数据处理均衡的分发至业务集群中的每一个节点进行处理,有效地提高了任务处理效率

 

2、Spring Batch:Spring Batch 批处理框架,其提供轻量且完善批处理能力。Spring Batch 任务批处理框主要提供:单进程多线程处理、分布式多进程处理两种方式。在单进程多线程处理模式下,用户可自行定一个 Job 作为一个批处理任务单元,Job 是由一个或多个 Step 步骤进行串联或并行组成,每一个 Step 又分别由 reader、process、writer 构成来完成每一步任务的读取、处理、输出。后续主要讨论一个 Job 只包含一个 Step 的场景进行分析。在 Spring Batch 中提供了远程分片/分区处理能力,在 Job 的 Step 中可根据特定规则将任务拆分成多个子任务并分发给集群中其他的 worker 来处理,以实现分布式并行批处理处理能力。其远程交互能力常见是借助第三方消息中间件来实现子任务的分发和执行结果汇聚。

3、企业级SchedulerX:SchedulerX任务调度平台针对企业级批处理需求提供了完善的整体解决方案,用户可直接采用公有云平台的服务即可轻松实现业务应用集群的分布式批处理能力(用户非阿里云业务应用部署也可支持对接),无需额外部署其他中间件集成维护

 

四、Spring Batch批处理框架

4.1、传统批量作业结构

 

JobLauncher:该领域对象是Job的启动器,其作用就是启动Job。

Job:定义,配置批处理任务的领域对象,该对象的作用,是做Step的容器,配置该批处理任务需要的Step,以及他们之间的逻辑关系。

Step:定义批处理任务中一个对立的逻辑任务处理单元。基本上的业务逻辑处理代码都是封装在Step中的,这种形式定义了一个Step的流程必须是“ItemReader- ItemProcessor(可选)-ItemWriter”。

JobRepository:该领域对象会为Job的运行数据提供一种持久化机制,为所有的Job提供CRUD的操作接口,并为所有的操作提供事务支持。

4.2、Spring Batch中的任务设计模式

SpringBatch就是实现了这种作业结构,除此之外,SpringBatch还加入了自身一些设计:

 

JobInstance:该领域概念和Job的关系与Java中实例和类的关系一样,Job定义了一个工作流程, JobInstance就是该工作流程的一个具体实例。一个Job可以有多个JobInstance,多个JobInstance之间的区分就要靠另外一个领域概念JobParameters了。

JobParameters:是一组可以贯穿整个Job的运行时配置参数。不同的配置将产生不同的JobInstance,如果你是使用相同的JobParameters运行同一个Job,那么这次运行会重用上一次创建的JobInstance。

JobExecution:该领域概念表示JobInstance的一次运行,JobInstance运行时可能会成功或者失败。每一次JobInstance的运行都会产生一个JobExecution。同一个JobInstance(JobParameters相同)可以多次运行,这样该JobInstance将对应多个Jobexecution。JobExecution记录了一个JobInstance在一次运行时的发生的所有事情,因此,一个JobExecution需要包含很多的属性,并且需要持久化,这样才能很好的支撑Restart等Spring Batch特性。

StepExecution: 类似于JobExecution,该领域对象表示Step的一次运行。Step是Job的一部分,因此一个StepExecution会关联到一个Jobexecution。另外,该对象还会存储很多与该次StepExecution运行相关的所有数据,因此该对象也有很多的属性,并且需要持久化以支持一些Spring Batch的特性。

Spring Batch 不仅提供了统一的读写接口、丰富的任务处理方式、灵活的事务管理及并发处理,同时还支持日志、监控、任务重启与跳过等特性

4.3、任务的执行过程

 

  • 远程分块(Remote Chunking)

远程分块是 Spring Batch 在处理大批量数据任务时提供的一种分布式批处理解决方案,它可以做到在一个 Step 步骤中通过 ItemReader 加载数据构建成多个 Chunk 块,并由 ItemWriter 将这多个分块通过消息中间件或其他形式分发至集群节点,由集群应用节点对每一个 Chunk 块进行业务处理

 

在上述主节点 ItemReader 和 ItemWriter 可以映射为本次讨论的批处理模型中的“任务拆分-split”阶段,主节点对 ItemWriter 可采用 Spring Batch Integration 提供的 ChunkMessageChannelItemWriter,该组件通过集成 Spring Integration 提供的其他通道(如:AMQP、JMS)完成批处理任务数据加载和分块分发。

  • 远程分区(Remote Partitioning)

远程分区与远程分块主要区别在于 master 节点不负责数据加载,可理解为将当前 Step 通过 Partitioner 拆分出多个子 Step(也可以理解为子任务),然后通过 PartitionHandler 将对应的子任务分发给各个 Slave 节点处理,为此,Spring Batch Integration 提供了 MessageChannelPartitionHandler 来实现对应的子任务分发,其底层也是需要依赖消息中间件等进行适配对接。在每个 Slave 节点需要读取子任务 Step 的上下文信息,根据该信息进行完整的 ItemReader、ItemProcess、ItemWrite 处理。

 

4.4、SpringBatch综合特性

1、具有完备批处理能力:支持单机多线程、分布式多进程协同批处理处理,支持自定义的分片模型

2、缺定时调度支持:原生无定时调度能力需集成三方定时框架(如:Spring Task 需自行解决集群重复触发)

3、可视化管控能力弱:Spring Batch常见采用程序或文件配置任务,管控台需额外搭建且管控能力较弱。

4、集成难度高:其分布式批处理能力需额外第三方中间件集成搭建,或基于其接口自行扩展开发;基于官方提供的方式完成企业级使用需要相对复杂规划集成。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值