具有 Spring 批处理的多线程 Lucene 索引编写器
Multi threaded Lucene Index Writer with Spring Batch
我有一个多步骤 Spring 批处理作业,在其中一个步骤中,我为 reader 中读取的数据创建了 Lucene 索引,因此后续步骤可以在该 Lucene 索引中进行搜索。
根据 ItemReader
中的读取数据,我将索引分散到几个单独的目录中。
如果我指定 Step Task Executor 为 SimpleAsyncTaskExecutor
,只要索引总是写入不同的目录,我就不会遇到任何问题,但有时我会遇到锁定异常。我猜,两个线程试图写入同一个索引。
如果删除 SimpleAsyncTaskExecutor
,我不会遇到任何问题,但写入会变得顺序且缓慢。
如果将索引写入单个目录,是否可以为 Lucene 索引编写器使用多线程?
我是否需要使索引创建者代码线程安全才能使用 SimpleAsyncTaskExecutor
?
索引创建者代码在步骤处理器中。
我正在使用 Lucene 6.0.0 并根据 IndexWriter API Doc、
NOTE: IndexWriter instances are completely thread safe, meaning
multiple threads can call any of its methods, concurrently. If your
application requires external synchronization, you should not
synchronize on the IndexWriter instance as this may cause deadlock;
use your own (non-Lucene) objects instead.
我正在创建 writer 的多个实例,这导致了问题。如果围绕该编写器的其余代码是线程安全的,则可以将单个编写器实例传递给任意数量的线程。
我使用了单个编写器实例和并行块。每个并行块都毫无问题地写入同一目录。
为了并行化块,我必须使我的块组件 - reader、处理器和编写器成为线程安全的。
我有一个多步骤 Spring 批处理作业,在其中一个步骤中,我为 reader 中读取的数据创建了 Lucene 索引,因此后续步骤可以在该 Lucene 索引中进行搜索。
根据 ItemReader
中的读取数据,我将索引分散到几个单独的目录中。
如果我指定 Step Task Executor 为 SimpleAsyncTaskExecutor
,只要索引总是写入不同的目录,我就不会遇到任何问题,但有时我会遇到锁定异常。我猜,两个线程试图写入同一个索引。
如果删除 SimpleAsyncTaskExecutor
,我不会遇到任何问题,但写入会变得顺序且缓慢。
如果将索引写入单个目录,是否可以为 Lucene 索引编写器使用多线程?
我是否需要使索引创建者代码线程安全才能使用 SimpleAsyncTaskExecutor
?
索引创建者代码在步骤处理器中。
我正在使用 Lucene 6.0.0 并根据 IndexWriter API Doc、
NOTE: IndexWriter instances are completely thread safe, meaning multiple threads can call any of its methods, concurrently. If your application requires external synchronization, you should not synchronize on the IndexWriter instance as this may cause deadlock; use your own (non-Lucene) objects instead.
我正在创建 writer 的多个实例,这导致了问题。如果围绕该编写器的其余代码是线程安全的,则可以将单个编写器实例传递给任意数量的线程。
我使用了单个编写器实例和并行块。每个并行块都毫无问题地写入同一目录。
为了并行化块,我必须使我的块组件 - reader、处理器和编写器成为线程安全的。