Hive 설치 후 간단한 DML 문을 실행하였는데, 아래와 같이 OutOfMemoryError: PermGen space가 발생하였습니다. 실행했던 HQL이 단순하게 하나의 row를 삽입하는 문장이었는데 메모리 부족이 발생하다니, 초기 설정 그대로 테스트를 해보는 것은 욕심이었나봅니다.

 

  우선, 위에서 메모리 부족이라고 알려 준 PermGen space가 무엇인지 궁금해서 찾아보았습니다.
(참고로, 난 java 개발자가 아니라 데이터쟁이라서 Java 아키텍처에 대한 지식이 깊지않습니다. PermGen이 기본 중의 기본이라면 부끄러울 따름입니다.)

  구글링해서 찾은 Perm 영역에 대한 설명을 그대로 옮겨보았습니다.

Java 1.7 기준의 Perm 영역은 보통 Class의 Meta 정보나 Method의 Meta 정보, Static 변수와 상수 정보들이 저장되는 공간이다. 이 영역은 Java 1.8부터는 Native 영역으로 이동하여 Metaspace 영역으로 변경되었다.(다만, 기존 Perm 영역에 존재하던 Static Object는 Heap 영역으로 옮겨져 최대한 GC 대상이 될 수 있도록 하였다.)

조금 더 1.7과 1.8 메모리 구조의 변경에 대해 설명하자면, Java 1.8에서 JVM 메모리의 구조적인 개선 사항으로 Perm 영역이 Metaspace 영역으로 전환되고 기존 Perm 영역은 사라지게 되었다. Metaspace 영역은 Heap이 아닌 Native 메모리 영역으로 취급하게 된다. (이 말은 기존의 Perm은 Heap 안에 존재하는 것으로 알 수 있다.) Native 메모리는 Heap과 달리 OS레벨에서 관리 하는 영역이다.

출처: https://coding-start.tistory.com/205 [코딩스타트]
JDK 7: PermGen

Permanent Generation still exists in JDK 7 and its updates, and is used by all the garbage collectors. In JDK7, the effort to remove the permanent generation was started and some parts of the data residing in the permanent generation were moved to either the Java Heap or to the native heap. Permanent generation was not completely removed and it still exists in JDK 7 and its updates. Here's the list of things that were moved out of the permanent generation in JDK7:

출처 : https://blogs.oracle.com/poonam/about-g1-garbage-collector%2c-permanent-generation-and-metaspace

  간단하게 요약을 해보면 Garbage collector를 위해 Meta 정보를 저장하거나 Static 변수나 상수가 저장되는 공간이라고 합니다.

 

  아무튼, Permanent 공간이 부족하다고 하니 이 영역의 크기를 확장해 줄 필요가 있겠습니다.

  현재 설정된 상태를 살펴봅니다. 아래 명령어를 사용하면 Permanent 크기를 확인 할 수 있습니다.

> java -XX:+PrintFlagsFinal -version -server | grep PermSize

  현재 시스템에서 최대 Permanent 크기가 85,983,232 byte(82MB)로 설정되어 있는 것을 확인 할 수 있습니다.

 

  이 Permanet의 크기를 조정해주기 위해서는 HADOOP_OPTS에 관련 속성 설정 값을 추가해주면 됩니다. Hive 구동시마다 적용되도록 $HIVE_HOME/conf/hive-env.sh에 아래 옵션을 추가해줍니다.

export HADOOP_OPTS="$HADOOP_OPTS -XX:PermSize=512M -XX:MaxPermSize=1024M"

 

  옵션 적용을 위해서 hive 서비스를 재기동합니다.
  그리고 설정이 제대로 적용되었는지 확인하기 위해서 hive 서비스 프로세스를 확인해 보았습니다.

  위에 Hive를 실행하는 자바프로세스 옵션에 우리가 방금 설정한 PermSize와 MaxPermSize가 추가되어 있는 것을 확인할 수 있을 것입니다.
  위와 같이 설정된 상태에서 hive 클라이언트에 접속하여 수차례 Insert 구문을 실행해봐도 에러 없이 정상적으로 수행되었음을 확인 할 수 있을 것입니다.

 

 

 

+ Recent posts