2012-06-20 3 views
0

데이터베이스에 입력을 읽고 쓰는 매퍼가 있습니다. 나는 실제로 얼마나 많은 입력이 그 데이터베이스로 변환되고 쓰여지는지를 제한하고, 모든 매퍼는 제한에 기여해야하고 그 한계에 도달하면 멈춰야합니다 (약 1-2 개는 큰 것이 아닙니다.)MapReduce 매퍼간에 카운터 값 공유

"가져온 레코드가 몇 개입니까?"라는 다른 작업을 묻는 매퍼에서 리미터 기능을 구현했습니다. 주어진 한계에 도달되면, 그 기록을 가져 오기를 중단합니다

문제의 맵 코드는 다음과 같이 보입니다 (이것은 다른 목적을 위해 그들을 처리를 계속 하겠지만.) :

public void map(ImmutableBytesWritable key, Result row, Context context) { 
    // prepare the input 
    // ... 

    if (context.getCounter(Metrics.IMPORTED).getValue()<IMPORT_LIMIT){ 
    importRecord(); 
    context.getCounter(Metrics.IMPORTED).increment(1l); 
    } 

    // do other things 
    // ... 
} 

그래서 각 매퍼 검사를 가져올 공간이 더 있는지 확인하고 제한에 도달하지 않은 경우에만 가져 오기를 수행합니다. 그러나 각 매퍼 자체가 한도까지 가져 오기 때문에 16 개의 매퍼에 대해 16 * IMPORT_LIMIT 개의 레코드를 가져올 수 있습니다. 일부 제한 작업을 수행하고 있습니다 (가져온 레코드 수보다 훨씬 적은 수입니다).

카운터 값이 다른 매퍼로 푸시되거나 각 매퍼에서도 사용할 수 있습니까? 카운터에서 실제로 실시간 값을 얻을 수 있습니까? 아니면 매퍼가 완료 될 때만 업데이트 할 수 있습니까? 매퍼간에 가치를 공유하는 더 좋은 방법이 있습니까?

답변

0

좋아요. MapReduce는 작업이 완료 될 때까지 (즉, 전혀 작동하지 않을 때까지) 매퍼간에 카운터를 공유하지 않습니다. 중간부터 완료하는 매퍼가 나중에 매퍼를 사용할 수 있는지 잘 모르겠습니다. 그들의 카운터를 보아라. 그러나 그것은 실시간으로하게 될만큼 충분히 신뢰할 수 없다.

대신 기존의 MapReduce 작업이 행을 가져와야하는지 여부를 결정하는 데 사용할 행에 자체적으로 반복하는 간단한 Java 응용 프로그램을 실행합니다.