복붙노트

[HADOOP] 하둡의 맥락에서 자바 메모리 문제

HADOOP

하둡의 맥락에서 자바 메모리 문제

나는 다자간는 하둡 프레임 워크에 참여 계산합니다. 각 관계의 기록이 임계 값에서 이후 더 큰 얻을 때 나는 두 개의 메모리 문제에 직면

1) 에러 : GC 오버 헤드 제한, 초과

2) 오류 : Java 힙 공간.

임계 값은 체인에 대한 1.000.000 / 관계가 가입하고 스타 조인.

결합 연산에서 좀 해시 테이블, 즉 사용

Hashtable< V, LinkedList< K>> ht = new Hashtable< V, LinkedList< K>>( someSize, o.75F);

나는 순간 만 다음 입력 레코드를 해시 때 이러한 오류가 발생합니다. 해싱 동안 나는, 임시 개체를 많이 생산 루프에 대한 꽤 많은있다. 이런 이유로 나는 1) 문제를 얻는다. 그래서, 최종 클래스입니다 K = 모두 StringBuilder를 설정하여 1) 문제를 해결했다. 즉 나는 단지 몇 개체의 가치, 내용의 변화가 아니라 자신을함으로써 임시 개체의 양을 감소시켰다.

지금, 나는 2) 문제를 처리하고있다. 나는 파일 $ HADOOP_HOME / 하둡 / conf의 / hadoop-env.sh에서 적절한 변수를 설정하여 내 클러스터의 각 노드에서 힙 공간 증가했다. 문제는 여전히 남아 있었다. 내가 VisualVM과를 사용하여 힙의 매우 기본적인 모니터링을했다. 난 단지 마스터 노드 특히 JobTracker에 로컬 TaskTracker 데몬을 모니터링. 나는이 모니터링 중에 힙 오버 플로우 통지를하지 않았다. 또한 PermGen 공간은 오버 플로우하지 않았다.

순간에 따라서, 선언,

Hashtable< V, LinkedList< K>> ht = new Hashtable< V, LinkedList< K>>( someSize, o.75F);

나는 V = SomeFinalClass을 설정하는 생각입니다. 이 SomeFinalClass 객체의 양이 낮은 결과적으로 메모리 사용량을 유지하는 데 도움이됩니다. 당연히 SomeFinalClass 개체는 독립적으로 기본적으로 내용의 같은 해시 코드를가집니다. 그래서 위의 해시 테이블의 키로서이 SomeFinalClass을 사용할 수 없습니다. 나는 기본 해시 코드 () 메소드를 오버라이드 (override) 생각하고이 문제를 해결하기 위해와 유사한가 String.hashCode () 메소드에 의해. 이 방법은 SomeFinalClass 객체의 내용에 근거하는 해시 코드를 생성합니다.

문제 위의 솔루션에 대한 당신의 의견은 무엇입니까? 당신은 무엇을 할 것인가?

나는 또한 데이터 노드 데몬을 모니터링해야 하는가? 오류는 모두 위의 데이터 노드 오류 또는 모두 TaskTracker 오류입니까?

마지막으로, 용액은 상기 기록 / 관계의 임의의 양에 대한 문제를 해결할 것인가? 또는 즉시 또는 나중에 다시 같은 문제가 있습니까?

해결법

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

    1.LinkedList의 대신 ArrayList를 사용하고 그것을 훨씬 적은 메모리를 사용합니다.

    LinkedList의 대신 ArrayList를 사용하고 그것을 훨씬 적은 메모리를 사용합니다.

    또한 나는 나중에는 기존의 클래스로 대신 Hastable의는 HashMap을 사용하는 것이 좋습니다.

  2. from https://stackoverflow.com/questions/18949658/memory-problems-with-java-in-the-context-of-hadoop by cc-by-sa and MIT license