基于散列的分区

Hash based partitioning

我想使用 Spring 批处理来处理 CSV 文件。每个 CSV 文件每行包含一条记录。对于给定的文件,一些记录可能相互关联,即处理此类记录必须遵循它们在文件中出现的顺序。使用常规顺序方法(即整个文件的单线程)会产生糟糕的性能,因此我想使用分区功能。由于我的处理要求,相互关联的记录必须在同一个分区中(以及它们在文件中出现的顺序)。我想到了使用基于散列的分区算法和精心选择的散列函数的想法(以便创建几乎相同大小的分区)。

知道 Spring Batch 是否可行吗?

对于这种情况应该如何实施Partitioner?根据Spring批处理author/developer之一,master不发送实际数据,只发送slave获取它应该处理的数据所需的信息。就我而言,我猜这些信息就是哈希值。因此,每个slave的FlatFileItemReader是否需要跳过不同hash的行逐行读取整个文件?

谢谢, 迈克尔

平面文件项 reader 不是线程安全的,因此您不能简单地在并行处理中使用它。

文档中有更多信息:

Spring Batch provides some implementations of ItemWriter and ItemReader. Usually they say in the Javadocs if they are thread safe or not, or what you have to do to avoid problems in a concurrent environment. If there is no information in Javadocs, you can check the implementation to see if there is any state. If a reader is not thread safe, it may still be efficient to use it in your own synchronizing delegator. You can synchronize the call to read() and as long as the processing and writing is the most expensive part of the chunk your step may still complete much faster than in a single threaded configuration.

我认为你的问题在某种程度上与此重复:multithreaded item reader

您所描述的是批处理中常见的情况。您在这里有几个选择:

  1. 按顺序拆分文件并根据创建的文件进行分区 - 在这种情况下,您将遍历文件一次,将其分成需要按顺序处理的记录列表中的每一个。从那里,您可以使用 MultiResourcePartitioner 并行处理每个文件。
  2. 将文件加载到分段 table - 恕我直言,这是更简单的方法。将文件加载到暂存 table。从那里,您可以根据任意数量的因素对处理进行分区。

在任何一种情况下,结果都允许您将流程扩展到您需要的范围,以获得您需要实现的性能。