簡體   English   中英

並行執行塊以進行分區的從屬步驟

[英]Executing chunks in parallel for a partitioned slave step

我的這個問題是我另一個SO問題的擴展。 由於這似乎不可能,因此我嘗試為並行/分區從屬步驟並行執行塊。

文章說,僅將SimpleAsyncTaskExecutor指定為步驟的任務執行器,就會開始並行執行塊。

@Bean
public Step masterLuceneIndexerStep() throws Exception{
        return stepBuilderFactory.get("masterLuceneIndexerStep")
                .partitioner(slaveLuceneIndexerStep())
                .partitioner("slaveLuceneIndexerStep", partitioner())
                .gridSize(Constants.PARTITIONER_GRID_SIZE)
                .taskExecutor(simpleAsyntaskExecutor)
                .build();
    }

    @Bean
    public Step slaveLuceneIndexerStep()throws Exception{
        return stepBuilderFactory.get("slaveLuceneIndexerStep")
                .<IndexerInputVO,IndexerOutputVO> chunk(Constants.INDEXER_STEP_CHUNK_SIZE)
                .reader(luceneIndexReader(null))
                .processor(luceneIndexProcessor())
                .writer(luceneIndexWriter(null))
                .listener(luceneIndexerStepListener)
                .listener(lichunkListener)
                .throttleLimit(Constants.THROTTLE_LIMIT)
                .build();
    }

如果我為從屬步驟指定.taskExecutor(simpleAsyntaskExecutor) ,則作業將失敗。 主步驟中的行.taskExecutor(simpleAsyntaskExecutor)可以正常運行,但是塊在串行和分區步驟中並行運行。

是否可以並行化slaveLuceneIndexerStep()塊?

基本上,每個塊都以順序方式將Lucene索引寫入單個目錄,由於Lucene IndexWriter是線程安全的,因此我想進一步並行化每個目錄中的索引寫入過程。

我可以按照以下步驟從分區的從屬步驟中啟動並行塊,

1.我首先要照顧好我的讀取器,處理器和寫入器,使其具有線程安全性,以便那些組件可以參與並行塊而不會出現並發問題。

2.我將任務執行程序作為SimpleAsyntaskExecutor保留在主步驟中,因為從屬步驟運行很長時間,並且我希望在某個時間點精確啟動N個線程。 我通過設置任務執行器的concurrencyLimit來控制N。

3.然后,我將ThreadPoolTaskExecutor設置為從屬步驟的任務執行器。 所有從屬步驟都將該池用作公共池,因此我將其核心池大小設置為N的最小值,以便每個從屬步驟至少獲得一個線程,並且不會發生飢餓。 您可以根據系統容量增加此線程池的大小,並且由於塊是正在運行的較小進程,因此我使用了線程池。

使用線程池還可以為我的應用程序處理一個特殊情況,即我的分區是通過client_id因此當較小的客戶端完成操作時,較大的客戶端會自動重用相同的線程,並且由於每個客戶端要處理的數據不同很多。

主步驟任務執行程序僅啟動所有從步驟線程並進入WAITING狀態,而從步驟塊由從步驟中指定的線程池處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM