非分布式数据 _ Spring 批量分区器
Non Distributed Data _ Spring Batch Partitioner
举个例子,我从有条件(数百万行)的数据库中读取数据,对数据进行一些处理,然后更新它。
我正在使用列范围分区程序(Id 列)处理最小和最大 ID,并使用 max-min/gridSize 创建分区。
现在假设我有 ID 1、22、23、24、30 和 gridSize =3,按照这个逻辑我将有 3 个分区:
partition1 处理 Id 1
partition2 处理 0 行
partition3 处理 22、23、24 和 30
对于数以百万计的数据,像这样的并行处理是没有用的,并且试图在单个请求中恢复所有数据以实现分布式分区需要很长时间..
最好的解决方案是什么?
示例中显示的 ColumnRangePartitioner
指出您需要均匀分布的列才能使其有效(正如您所指出的)。相反,您通常可以在查询中添加行号并对其进行分区,因为它将是结果的序列。
SQL 的示例如下所示(对于 MySQL):
SELECT F.*,
@rownum := @rownum + 1 AS rank
FROM FOO F,
(SELECT @rownum := 0) r;
这样,列 rank
将是每次您 运行 查询时自动生成的序列。根据该值,您可以对数据集进行分区。由于这不是持久性的,您需要做一些体操来获得正确的 ID,但是 Partitioner
实现的基本逻辑如下所示:
- 运行 计数查询以了解您的数据集中有多少条记录。
- 运行 使用上述技术的查询,以确定每个分区范围的开始和结束的 db id。这将为您提供按分区过滤的 ID。
- 使用实际的数据库 ID 为每对 (start/end) 创建一个分区。
- 设置您的
ItemReader
以仅读取提供的数据库 ID 范围内的项目。
举个例子,我从有条件(数百万行)的数据库中读取数据,对数据进行一些处理,然后更新它。
我正在使用列范围分区程序(Id 列)处理最小和最大 ID,并使用 max-min/gridSize 创建分区。
现在假设我有 ID 1、22、23、24、30 和 gridSize =3,按照这个逻辑我将有 3 个分区:
partition1 处理 Id 1
partition2 处理 0 行
partition3 处理 22、23、24 和 30
对于数以百万计的数据,像这样的并行处理是没有用的,并且试图在单个请求中恢复所有数据以实现分布式分区需要很长时间..
最好的解决方案是什么?
示例中显示的 ColumnRangePartitioner
指出您需要均匀分布的列才能使其有效(正如您所指出的)。相反,您通常可以在查询中添加行号并对其进行分区,因为它将是结果的序列。
SQL 的示例如下所示(对于 MySQL):
SELECT F.*,
@rownum := @rownum + 1 AS rank
FROM FOO F,
(SELECT @rownum := 0) r;
这样,列 rank
将是每次您 运行 查询时自动生成的序列。根据该值,您可以对数据集进行分区。由于这不是持久性的,您需要做一些体操来获得正确的 ID,但是 Partitioner
实现的基本逻辑如下所示:
- 运行 计数查询以了解您的数据集中有多少条记录。
- 运行 使用上述技术的查询,以确定每个分区范围的开始和结束的 db id。这将为您提供按分区过滤的 ID。
- 使用实际的数据库 ID 为每对 (start/end) 创建一个分区。
- 设置您的
ItemReader
以仅读取提供的数据库 ID 范围内的项目。