2012-11-05 3 views
1

이제 MapReduce 작업의 모든 매퍼/감속기에서 액세스하고 변경할 수있는 전역 변수 (멤버)를 만들고 싶습니다. 처음에는 메인 자바 파일에 정적 인 이중 멤버를 명시하려고했지만 각 매퍼/감속기가 별도의 JVM에서 실행되고 멤버가 변경되어 올바르게 액세스 될 수 있기 때문에 문제가있는 것 같습니다.Hadoop MapReduce의 Java 구현에서 전역 변수를 만드는 방법은 무엇입니까?

int 변수에는 counter 메커니즘이 있다는 것을 알고 있습니다. 그러나 글로벌 double 변수를 만들고 싶다면 어떻게해야합니까?

최종 목표는 모든 매퍼/리듀서에서 이중 형식 인 것을 요약하는 것입니다. 전역 변수를 만들 수 없거나 만들지 않아야한다면, 그 목표를 달성 할 수있는 다른 방법이 있습니까?

+7

전역 변수는 기본적으로 map/reduce로 수행 할 수있는 것과 반대입니다. 그것도하려고하지 마십시오. 비록 당신이 그것을 모방 할 수 있다고하더라도, 그것은 map/reduce의 모든 목적을 무효화하고 parallelization이 효력을 발휘하지 못하게합니다. –

+0

@LouisWasserman 그러나 내가 매퍼 (mappers) 또는 감속기 (reducers)에서 두 배가되는 것을 합산하려면 어떻게해야합니까? – Denzel

+0

@LouisWasserman 질문에 추가했습니다. – Denzel

답변

2

이 두 배가 어디서 오는가? 그들이 입력 데이터에 있다면, 당신은 정상적인 MR 작업으로 할 수 있습니다. 매퍼에게 항상 동일한 키와 합계 값을 출력하게하십시오. 결합자를 사용하여 각 매퍼에서 로컬로 합산하십시오. 그런 다음 하나의 감속기 만 사용하고 총계를 단순히 방출하십시오.

"전역"상태는 Map-Reduce 패러다임이 피하려고하는 것입니다. 별도의 맵퍼에서 작업의 다른 부분을 수행 한 다음 감속기에서 결합/집계하는 것으로 모든 것에 대해 생각해야합니다.

1

실제로 두 배의 정수를 처리 할 수 ​​있습니다. 두 배에 100000을 곱하여 카운터에 저장할 수 있습니다. 감속기가 필요하면 100000으로 나누십시오.

+0

예. 이것은 까다 롭습니다. 그러나 이것이 분산 컴퓨팅의 개념에 어긋나므로 다른 해결책을 찾아야한다고 생각합니다. – Denzel

+0

이것이 분산 컴퓨팅의 개념에 어긋나는 이유는 아직 모르겠다. 그렇다면 왜 카운터가 존재합니까? 이 답변 +1 – vefthym

관련 문제