복붙노트

[SPRING] Spring 배치 단일 파일에서 다중 파일로 다중 스레드 처리

SPRING

Spring 배치 단일 파일에서 다중 파일로 다중 스레드 처리

내 문제 설명. 1,000 만 개의 데이터가있는 csv 파일을 읽고이를 db에 저장하십시오. 가능한 한 최소 시간으로

나는 자바의 Simple Multi Threaded Executor를 사용하여 구현했으며 로직은 스프링 배치의 덩어리와 거의 비슷하다. csv 파일에서 미리 구성된 데이터 수를 읽은 다음 스레드를 만들고 데이터 유효성을 검사 한 스레드에 데이터를 전달한 다음 다중 스레드에서 실행되는 파일에 기록합니다. 일단 모든 작업이 완료되면 각 파일을로드하기 위해 SQL 로더를 호출합니다. 이제이 코드를 스프링 배치로 옮기고 싶습니다 (스프링 배치에 초보자입니다).

여기 내 질문이있다. 1. 작업에서 Items Writer를 Item Writer를 멀티 스레드로 만들 수 있습니까? (스레드가 데이터에 쓰기 전에 데이터를 처리하기 위해 새 스레드를 만듭니다.) 아니라면 두 단계를 만들 필요가 첫 번째 단계는 단일 스레드 및 다중 스레드 개별 파일 쓰기 쓰레드 파일을 읽을 수 있지만 이전 작업에서 다른 작업에 데이터 목록을 전달하는 방법. 2. 단일 스레드에 오류가있는 경우 전체 일괄 작업 처리를 어떻게 중지 할 수 있습니까? 3. 특정 간격 후에 실패한 경우 배치 작업을 재 시도하는 방법. 실패한 경우 다시 시도 옵션이 있다는 것을 알고 있지만 실패한 경우 특정 간격 후에 작업을 다시 시도 할 수있는 옵션을 찾을 수 없습니다. 여기서는 스케쥴러에 대해 언급하지 않습니다. 배치 작업이 이미 스케쥴러에서 실행 되었기 때문입니다.하지만 실패하면 3 분 후에 재실행해야합니다.

해결법

  1. ==============================

    1.여기 내가 어떻게 문제를 해결 했는가.

    여기 내가 어떻게 문제를 해결 했는가.

  2. ==============================

    2.내 (미래) 일에 관심이있어서 도움이나 문제 해결 방법을 알려주십시오! 제 징후가 도움이되기를 바랍니다.

    내 (미래) 일에 관심이있어서 도움이나 문제 해결 방법을 알려주십시오! 제 징후가 도움이되기를 바랍니다.

  3. ==============================

    3.입력 파일을 여러 파일로 분할하고 Partitionner를 사용하고 스레드로 작은 파일을로드 할 수 있지만 오류가 발생하면 DB 정리 후 모든 작업을 다시 시작해야합니다.

    입력 파일을 여러 파일로 분할하고 Partitionner를 사용하고 스레드로 작은 파일을로드 할 수 있지만 오류가 발생하면 DB 정리 후 모든 작업을 다시 시작해야합니다.

    <batch:job id="transformJob">
        <batch:step id="deleteDir" next="cleanDB">
            <batch:tasklet ref="fileDeletingTasklet" />
        </batch:step>
        <batch:step id="cleanDB" next="split">
            <batch:tasklet ref="countThreadTasklet" />
        </batch:step>
        <batch:step id="split" next="partitionerMasterImporter">
            <batch:tasklet>
                <batch:chunk reader="largeCSVReader" writer="smallCSVWriter" commit-interval="#{jobExecutionContext['chunk.count']}" />
            </batch:tasklet>
        </batch:step>
        <batch:step id="partitionerMasterImporter" next="partitionerMasterExporter">
            <partition step="importChunked" partitioner="filePartitioner">
                <handler grid-size="10" task-executor="taskExecutor" />
            </partition>
        </batch:step>
    </batch:job>
    

    전체 예제 코드 (Github).

    희망이 도움이됩니다.

  4. from https://stackoverflow.com/questions/18672776/spring-batch-multithreaded-processing-for-single-file-to-multiple-file by cc-by-sa and MIT license