2017-12-21 17 views
1

대용량 파일의 파일 크기는 10 억 ~ 50 억 개입니다. 나는 청크 지향적 인 프로세싱을 사용할 계획이고 내 생각은이다.대용량 파일 (10 억 ~ 50 억 개의 플랫 파일 데이터)의 일괄 처리

1) 각 파일에서 10K라고 말해라.

2) 10 억 개 레코드가 있다면 나는 10K 기록

3

) 나는이 10000 개 파일을 분할하고 싶은 10 개 스레드를 사용하여 처리하고 싶습니다를 포함 10000 개 파일 각을 얻을 것이다. 사용자 지정 MultiResourcePartioner를 사용했습니다.

4) 10 개의 스레드가 분할 프로세스에서 생성 된 10000 개의 파일을 모두 처리해야합니다.

5) 메모리 문제가 발생할 수있는 경우와 동일한 수의 스레드를 파일 수와 같게 만들고 싶지 않습니다. 내가 바라는 것은 단지 10 개의 스레드 만 사용하여 파일을 처리하고자하는 파일의 수와 관계가 없습니다.

전문가가 스프링 배치를 사용하여 달성 할 수 있음을 알려주십시오. 그렇다면 포인터 또는 참조 구현을 공유하십시오.

예 :

<bean id="transformPartitioner" 
    class="com.example.transformers.partition.TransformerPartitioner"> 
    <property name="outputPath" value="${output.directory}" /> 
</bean> 

<bean id="loadTransformData" class="com.example.transformers.step.LoadTransformData" 
    factory-method="reader" scope="step"> 
    <constructor-arg value="#{stepExecutionContext[outputFile]}" /> 
</bean> 

<bean id="processTransformData" class="com.example.transformers.step.ProcessTransformData" 
    scope="step"> 
    <property name="threadName" value="#{stepExecutionContext[threadName]}" /> 
    <property name="sourceFileName" value="#{jobParameters[filename]}" />  
</bean> 

<bean id="notifyToJMS" class="com.example.transformers.step.NotifyToJMS" 
    scope="step"> 
    <property name="fileName" value="#{stepExecutionContext[outputFile]}" /> 
</bean> 

<bean id="outputFileDeletingTasklet" 
    class="com.example.transformers.step.OutputFileDeletingTasklet" 
    scope="step"> 
    <property name="directory" value="file:${output.directory}" /> 
</bean> 

<bean class="org.springframework.batch.core.scope.StepScope" /> 

<bean id="jobRepository" 
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> 
    <property name="transactionManager" ref="transactionManager" /> 
</bean> 

<bean id="jobLauncher" 
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
    <property name="jobRepository" ref="jobRepository" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> 

사용자 정의 멀티 자원 분할 :

public Map<String, ExecutionContext> partition(int gridSize) { 

    int index = 0; 
    File directory = new File(outputPath); 
    File[] fList = directory.listFiles(); 
    Map result = new HashMap(gridSize); 

    for (File file : fList) { 
     if (file.isFile()) { 
      ExecutionContext exContext = new ExecutionContext(); 
      logger.info(loggerClassName+" Starting : Thread [" + index + "] for file : " + file.getName()); 
      exContext.put(constants.THREAD_NAME, "Thread" + index); 
      exContext.put(constants.OUTPUT_FILE, outputPath + file.getName()); 
      exContext.put(constants.OUTPUT_FILE_NAME, file.getName()); 
      result.put(constants.PARTITION + index, exContext); 
      index++; 
     } 
    } 

당신의 응답을 주셔서 감사합니다.

+0

큰 숫자를 다루는 사람들의 숫자는 아주 적습니다. 세계는 아마도 Spring Batch를 사용하여 수십억 개의 레코드를 처리하는 데 더 많은 전문가를 사용할 수 있습니다. 그래서 시도해보고 결과를 확인한 다음 다시보고하십시오 :) – Paul

+0

이 문제를 해결하는 방법을 모르겠습니다. 파티션을 제어 할 방법이 없습니까? 배치가 현명하다면 가능할 것입니다. 예를 들어 첫 번째 일괄 처리 100 개의 파일과 두 번째 일괄 처리 100 개의 파티션을 다음 100 개의 파일로 나눕니다. 이렇게 ... 내 요구 사항은 1 억 5 천만에서 5 억 2 천만 개의 파일을 플랫 파일 데이터로 사용합니다. – Sai

+0

@Sai : 죄송합니다. 귀하의 답변은 내 대답에 대한 의견이어야하며 답변 자체는 아닙니다. 문제가 해결되었음을 알려주십시오. –

답변

0

첫 번째로 내 this answer을 읽으면 파티션 수가 100을 넘어 서면 스프링 배치가 잘 수행되지 않는다는 것, 즉 스프링 배치 API 자체가 메타 테이블에서 데이터를 준비하는 데 너무 많은 시간이 걸리기 시작한다는 것을 이해해야합니다. 이것은 이해력을 넘어서는 것이지만 그것은 그것이 그대로있는 방법입니다.

둘째, 큰 파일을 작은 파일로 분할하는 것이 맞습니다. 이것이 바로 그 방법입니다. 이 사전 처리 과정에서 각 파일 이름에 식별자를 지정하여 나중에 쉽게 그룹화 할 수 있습니다.

부적절한 부분은 파일 수만큼의 파티션을 생성하는 것입니다. 10k 개의 파일이 있고 Spring Batch API가 1000 개의 파티션에 대한 메타 데이터를 생성하는 데 영원히 걸리는 경우 10k에 대해 어떻게 작동하는지 상상할 수 있습니다 파티션.

하나의 파티션이 하나의 파일 대신 파일 그룹을 의미하는 작업에서 파티션 수를 수정해야합니다. 이것은 당신이 그 그룹을 어떻게 달성하고 싶은지에 달려 있습니다. 50 개의 파티션을 말하면서 10K 개의 파일을 50 개의 그룹으로 나눌 것입니다. 즉 각 파티션마다 200 개의 파일을 의미합니다.

코드에서 gridSize을 사용하여 맵을 초기화하고이를 사용하여 파티션 수를 수정하십시오.

이제 Spring Batch는 병렬로 시작할 파티션의 수 (포인트 # 5)를 선택합니다. - # 3의 my this answer을 읽습니다. 비동기 태스크 실행 프로그램이나 스레드 풀을 사용할 수 있습니다. 병렬 처리는 서버 용량에 따라 다릅니다.

이렇게하면 하나의 스레드가 하나의 파일 대신 여러 파일을 처리합니다. 전체 파티션 중 한 번에 몇 개만 활성 상태로 유지되며 나머지는 에 있습니다. 시작되지 않음 상태입니다.

+0

늦게 회신 해 드려 죄송합니다. 휴가를 보내고 정보를 제공해 주셔서 감사합니다. 파티션에 파일 그룹을 추가했습니다. 그러나 항목 판독기에서 여러 파일을 읽는 방법은 무엇입니까? (int i = temp; i Sai

+0

하나의 스레드에 대한 샘플 예제를 제공하여 여러 파일을 처리 할 수 ​​있습니까? – Sai

0

배치 기반을 기준으로 문제를 해결했습니다. 파티션 제한을 100으로 고정 시켰으며 각 파티션이 여러 파일을 완료해야했습니다. 1) 각 파티션에 여러 파일을 추가했습니다. 2) 여러 파일을 읽고 항목 판독기에 위임 할 다중 리소스 항목 판독기를 구현했습니다.

제안 해 주셔서 감사합니다. Sabir !!!.