복붙노트

[HADOOP] Hadoop Map 참조 정적 객체 줄이기

HADOOP

Hadoop Map 참조 정적 객체 줄이기

지도에서 정적 객체를 사용하여 작업 메소드 클래스를 한 번 초기화 (main 메소드에서) 한 다음 모든 매핑에서 함수를 호출합니다. 그래서이 객체, MyObject를 변수로 선언했습니다.

static MyObject obj;

그리고 제가 일을 시작하기 전에 제 주요 기능에서 다음과 같이 부릅니다 :

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

그런 다음지도 기능에서 전화를 걸고 싶습니다.

obj.execute();

하지만 어떤 이유로 (NULL로 obj 말한다)이 시도 할 때 null 포인터 예외가 발생합니다. 내 주요 기능에서 초기화하는 경우 매퍼가 초기화 된 것으로 보지 않아야합니까? 매퍼는 정적 변수를 볼 수 있습니까?

해결법

  1. ==============================

    1.정적 객체는 메모리에 있습니다. 이제 당신의 시스템은 그래서 당신이 만든 객체는 작업 추적기가 다른 시스템에서 실행되고 있지 않은 노드의 메모리에 있습니다.

    정적 객체는 메모리에 있습니다. 이제 당신의 시스템은 그래서 당신이 만든 객체는 작업 추적기가 다른 시스템에서 실행되고 있지 않은 노드의 메모리에 있습니다.

    구성이 XML로 작성 되었기 때문에 작업을 매퍼로 전달할 수 없지만 해결 방법이 있습니다. 개체를 JSON으로 serialize 한 다음 구성에 문자열로 넣고 매퍼에서이 json 개체를 deserialize하십시오.

    직업

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

    폴더 용

    Configuration conf = context.getConfiguration();
    conf.get("some key");
    
  2. ==============================

    2.주 ()는 모든 노드에서 호출되지 않고 작업을 시작하는 위치에서만 실행됩니다. 정적 객체에 액세스하려면 매퍼를 인스턴스화 할 때 초기화해야합니다. 그런 식으로지도 작업을 실행하는 모든 노드에서 초기화가 수행됩니다.

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

    그러나 당신이 성취하려고하는 또 다른 방법이있을 수 있습니다. 그래서이 정적 객체는 무엇을합니까?

  3. ==============================

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

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

  4. from https://stackoverflow.com/questions/12935774/hadoop-map-reduce-reference-static-objects by cc-by-sa and MIT license