[Zeppelin] 다중 Interpreter binding과 Interpreter Timeout 설정하기

Jaemun Jung
6 min readAug 27, 2020

--

Zeppelin을 여러 사용자가 동시에 사용하고 있다면, 조금 더 쾌적하게 쓰기 위해 필요한 설정들이 무엇이 있을까?

Interpreter Binding Mode

Interpreter Binding option Default 값 : Globally in shared process

Zepplin 메뉴의 Interpreter의 설정을 보면, 좌측과 같은 설정이 가능하다.

Default 설정은 전체 Zeppelin에 하나의 Interpreter Process가 뜨고, 모든 사용자가 이 Process 안에서 하나의 Session을 공유한다. 혼자 쓸 때는 큰 문제가 안된다. 그런데 여럿이 쓰는 경우, 누군가 쿼리를 실행하고 있으면 다음 사람은 줄서서 차례를 기다려야만 한다. 5초 짜리 Job은 괜찮은데 50분짜리 Job이 돌고 있으면, 마냥 기다리기는 힘들다.

이런 경우를 위해 다중으로 Interpreter Session을 사용할 수 있도록 설정해주자.
관련해서는 Zeppelin 공식 Document에 너무 설명이 잘 되어있으므로 간단하게만 이야기하면,

  • shared mode : 하나의 Interpreter Process JVM안에 하나의 세션 (Default)
  • scoped mode : 하나의 Interpreter Process 안에 다중 세션
  • isolated mode : 각 세션 별로 별도의 Interpreter Process
각 모드별 장단점
shared mode
isolated mode

이제 각자 note별로 intereter를 띄워서 방해받지 않고 쓸 수 있다.

신난다! 각자 맘껏 돌리자!

그런데 프로세스가 저렇게 많이 뜨면.. 서버 리소스는 괜찮을까?
아니.. 안괜찮다.

Zeppelin이 떠 있는 EMR Master node의 메모리 현황을 보니, 메모리가 빈틈없이 꽉 차버렸다.

Ganglia — Mem Report : 위의 최근 4시간 리포트를 보면 꽉 찼다.

Interpreter Process가 하나 뜰 때는 고려할 필요 없었던 Timeout을 설정해야겠다.
(덧: Timeout 설정 이후 해당 노드의 scale-up도 진행했다.)

Interpreter Lifecycle Management

Zeppelin 0.8.0에서부터 추가된 기능으로, Interpreter Lifecycle Management를 통해 Interpreter가 idle 상태로 일정 시간이 지나면 Timeout이 되게 설정할 수 있다.

Zeppelin의 configuration에 가면 lifecycle 관련 default 값은 아래와 같이 나올 것이다.

가장 상단의 zeppelin.interpreter.lifecyclemanager.class가 NullLifecycleManager로 되어 있다면 이 기능이 활성화 되어 있지 않은 것이다.
이 class를 TimeoutLifecycleManager로 설정해주어야 한다.

- zeppelin.interpreter.lifecyclemanager.timeout.checkinterval
- zeppelin.interpreter.lifecyclemanager.timeout.threshold
나머지 두가지, checkinterval은 timeout을 체크하는 주기이고, threshold는 timeout 시간이다. 모두 millisecond로 설정한다.

우리 환경에서는 5분마다 체크해서 30분 동안 idle이면 timeout이 되도록 설정했다.
아래는 zeppelin-site.xml의 변경 후 내용과 그 script이다.

zeppelin-site.xml
<property>
<name>zeppelin.interpreter.lifecyclemanager.class</name>
<value>org.apache.zeppelin.interpreter.lifecycle.TimeoutLifecycleManager</value>
</property>
<property>
<name>zeppelin.interpreter.lifecyclemanager.timeout.checkinterval</name>
<value>300000</value>
</property>
<property>
<name>zeppelin.interpreter.lifecyclemanager.timeout.threshold</name>
<value>1800000</value>
</property>

Reference

--

--

No responses yet