我已经实现了spring-batch远程分区。现在,我必须将分区100亿个id划分为多个分区。ID将从弹性中提取并推入分区,分区又将被推入kafka
@Override公共地图<字符串,ExecutionContext>分区(int gridSize({
Map<String, ExecutionContext> map = new HashMap<>(gridSize);
AtomicInteger partitionNumber = new AtomicInteger(1);
try {
for(int i=0;i<n;i++){
List<Integer> ids = //fetch id from elastic
map.put("partition" + partitionNumber.getAndIncrement(), context);
}
System.out.println("Partitions Created");
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
我不能同时获取和推送地图中的所有id,否则我将耗尽内存。我希望将ID推送到队列中,然后提取下一个ID。
这可以通过春季批次完成吗?
如果你想使用分区,你必须找到一种方法用给定的键对输入数据集进行分区。如果没有分区键,就无法真正使用分区(无论是否使用SpringBatch(。
如果你的ID是由一个可以划分为分区的序列定义的,那么你就不必获取100亿个ID,对它们进行分区,并将每个分区(即每个分区的所有ID(放在worker的执行上下文中。您可以做的是找到最大ID,创建ID范围并将其分配给不同的工作者。例如:
- 分区1:0-10000
- 分区2:10001-20000
- 等等
如果您的ID不是由序列定义的,并且不能按范围进行分区,那么您需要找到另一个键(或复合键(,该键允许您根据另一个标准对数据进行分区。否则,(远程(分区就不适合您。