NodeManager
NodeManager
NodeManager(NM)는 각 노드에서 컨테이너를 실행하고 관리하는 YARN의 에이전트입니다. 이 문서는 NodeManager의 역할, 노드 상태 점검(Health Checker) 서비스, NodeManager 재시작 기능, 보조 서비스(auxiliary service) 클래스패스 격리, 컨테이너 로그 크기 제한, heartbeat 간격 확장 등 주요 기능과 관련 설정을 다룹니다.
출처: 문서
본문
개요 (Overview)
NodeManager는 노드에서 컨테이너를 실행하고 관리하는 역할을 담당합니다. 컨테이너는 AppMaster가 지정한 대로 태스크를 실행합니다.
Health Checker 서비스
NodeManager는 자신이 실행 중인 노드의 상태를 판단하는 서비스들을 실행합니다. 이 서비스들은 디스크 검사뿐 아니라 사용자가 지정한 테스트도 수행합니다. 어떤 상태 검사가 실패하면 NodeManager는 해당 노드를 unhealthy로 표시하고 이를 ResourceManager에 알리며, ResourceManager는 이후 그 노드에 컨테이너를 할당하지 않습니다. 노드 상태 전달은 NodeManager와 ResourceManager 사이의 heartbeat의 일부로 이루어집니다. 디스크 검사기와 상태 모니터(아래에서 설명)가 실행되는 주기는 heartbeat 주기에 영향을 주지 않습니다. heartbeat가 발생할 때 두 검사의 상태를 합쳐 노드의 상태를 결정합니다.
디스크 검사기 (Disk Checker)
디스크 검사기는 NodeManager가 사용하도록 설정된 디스크(local-dirs와 log-dirs, 각각 yarn.nodemanager.local-dirs와 yarn.nodemanager.log-dirs로 설정)의 상태를 검사합니다. 검사에는 권한(permissions)과 여유 디스크 공간이 포함됩니다. 또한 파일시스템이 읽기 전용(read-only) 상태가 아닌지도 확인합니다. 검사는 기본적으로 2분 간격으로 실행되지만 사용자가 원하는 만큼 자주 실행되도록 설정할 수 있습니다. 어떤 디스크가 검사를 통과하지 못하면 NodeManager는 해당 디스크만 사용을 중단하고 노드 상태는 여전히 healthy로 보고합니다. 그러나 일정 수 이상의 디스크가 검사를 통과하지 못하면(그 수는 아래에서 설명하듯 설정 가능), 노드는 ResourceManager에 unhealthy로 보고되고 새 컨테이너는 그 노드에 할당되지 않습니다.
디스크 검사를 조정하는 데 사용할 수 있는 설정 매개변수는 다음과 같습니다.
| Configuration Name | Allowed Values | Description | | yarn.nodemanager.disk-health-checker.enable | true, false | 디스크 상태 검사 서비스를 활성화/비활성화합니다. | yarn.nodemanager.disk-health-checker.interval-ms | Positive integer | 디스크 검사기가 실행되는 간격(밀리초). 기본값은 2분입니다. | yarn.nodemanager.disk-health-checker.min-healthy-disks | Float between 0-1 | NodeManager가 노드를 healthy로 표시하기 위해 검사를 통과해야 하는 디스크의 최소 비율. 기본값은 0.25입니다. | yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage | Float between 0-100 | 디스크 검사 서비스가 디스크를 unhealthy로 표시하기 전에 허용되는 최대 디스크 사용률(%)입니다. NodeManager가 사용하는 모든 디스크에 대해 검사가 실행됩니다. 기본값은 90, 즉 디스크의 90%까지 사용할 수 있습니다. | yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb | Integer | 디스크 검사 서비스가 디스크를 healthy로 표시하기 위해 디스크에 있어야 하는 최소 여유 공간(MB)입니다. NodeManager가 사용하는 모든 디스크에 대해 검사가 실행됩니다. 기본값은 0, 즉 디스크 전체를 사용할 수 있습니다.
외부 상태 스크립트 (External Health Script)
사용자는 자신만의 상태 검사 스크립트를 지정할 수 있으며 health checker 서비스가 이를 호출합니다. 사용자는 스크립트에 전달할 타임아웃과 옵션을 지정할 수 있습니다. 스크립트가 타임아웃되거나, 예외를 던지거나, ERROR 문자열로 시작하는 줄을 출력하면 노드는 unhealthy로 표시됩니다. 다음 점에 유의하세요:
- 0이 아닌 종료 코드는 문법 오류 때문일 수 있으므로 실패로 간주하지 않습니다. 따라서 노드는 unhealthy로 표시되지 않습니다.
- 스크립트를 권한 문제나 잘못된 경로 등으로 실행할 수 없으면 이는 실패로 간주되어 노드는 unhealthy로 보고됩니다.
- 상태 검사 스크립트를 지정하는 것은 필수가 아닙니다. 스크립트를 지정하지 않으면 디스크 검사기의 상태만으로 노드의 상태를 판단합니다.
사용자는 yarn.nodemanager.health-checker.scripts 설정으로 각각 따로 실행할 스크립트를 최대 4개까지 지정할 수 있습니다. 또한 모든 스크립트에 공통으로 적용할 옵션(전역 설정)을 구성할 수 있습니다.
| Configuration Name | Allowed Values | Description | | yarn.nodemanager.health-checker.script | String | 콤마로 구분된 health checker 스크립트들의 키워드. 기본값은 "script"입니다. | yarn.nodemanager.health-checker.interval-ms | Positive integer | health checker 서비스가 실행되는 간격(밀리초). 기본값은 10분입니다. | yarn.nodemanager.health-checker.timeout-ms | Positive integer | 실행되는 상태 스크립트의 타임아웃(밀리초). 기본값은 20분입니다.
모든 health checker 스크립트에 대해 설정할 수 있는 옵션은 다음과 같습니다. %s 기호는 yarn.nodemanager.health-checker.script에 제공된 각 키워드로 치환됩니다.
| Configuration Name | Allowed Values | Description | | yarn.nodemanager.health-checker.%s.path | String | 실행할 상태 검사 스크립트의 절대 경로. 각 스크립트의 필수 인자입니다. | yarn.nodemanager.health-checker.%s.opts | String | 스크립트 실행 시 전달할 인자. 각 스크립트의 필수 인자입니다. | yarn.nodemanager.health-checker.%s.interval-ms | Positive integer | health checker 서비스가 실행되는 간격(밀리초). | yarn.nodemanager.health-checker.%s.timeout-ms | Positive integer | 실행되는 상태 스크립트의 타임아웃(밀리초).
interval과 timeout 옵션은 반드시 지정할 필요는 없습니다. 지정하지 않으면 전역 설정을 사용합니다.
NodeManager 재시작 (NodeManager Restart)
소개 (Introduction)
이 문서는 NodeManager(NM) 재시작의 개요를 제공합니다. 이 기능은 NM이 재시작되어도 노드에서 실행 중인 활성 컨테이너를 잃지 않도록 합니다. 높은 수준에서 NM은 컨테이너 관리 요청을 처리하면서 필요한 상태를 로컬 상태 저장소(local state-store)에 저장합니다. NM이 재시작되면 먼저 여러 하위 시스템의 상태를 로드한 다음, 로드된 상태를 사용해 각 하위 시스템이 복구를 수행하는 방식으로 복구합니다.
NM 재시작 활성화 (Enabling NM Restart)
1단계. NM 재시작 기능을 활성화하려면 conf/yarn-site.xml에 다음 속성을 true로 설정합니다.
| Property | Value | | yarn.nodemanager.recovery.enabled | true (기본값은 false) |
2단계. NodeManager가 실행 상태를 저장할 로컬 파일시스템 경로를 구성합니다.
| Property | Description |
| yarn.nodemanager.recovery.dir | 복구가 활성화된 경우 노드 관리자가 상태를 저장할 로컬 파일시스템 디렉터리. 기본값은 $hadoop.tmp.dir/yarn-nm-recovery입니다.
3단계: NM이 종료될 때 실행 중인 컨테이너가 정리되지 않도록 복구 하의 NM 감독(supervision)을 활성화합니다.
| Property | Description | | yarn.nodemanager.recovery.supervised | 활성화하면 NodeManager는 곧바로 재시작되어 컨테이너를 복구할 것이라고 가정하고, 종료 시 컨테이너를 정리하려 하지 않습니다. 기본값은 'false'입니다.
4단계. NodeManager에 유효한 RPC 주소를 구성합니다.
| Property | Description |
| yarn.nodemanager.address | 임시 포트(기본값인 포트 0)는 yarn.nodemanager.address로 지정된 NM의 RPC 서버에 사용할 수 없습니다. 재시작 전후로 NM이 다른 포트를 사용하게 되어, 재시작 전에 NM과 통신하던 기존 클라이언트가 끊어질 수 있기 때문입니다. yarn.nodemanager.address를 특정 포트 번호(예: 0.0.0.0:45454)를 가진 주소로 명시적으로 설정하는 것은 NM 재시작을 활성화하기 위한 전제 조건입니다.
5단계. 보조 서비스 (Auxiliary services).
YARN 클러스터의 NodeManager는 보조 서비스를 실행하도록 구성될 수 있습니다. 완전히 기능하는 NM 재시작을 위해 YARN은 구성된 어떤 보조 서비스든 복구를 지원해야 한다고 요구합니다. 여기에는 일반적으로 (1) 임시 포트 사용을 피해서 재시작 후 기존 클라이언트(이 경우 보통 컨테이너)가 중단되지 않도록 하고, (2) 보조 서비스 자체가 NodeManager 재시작 시 이전 상태를 다시 로드하고 보조 서비스를 재초기화하여 복구 가능성을 지원하는 것이 포함됩니다.
위 내용의 간단한 예는 MapReduce(MR)용 보조 서비스인 'ShuffleHandler'입니다. ShuffleHandler는 이미 위 두 요구사항을 만족하므로, 사용자/관리자는 NM 재시작을 지원하기 위해 아무것도 할 필요가 없습니다: (1) 설정 속성 mapreduce.shuffle.port는 NodeManager 호스트에서 ShuffleHandler가 바인딩할 포트를 제어하며 기본값은 임시가 아닌 포트입니다. (2) ShuffleHandler 서비스는 NM 재시작 후 이전 상태의 복구도 이미 지원합니다.
보조 서비스를 구성하는 방법은 두 가지입니다: manifest를 통하거나 Configuration을 통하는 것입니다. 보조 서비스 manifest가 활성화되어 있지 않을 때만 이전 방식인 Configuration 속성을 사용해 보조 서비스가 로드됩니다. manifest를 사용하는 이점 중 하나는 NM이 manifest 변경에 기반해 보조 서비스를 동적으로 다시 로드할 수 있다는 점입니다. 다시 로드를 지원하려면 AuxiliaryService 구현은 NM이 보조 서비스의 새 인스턴스를 만들 수 있도록 서비스 중지 단계에서 필요한 정리를 수행해야 합니다.
보조 서비스 클래스패스 격리 (Auxiliary Service Classpath Isolation)
소개 (Introduction)
NodeManager에서 보조 서비스를 실행하려면 사용자가 자신의 jar를 NodeManager의 클래스패스에 직접 추가해야 하므로, 이들이 시스템 클래스로더에 올라가게 됩니다. 하지만 클래스패스에 플러그인의 여러 버전이 존재하면 실제로 어떤 버전이 로드되는지 제어할 수 없습니다. 또는 보조 서비스가 가져온 의존성과 NodeManager 자체 사이에 충돌이 있으면 NodeManager나 보조 서비스, 또는 둘 다를 깨뜨릴 수 있습니다. 이 문제를 해결하기 위해 시스템 클래스로더와 다른 클래스로더를 사용해 보조 서비스를 인스턴스화할 수 있습니다.
Manifest
이 절은 aux-service 클래스패스 격리를 위한 보조 서비스 manifest를 설명합니다. manifest를 사용하려면 yarn-site.xml에서 yarn.nodemanager.aux-services.manifest.enabled 속성을 true로 설정해야 합니다.
파일시스템에서 manifest 파일을 로드하려면 yarn-site.xml의 yarn.nodemanager.aux-services.manifest 속성에 파일 경로를 설정합니다. NM은 yarn.nodemanager.aux-services.manifest.reload-ms(기본값 0; 간격을 0 이하로 설정하면 자동으로 다시 로드되지 않음)로 지정된 간격으로 이 파일의 새 수정 사항을 확인합니다. 또는 REST API를 통해 http://nm-http-address:port/ws/v1/node/auxiliaryservices 엔드포인트에 PUT 호출을 해서 manifest 파일을 NM에 보낼 수도 있습니다. 단, 이는 한 NM의 manifest만 갱신한다는 점에 유의하세요. NM은 새 manifest를 읽을 때 manifest에서 발견된 서비스 이름과 버전에 따라 보조 서비스를 추가, 제거 또는 다시 로드합니다.
CustomAuxService에 대한 클래스패스 격리를 구성하는 예제 manifest는 다음과 같습니다. 서비스의 클래스패스를 구성하기 위해 하나 이상의 파일을 지정할 수 있으며 jar 또는 아카이브 형식을 지원합니다.
{
"services": [
{
"name": "mapreduce_shuffle",
"version": "2",
"configuration": {
"properties": {
"class.name": "org.apache.hadoop.mapred.ShuffleHandler",
"mapreduce.shuffle.transfer.buffer.size": "102400",
"mapreduce.shuffle.port": "13562"
}
}
},
{
"name": "CustomAuxService",
"version": "1",
"configuration": {
"properties": {
"class.name": "org.aux.CustomAuxService"
},
"files": [
{
"src_file": "${remote-dir}/CustomAuxService.jar",
"type": "STATIC"
},
{
"src_file": "${remote-dir}/CustomAuxService.tgz",
"type": "ARCHIVE"
}
]
}
}
]
}
Configuration
이 절은 aux-service 클래스패스 격리를 위한 구성 변수를 설명합니다. 보조 서비스는 manifest 파일이 지정되지 않은 경우에만 configuration에서 로드됩니다.
다음 설정을 yarn-site.xml에 넣어야 합니다.
| Configuration Name | Description |
| yarn.nodemanager.aux-services.%s.classpath | 관련 jar 파일과 모든 의존성의 jar 파일을 포함하는 로컬 디렉터리를 지정합니다. 단일 jar 파일을 지정하거나 ${local_dir_to_jar}/*를 사용해 dep 디렉터리 아래의 모든 jar를 로드할 수 있습니다.
| yarn.nodemanager.aux-services.%s.remote-classpath | jar 파일에 대한 원격 절대/상대 경로를 지정합니다 (zip, tar.gz, tgz, tar, gz 파일도 지원). 같은 aux-service 클래스에 대해 yarn.nodemanager.aux-services.%s.classpath 또는 yarn.nodemanager.aux-services.%s.remote-classpath 중 하나만 지정할 수 있습니다. 둘 다 지정하면 YarnRuntimeException이 던져집니다. 또한 jar 파일의 소유자가 NodeManager 사용자와 같아야 하고 권한 비트가 (permbits & 0022)==0을 만족해야 합니다(예: 600, 그룹/기타에 쓰기 불가).
| yarn.nodemanager.aux-services.%s.system-classes | 보통 이 설정을 지정할 필요는 없습니다. 클래스가 system-classes에 속하지 않으면 커스텀 클래스패스에서 로드됩니다. 예를 들어 기본적으로 org.apache.hadoop 패키지는 system-classes에 있는데, CustomAuxService 클래스가 org.apache.hadoop 패키지에 있다면 커스텀 클래스패스에서 로드되지 않습니다. 이를 해결하려면 CustomAuxService의 패키지를 바꾸거나, org.apache.hadoop을 제외한 자체 system-classes를 구성하면 됩니다.
Configuration 예제
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,CustomAuxService</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.CustomAuxService.classpath</name>
<value>${local_dir_to_jar}/CustomAuxService.jar</value>
</property>
<!--
<property>
<name>yarn.nodemanager.aux-services.CustomAuxService.remote-classpath</name>
<value>${remote-dir_to_jar}/CustomAuxService.jar</value>
</property>
-->
<property>
<name>yarn.nodemanager.aux-services.CustomAuxService.class</name>
<value>org.aux.CustomAuxService</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
컨테이너 로그가 너무 커지는 것 방지 (Prevent Container Logs From Getting Too Big)
이 기능은 클러스터 관리자가 어떤 컨테이너 로그가 설정된 크기를 초과하면 해당 태스크 시도를 중단(kill)하도록 클러스터를 구성할 수 있게 해줍니다. 이는 로그가 디스크를 가득 채우는 것을 막고 방대한 로그를 집계할 필요도 없게 해줍니다.
Configuration
컨테이너 로그 디렉터리 크기를 구성하는 데 사용할 수 있는 매개변수는 다음과 같습니다.
| Configuration Name | Allowed Values | Description | | yarn.nodemanager.container-log-monitor.enable | true, false | 컨테이너 로그 디렉터리 크기 제한을 강제하는 컨테이너 로그 모니터를 활성화하는 플래그. 기본값은 false입니다. | yarn.nodemanager.container-log-monitor.interval-ms | Positive integer | 컨테이너의 로그 디렉터리 사용량을 확인하는 주기(밀리초). 기본값은 60000ms입니다. | yarn.nodemanager.container-log-monitor.dir-size-limit-bytes | Long | 단일 컨테이너 로그 디렉터리에 대한 디스크 공간 제한(바이트). 기본값은 1000000000입니다. | yarn.nodemanager.container-log-monitor.total-size-limit-bytes | Long | 컨테이너의 모든 로그에 대한 디스크 공간 제한(바이트). 기본값은 10000000000입니다.
CPU 사용률에 따른 Heart-beat 간격 확장 (Scale Heart-beat Interval Based on CPU Utilization)
이 기능은 클러스터 관리자가 Resource Manager와 각 NodeManager 사이의 heartbeat가, 노드의 CPU 사용률과 전체 클러스터 CPU 사용률을 비교하여 확장되도록 구성할 수 있게 해줍니다.
Configuration
heartbeat 간격과 그것이 확장되는지/어떻게 확장되는지 구성하는 데 사용할 수 있는 매개변수는 다음과 같습니다.
| Configuration Name | Allowed Values | Description | | yarn.resourcemanager.nodemanagers.heartbeat-interval-ms | Long | 클러스터의 모든 NodeManager에 대한 기본 heartbeat 간격(밀리초). 기본값은 1000ms입니다. | yarn.resourcemanager.nodemanagers.heartbeat-interval-scaling-enable | true, false | heartbeat 간격 확장을 활성화합니다. true이면 NodeManager heartbeat 간격이 노드의 CPU 사용률과 클러스터 전체 평균 CPU 사용률 사이의 차이에 따라 확장됩니다. 기본값은 false입니다. | yarn.resourcemanager.nodemanagers.heartbeat-interval-min-ms | Positive Long | heartbeat 간격 확장이 활성화된 경우 최소 heartbeat 간격(밀리초). 기본값은 1000ms입니다. | yarn.resourcemanager.nodemanagers.heartbeat-interval-max-ms | Positive Long | heartbeat 간격 확장이 활성화된 경우 최대 heartbeat 간격(밀리초). 기본값은 1000ms입니다. | yarn.resourcemanager.nodemanagers.heartbeat-interval-speedup-factor | Positive Float | heartbeat 간격 확장이 활성화된 경우 heartbeat 간격을 빠르게 할 때의 조정 정도를 제어합니다. 1.0에서 클러스터 전체 평균 CPU 사용률보다 20% 적으면 heartbeat 간격이 20% 감소합니다. 기본값은 1.0입니다. | yarn.resourcemanager.nodemanagers.heartbeat-interval-slowdown-factor | Positive Float | heartbeat 간격 확장이 활성화된 경우 heartbeat 간격을 느리게 할 때의 조정 정도를 제어합니다. 1.0에서 클러스터 전체 평균 CPU 사용률보다 20% 많으면 heartbeat 간격이 20% 증가합니다. 기본값은 1.0입니다.
더 알아보기 (Learn more)
- 원문: 문서