2013-09-07 6 views
2

내 문제 문. 1 천만 데이터가있는 csv 파일을 읽고이를 db에 저장하십시오. 가능한 한 최소 시간으로
스프링 배치 다중 파일에 대한 단일 파일 다중 스레드 처리

나는 자바의 Simple 멀티 스레드 실행기를 사용하여 구현했으며 로직은 스프링 배치의 청크와 거의 비슷하다. csv 파일에서 미리 구성된 데이터 수를 읽은 다음 스레드를 만들고 데이터의 유효성을 검사 한 스레드에 데이터를 전달한 다음 다중 스레드에서 실행되는 파일에 기록합니다. 일단 모든 작업이 완료되면 각 파일을로드하기 위해 SQL 로더를 호출합니다. 지금은 (내가 배치 봄하는 안돼서) 여기


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

답변

2

다음은 문제를 해결 한 방법입니다.

  1. 는 버퍼를 사용하여 파일 및 청크 파일 (파일 분할) 읽기 및 채널 독자와 작가 (파일 읽기/쓰기의 가장 빠른 방법, 심지어 스프링 배치가 동일하게 사용)을 파일. 작업이 시작되기 전에 실행되도록 구현했습니다 (그러나 메소드 호출자를 사용하여 단계로 작업을 사용하여 실행할 수 있음).

  2. 작업 매개 변수로 디렉토리 위치로 작업을 시작하십시오.itemreader 파일을

  3. 사용을 읽을 파티션 설정에서 전달 된 파일을 가져 봄의 batchs을 사용하여 디렉토리 위치를 얻을 것이다 각 파일에 대해 슬레이브 단계는 슬레이브 단계에서 별도의 스레드
  4. 에 생성됩니다

  5. 사용 multiResourcePartitioner 데이터베이스 항목 작성기 (mybatis 일괄 항목 작성기를 사용하고 있습니다)를 사용하여 데이터를 데이터베이스로 푸시합니다.
  6. 단계의 커밋 수와 동일한 분할 수를 사용하는 것이 더 좋습니다.
+0

안녕하세요, 저는 몇 가지 문제가 있고 XML에서 수백만 사용자를 처리하고 DB에 덤프하고 다중 스레딩/파티셔닝을 사용하고 싶습니다. 예를 들어 구현 예제를 제공하여 RI로 참조 할 수 있습니다 – Ketan

1
  1. 멀티 스레드 읽기 정보 How to set up multi-threading in Spring Batch? 답변; 그것은 당신을 올바른 방향으로 가리킬 것입니다. 또한, this 샘플이 CSV에 대한 재시작에 대한 몇 가지 고려 사항이 자동으로 실패 스레드에서 일부 오류가하는 경우는
  2. 작업 파일입니다 : 내가 해본 적이 있지만,이 기본 동작
  3. Spring Batch How to set time interval between each call in a Chunk tasklet이 시작 될 수 있어야한다. 또한 official doc백 오프 정책 - 일시적인 오류가 발생하면 다시 시도 할 때 다시 시도하기 전에 보통 비트를 기다리는 것이 좋습니다. 일반적으로 오류는 대기로 인해 해결되기 때문에 발생합니다. RetryCallback이 실패하면 RetryTemplate은 BackoffPolicy에 대한 에 따라 실행을 일시 중지 할 수 있습니다.

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

+0

제안 사항에 대해 @bellabax에게 감사드립니다. 스테이징을 사용하는 샘플 프로젝트 병렬 작업을 완료했지만 스테이징을 사용하는 데 열중하지 않습니다. 스테이징에는 DB 작업이 포함되어 있습니다. (내 경우에는) DB에 쓰기 데이터의 오버 헤드 작업을 만들고 DB에서 데이터를 읽고 파일에 쓰고 마침내 SQL 로더를 호출합니다. 필자가 생각하기에 ADT 데이터가있는 열에는 하나의 제약이 있으므로 SQL 로더에서 제공합니다. 나 타자 접근. –

-1

입력 파일을 여러 파일로 분할하고 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> 

전체 example code (on Github).

희망 도움말.

+0

링크가 질문에 대답 할 수 있습니다. 여기에 답변의 핵심 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. - [검토 중] (리뷰/리뷰/저품질 게시물/17539118) –

관련 문제