2012-04-16 3 views
5

여러 map() 호출에서 사용할 수있는 멤버 개체를 추가 할 수 있는지 궁금합니다. 예를 들어, 모두 StringBuilder는 : 매퍼 객체가 여러 스레드에서 공유되는 경우여러 스레드에서 공유되는 Hadoop의 Mapper 객체는 무엇입니까?

private StringBuilder builder; 

public void map(...){ 
    ... 

    builder.setLength(0); 
    builder.append(a); 
    builder.append(b); 
    builder.append(c); 
    d = builder.toString(); 

    ... 
} 

물론, 빌더 객체는 위 인해 둘 이상의 스레드에서 동시 액세스가 예상대로 작동하지 않습니다.

내 질문은 : 그것은 각 스레드가 hadoop 자체에 대한 하나의 전용 매퍼 개체를 사용하는 것이 확실합니까? 아니면 구성 가능한 동작입니까?

감사합니다.

답변

2

MultithreadedMapper 클래스를 사용하지 않는 한 아무 문제가 없습니다. map()은 순차라고하며 병렬이 아닙니다.

일반적으로 StringBuilder 또는 다른 데이터 구조를 사용하여 호출간에 개체를 버퍼링합니다. 하지만 입력 개체의 개체를 복제했는지 확인하십시오. 개체가 하나 뿐이므로 많은 양의 GC가 생기지 않도록 계속 채워집니다.

그래서 경쟁 조건을 동기화하거나 처리 할 필요가 없습니다.

+0

그건 내가 알고 싶은거야. 감사. – JRaSH

+1

전체 Key/Value 객체가 필요한 경우 객체를 복제하기 만하면됩니다. 그렇지 않으면 StringBuffer에 추가하는 내용 중 일부가 필요하면 잘됩니다. Reducer에 플러시/쓰려면 클린업 메소드를 추가하는 것을 잊지 마십시오. Map 호출간에 버퍼링하는 것은 무엇이든간에, 그렇지 않으면 결코 일부 데이터가 결코 Reducer로 보내지지 않게 될 것입니다. – Drizzt321

0

나는 그렇게 생각하지 않습니다. 그 이유는 각 매퍼가 자신의 JVM에서 실행되기 때문입니다 (다른 시스템에 분산 될 것입니다). 따라서 여러 매퍼 또는 축소기에 변수 또는 오브젝트를 쉽게 공유 할 수있는 방법이 없습니다.

모든 매퍼가 동일한 노드에서 실행하는 경우

지금, 내가 JVM의 구성이 생각 어딘가에 다시 사용하지만, 솔직히 난 당신이 필요로하는 모든이 StringBuilder :

특히 경우, 그 신경 쓰지 것 한 번 전에이 질문을 보았습니다. 응용 프로그램의 디자인을 변경하면 쉽게 해결할 수 있습니다. 어쩌면 당신은 이것이 실제로 필요한 것인지를 알기 위해 당신이 이것을 달성하기 위해 무엇을하려고하는지 더 많이 알 수 있습니다. 정말 필요하다면 객체를 직렬화하고 HDFS에 넣은 다음 각 매퍼에서 읽고 역 직렬화 할 수 있습니다.하지만 역순으로 보입니다.

+0

안녕하세요. 여러 마포를 통해 변수를 공유하지 않습니다. 내가 아는 한 각 매퍼의 map() 메서드는 여러 번 호출되며, 여기서는 몇 가지 리소스를 절약 할 수 있다고 생각합니다. 따라서 매퍼 인스턴스에 멤버 객체를 추가하면이 객체는 init 및 de-init를 반복하지 않고 여러 map() 호출에 걸쳐 resued 될 수 있습니다. 내 우려 사항은 : map()이 동시에 호출 된 경우, memeber 객체를 사용하는 데 문제가 발생할 수 있습니다. – JRaSH

관련 문제