JSR 352 - Java平台的批处理应用程序使用分区提供并行性功能。批处理运行时可以在不同分区中执行一个步骤,以加快进度。 JSR 352还引入了threads
定义:我们可以定义要使用的线程数,如如何定义一个良好的分区计划以确保JSR 352中的CPU平衡?
<step id="Step1">
<chunk .../>
<partition>
<plan partitions="3" threads="2"/>
</partition>
</chunk>
</step>
然后我感到困惑:让每个线程被占用如何给一个赞赏的分区计划,并确保CPU的平衡?
例如,有表A,B,C要做,它们的行数分别为1亿,1百万和1千。该步骤旨在将这些实体处理为文档,一个实体转到一个文档。文件制作的顺序并不重要。这些表的实体的CPU时间分别为1s,2s,5s。线程数为4
如果是3个分区,每一个表型,则步骤将采取1 * 10^9
秒完成,这是因为:
- 分区A将采取
1 * 10^9 * 1s = 1 * 10^9s
,运行线程2 - 分区B将采取
1 * 10^6 * 2s = 2 * 10^6s
,上线3 - 分区C运行将采取
1 * 10^3 * 5s = 5 * 10^3s
,运行螺纹4
然而,当线程2被占用时,线程3是免费因为2 * 10^6s
和螺纹4是自5 * 10^3s
免费。很显然,这不是一个好的分区计划。
我的问题是:
- 是否还有更好的分区计划在上面的例子来完成?
- 我可以考虑:分区是一个消耗队列和线程消耗这个队列吗?
- 一般来说,我可以使用多少个线程?这是相同数量的CPU核心吗?
- 一般来说,如何给予赞赏的分区计划,以便每个线程都被占用并确保CPU平衡?
通常,在分区步骤中,您正在运行在每个分区完全相同的逻辑。首先让我问一下,对于你的“表格类型”A,B和C,你是否认为它们非常相似,以至于它们很适合用单一步骤使用相同的逻辑来读取/处理/写入所有三种? (如果不是,可能更适合将它们分成三个连续的步骤,其中一些可以分区,和/或可能分割以同时运行不同的步骤)。 –
嗨@ScottKurz,是的,他们非常适合在同一步骤中运行。其实,[我的物品处理器](https://github.com/mincong-h/gsoc-hsearch/blob/2b3831e0769dbc2c959d2d5a90d89d61699d4796/core/src/main/java/org/hibernate/search/jsr352/internal/steps/lucene/ ItemProcessor.java)将JPA模型转换为Lucene文档以获取全文搜索功能。这与表A,B和C的确切逻辑相同。 –