데이터베이스에 입력을 읽고 쓰는 매퍼가 있습니다. 나는 실제로 얼마나 많은 입력이 그 데이터베이스로 변환되고 쓰여지는지를 제한하고, 모든 매퍼는 제한에 기여해야하고 그 한계에 도달하면 멈춰야합니다 (약 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 개의 레코드를 가져올 수 있습니다. 일부 제한 작업을 수행하고 있습니다 (가져온 레코드 수보다 훨씬 적은 수입니다).
카운터 값이 다른 매퍼로 푸시되거나 각 매퍼에서도 사용할 수 있습니까? 카운터에서 실제로 실시간 값을 얻을 수 있습니까? 아니면 매퍼가 완료 될 때만 업데이트 할 수 있습니까? 매퍼간에 가치를 공유하는 더 좋은 방법이 있습니까?