『埃尔法哥哥』一文搞懂大数据批量处理框架Spring Batch的完美解析方案是什么( 五 )


Multithreaded Step(多线程步)提供了多个线程执行一个Step的能力 , 但这种场景在实际的业务中使用的并不是非常多 。
更多的业务场景是Job中不同的Step没有明确的先后顺序 , 可以在执行期并行的执行 。
Parallel Step:提供单个节点横向扩展的能力

『埃尔法哥哥』一文搞懂大数据批量处理框架Spring Batch的完美解析方案是什么
本文插图

使用场景:Step A、Step B两个作业步由不同的线程执行 , 两者均执行完毕后 , Step C才会被执行 。
框架提供了并行Step的能力 。 可以通过Split元素来定义并行的作业流 , 并制定使用的线程池 。
Parallel Step模式的执行效果如下:

『埃尔法哥哥』一文搞懂大数据批量处理框架Spring Batch的完美解析方案是什么
本文插图

每个作业步并行处理不同的记录 , 示例中三个作业步 , 处理同一张表中的不同数据 。
并行Step提供了在一个节点上横向处理 , 但随着作业处理量的增加 , 有可能一台节点无法满足Job的处理 , 此时我们可以采用远程Step的方式将多个机器节点组合起来完成一个Job的处理 。
Remote Chunking:远程Step技术本质上是将对Item读、写的处理逻辑进行分离;通常情况下读的逻辑放在一个节点进行操作 , 将写操作分发到另外的节点执行 。

『埃尔法哥哥』一文搞懂大数据批量处理框架Spring Batch的完美解析方案是什么
本文插图

远程分块是一个把step进行技术分割的工作 , 不需要对处理数据的结构有明确了解 。
任何输入源能够使用单进程读取并在动态分割后作为"块"发送给远程的工作进程 。
远程进程实现了监听者模式 , 反馈请求、处理数据最终将处理结果异步返回 。 请求和返回之间的传输会被确保在发送者和单个消费者之间 。
在Master节点 , 作业步负责读取数据 , 并将读取的数据通过远程技术发送到指定的远端节点上 , 进行处理 , 处理完毕后Master负责回收Remote端执行的情况 。
在Spring Batch框架中通过两个核心的接口来完成远程Step的任务 , 分别是ChunkProvider与ChunkProcessor 。
ChunkProvider:根据给定的ItemReader操作产生批量的Chunk操作;
ChunkProcessor:负责获取ChunkProvider产生的Chunk操作 , 执行具体的写逻辑;
Spring Batch中对远程Step没有默认的实现 , 但我们可以借助SI或者AMQP实现来实现远程通讯能力 。
Step本地节点负责读取数据 , 并通过MessagingGateway将请求发送到远程Step上;远程Step提供了队列的监听器 , 当请求队列中有消息时候获取请求信息并交给ChunkHander负责处理 。
接下来我们看下最后一种分区模式;Partitioning Step:分区模式需要对数据的结构有一定的了解 , 如主键的范围、待处理的文件的名字等 。

『埃尔法哥哥』一文搞懂大数据批量处理框架Spring Batch的完美解析方案是什么
本文插图

这种模式的优点在于分区中每一个元素的处理器都能够像一个普通Spring Batch任务的单步一样运行 , 也不必去实现任何特殊的或是新的模式 , 来让他们能够更容易配置与测试 。
通过分区可以实现以下的优点:
分区实现了更细粒度的扩展;
基于分区可以实现高性能的数据切分;
分区比远程通常具有更高的扩展性;
分区后的处理逻辑 , 支持本地与远程两种模式;
分区作业典型的可以分成两个处理阶段 , 数据分区、分区处理;
数据分区:根据特殊的规则(例如:根据文件名称 , 数据的唯一性标识 , 或者哈希算法)将数据进行合理的数据切片 , 为不同的切片生成数据执行上下文Execution Context、作业步执行器Step Execution 。 可以通过接口Partitioner生成自定义的分区逻辑 , Spring Batch批处理框架默认实现了对多文件的实现org.springframework.batch.core.partition.support.MultiResourcePartitioner;也可以自行扩展接口Partitioner来实现自定义的分区逻辑 。


推荐阅读