2012-10-17 5 views
2

맵에 정적 오브젝트가있어 작업 메소드를 한 번 (기본 메소드에서) 초기화 한 다음 모든 맵핑에서 함수를 호출하려고합니다. 내가 작업을 시작하기 전에 내가 전화Hadoop 맵 참조 정적 오브젝트 줄이기

static MyObject obj; 

그리고 내 주요 기능에 : : 다음

obj = new MyObject(); 
obj.init(); 

그리고 내지도 기능에 내가 원하는 그래서 나는 변수로 선언이 개체, MyObject를이 전화 :

obj.execute(); 

을하지만이 때 어떤 이유로 내가 널 포인터 예외가 (이 obj가 null 말한다). 만약 내가 그것을 내 주요 함수에서 초기화한다면, 매퍼는 그것을 초기화 된 것으로 보지 않을 것인가? 매퍼는 정적 변수를 볼 수 있습니까?

+0

분산 시스템이나 단일 시스템에서 사용해 보시겠습니까 ?? – banjara

+0

분산 시스템 – user1482350

답변

7

정적 개체가 메모리에 상주합니다. 이제 시스템에 하나의 이 배포되었으므로 작성한 객체는 다른 시스템에서는 작업 추적기가 실행되고있는 노드의 메모리에 있습니다.

이제 JSON으로 객체를 직렬화하고 구성과 매퍼에서 문자열로 넣어이 JSON 객체를 직렬화, 당신은 설정은 XML로 작성되기 때문에 매퍼에 직장에서 개체를 전달할 수 없지만 해결 방법은

당신이 일을 시작하는 곳
Configuration conf = context.getConfiguration(); 
conf.get("some key"); 
3

매퍼

에 대한 작업

job.getConfiguration().set("some key", "json string") 

에 대한

당신의() 주 모든 노드에 호출되지 않습니다, 그것은 단지 실행됩니다. 정적 객체에 액세스하려면 매퍼를 인스턴스화 할 때 초기화해야합니다. 그런 식으로지도 작업을 실행하는 모든 노드에서 초기화가 수행됩니다.

그러나 수행하려는 작업을 수행하는 다른 방법이있을 수 있습니다. 따라서이 정적 개체는 무엇을합니까?

0

내 개체가 실제로 라이브러리를로드했기 때문에 분산 캐시를 사용하여 결국 M/R 메서드에서 개체를 인스턴스화했습니다.

관련 문제