본문 바로가기

IT for researcher/Cloud Computing

Task JVM Reuse - in MapReduce

Hadoop 책에서 일부 발번역함

하둡은 실행되고 있는 다른 태스크들로부터 분리하기 위하여 자신의 JVM에서 태스크를 실행한다. 각 태스크마다 새로운 JVM을 시작하는 오버헤드는 1초 정도걸린다. 이는 1분정도 실행되는 job들에게는 그다지 중요하지 않다. 그러나, 짧은 생명 주기 태스크(일반적으로 맵태스크들)를 많이 가지고 있거나 긴 초기화과정을 가지고 있는 job들은 다음 태스크들을 위해 JVM이 재사용될 때 좋은 퍼포먼스를 얻을 수 있다.
태스크 JVM 재사용하면 태스크들이 하나의 JVM에서 동시에 실행할 수는 없다. JVM은 순차적으로 태스크를 실행한다. 그러나 태스크트랙커들은 한번에 하나 이상의 태스크를 실행할 수 있지만 이것은 항상 분리된 JVM에서 이루어진다. 태스크트랙커의 맵과 리듀스 태스크수를 제어하기 위한 속성은 메모리를 설명하는 부분에서 나올 것이다.
태스크 JVM 재사용을 제어하기 위한 속성은 mapred.job.reuse.jvm.num.tasks: 이것은 각 JVM에 job을 실행하기 위한 태스크의 최대수를 지정한다. 다양한 job들의 태스크들은 항상 분리된 JVM에서 실행한다. 만약에 속성값이 -1이면 JVM을 공유하는 태스크의 수에 대한 제한이 없다.(물론 동일한 Job이어야함)  JobConf.setNumTasksToExecutePerJvm() 메소드를 가지고 속성을 설정할 수 있다.

CPU를 소비하는 태스크들은 핫스팟 JVM에 적용된 런타임 최적화의 이점을 이용하여 태스크 JVM을  재사용하는 것이 유용할 수 있다. 한 동안 실행된 후,  HotSpot JVM은 성능과 밀접한 부분을 찾아내기 위한 충분한 정보를 만들고 이러한 부분들에 대해 동적으로 자바 바이트 코드를 네이티브 코드로 변환한다. 이러한 작업은 오래 걸리는 처리에 대해 좋지만 단지 몇분 걸리는 실행은 이러한 장점이 별반 영향이 없다. 이러한 경우들에서 태스크 JVM 재사용을 가능케하는 가치가 있다. 
공유 JVM이 유용한 또 다른 곳은 job의 태스크들 사이에서 상태를 공유할 때 이다. 정적 필드에서 레퍼런스데이터를 저장하여 태스크들은 공유데이터를 빠르게 접근한다.