NodeManager 는 yarn.nodemanager.local-dirs 아래에 작업 파일을 만든다.
<local-dir>/filecache/ 공용 리소스 캐시 (PUBLIC)
<local-dir>/usercache/<user>/filecache/ 사용자 전용 캐시 (PRIVATE)
<local-dir>/usercache/<user>/appcache/<app_id>/ 애플리케이션 작업 공간
filecache 안에 504 처럼 숫자만으로 된 디렉터리가 보이는데, 이것은 로컬라이즈된 리소스에 NodeManager 가 붙인 일련번호다. 파일 내용이나 크기와는 관계가 없다. 그 안에 들어가면 실제 jar · 압축파일 · 설정 파일이 있다.
분산 캐시(distributed cache)로 지정된 파일이다. 잡이 -libjars · -files · -archives 로 넘겼거나, Spark · Tez 가 자기 라이브러리를 HDFS 에서 내려받는 경우다.
jar 가 생기는 노드와 안 생기는 노드가 갈리는 이유는 두 가지다. 그 노드에 해당 잡의 컨테이너가 배치되지 않았거나, 이미 캐시에 있어 다시 내려받지 않은 경우다. 캐시는 노드 단위이므로 클러스터 전체가 같은 모습일 필요가 없다.
가시성(visibility)에 따라 위치도 갈린다. HDFS 에서 모두가 읽을 수 있는 파일은 filecache(PUBLIC), 사용자만 읽을 수 있는 파일은 usercache/<user>/filecache(PRIVATE)로 간다. 같은 jar 가 어떤 잡에서는 공용으로, 어떤 잡에서는 사용자 전용으로 잡히는 것은 HDFS 퍼미션 차이 때문이다.
NodeManager 가 자체적으로 정리한다. 관련 설정은 세 가지다.
<property>
<name>yarn.nodemanager.localizer.cache.target-size-mb</name>
<value>10240</value>
</property>
<property>
<name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name>
<value>600000</value>
</property>
<property>
<name>yarn.nodemanager.delete.debug-delay-sec</name>
<value>0</value>
</property>
캐시 크기가 목표치를 넘으면 정리 주기에 맞춰 오래된 것부터 지운다. NodeManager 가 떠 있는 동안 이 디렉터리를 손으로 지우지 않는다. 실행 중인 컨테이너의 파일을 지우면 잡이 실패한다.
delete.debug-delay-sec 을 크게 잡아 두면 디버깅용으로 작업 디렉터리가 오래 남는다. 조사 목적으로 올렸다면 끝난 뒤 반드시 되돌린다. 디스크가 차는 흔한 원인이다.