YARN 아키텍처_NodeManager
by Jaesang Lim
NodeManger의 핵심 기능
1. 컨테이너 시작
- 컨테이너 시작을 가능하게 하기 위해서 NM은 컨테이너 명세의 일부로서 컨테이너의 실행시간에 대한 자세한 정보를 수신하기를 기대
-
이 정보는 컨테이너의 커맨드 라인 명령, 환경 변수, 컨테이너가 필요로 하는 (파일) 리소스들의 목록과 보안 토큰을 포함
- 컨테이너시작 요청을 받게 되었을 때 보안이 활성화 되어 있다면, NM은 먼저 사용자, 올바른 자원 할당 등을 검증
-
그 후 NM은 컨테이너를 시작하기 위해서 다음의 단계를 수행한다.
- 명세된 모든 자원들의 로컬 복사본을 생성(DistributedCache).
- 컨테이너가 사용하기 위해 생성한 워킹 디렉터리를 분리하고, 로컬 자원들을 이 디렉터리에서 사용가능한 상태로 생성
- 실제의 컨테이너를 시작하기 위해서 실행 환경과 커맨드 라인을 사용
2. 로그 취합
- NM은 응용프로그램이 완료된 후 로그들을 안전하게 HDFS등의 파일 시스템으로 옮길 수 있는 옵션을 제공
- 단일 응용프로그램에 속하고 이 NM에서 실행한 모든 컨테이너들의 로그들은 취합되어 파일 시스템의 지정된 위치에 단일 로그 파일
- 가능하다면 압축된 상태로 저장
- 사용자들은 이 로그들을 YARN 커맨드 라인 툴, 웹UI 또는 FS에서 직접 접근
yarn logs -applicationId <applicationId>
3. 맵리듀스 셔플 보조
- 맵리듀스 응용프로그램을 실행하기 위해서 필요한 셔플 기능은 보조서비스로 구현
- 이 서비스는 Netty 웹 서버를 시작하고 리듀스 태스크의 구체적인 MR 셔플 요청을 어떻게 처리해야 하는지 알고 있음
- MR ApplicaionMaster는 필요할 수 있는 보안 토큰과 함께 셔플 서비스를 위한 서비스 id 를 특정
- NM은 리듀스 태스크로 전달하는 셔플 서비스가 관계되는 Port와 함께 ApplicaionMaster를 제공한다.
YARN NodeManager 아키텍처
1. NodeStatusUpdater
- 시작할 때, RM에 등록을 수행하고, 노드에 사용 가능한 자원들의 정보를 송신
- NM-RM 통신은 노드에서 동작 중인 새 컨테이너, 완료된 컨테이너 등의 컨테이너 상태에 대한 업데이트를 제공
- RM은 이미 동작중인 컨테이너를 종료하기 위해서 NodeStatusUpdater에게 신호를 줄 수 있음
2. ContainerManager
- ContainerManager는 NM의 핵심으로 노드에서 동작 중인 컨테이너를 관리하기 위한 기능 제공
1) RPC server
- AM로부터 새로운 컨테이너를 시작하거나 동작중인 컨테이너를 정지시키는 요청을 받는 역할
- ContainerManager는 ContainerTokenSecretManager, NMTokenSecretManager를 이용하여 모든 요청을 승인, 인증
- 이 노드에서 수행중인 컨테이너에 대한 모든 연산은 보안 도구에 의해 후처리될 수 있는 로그에 기록
2) ResourceLocalizationService
- 컨테이너가 필요한 다양한 파일 리소스를 안전하게 다운로드하고 관리와 접근 제어 제한 적용
- 지역화
LocalFileSystem에 원격지 자원을 복사하고 다운로딩하는 과정
- 로컬리소스
컨테이너 실행에 필요한 파일/라이브러리 나타냄
- 삭제서비스
명령이 발생할 때 NM의 내부에서 실행되고 local 경로를 삭제를 위한 서비스
- 로컬라이저 ( Localizer)
지역화를 실행하는 프로세스 또는 thread PUBLIC(PublicLocalizer),PRIVATE, APPLICATION(ContainerLocalizer) 이 있음
- 로컬캐시 (LocalCache)
- 지역화
3) ContainersLauncher
- 컨테이너를 가능한 빠르게 준비하고 시작하기 위해서 스레드 풀을 유지
- RM이나 AM에서 보내진 요청이 있다면 컨테이너의 프로세스들을 정리한다.
4) AuxServices
- NM는 보조서비스들을 설정하여 NM의 기능을 확장하기 위한 프레임워크를 제공
- 특정한 프레임워크들이 필요로 하는 노드 별 커스텀 서비스 사용을 허가하면서도 여전히 NM의 다른 부분으로부터 분리
- 이러한 서비스들은 NM이 시작되기전에 설정
- 예비 서비스들은 노드에서 응용프로그램의 첫번째 컨테이너가 시작되었을때와 응용프로그램이 완료되었다고 여겨질 때 통보
5) ContainerMonitor
- 컨테이너가 시작된 후 이 구성요소는 컨테이너가 실행되는 동안의 자원 사용 관찰
- 메모리같은 자원의 공평한 공유와 격리를 강제하기 위해서 각 컨테이너는 RM에 의해서 자원들의 일부를 할당
- ContainerMonitor는 각 컨테이너의 사용을 지속적으로 모니터링
- 컨테이너가 할당을 넘어선다면, 컨테이너를 종료시키기 위해 신호를 보냄
- 이 것은 탈주자 컨테이너가 동일한 노드에서 실행중인 다른 정상 동작하는 컨테이너들에게 영향을 주는 것을 막는다.
6) LogHandler
- 컨테이너의 로그들을 로컬 디스크에 유지하거나 압축하여 파일 시스템에 업로드할 수 있는 플로그인 기능
3. ContainerExecutor
- 컨테이너가 필요로 하는 파일들과 디렉터리들을 안전하게 배치
- 컨테이너에 상응하는 프로세스들을 시작하거나 정리하기 위해서 운영체제와 상호작용한다.
4. NodeHealthCheckerService
- 미리 구성된 스크립트를 주기적으로 실행하여 노드의 상태를 점검하는 기능을 제공
- 디스크에 가끔 임시파일을 생성하여 디스크의 상태를 모니터링
- 시스템의 모든 상태 변경은 정보를 차례차례 RM으로 전송하는 NodeStatusUpdater로 보고된다.
5. Security
1) ApplicationACLsManager
- NM은 허가된 사용자만 접근해야 하는 ‘웹UI의 컨테이너 로그’같은 사용자 API 선별
- 각 application 마다 ACL을 관리하며 요청을 받았을 때 ACL 적용
2) ContainerTokenSecretManager
- 수신된 다양한 요청을 확인해 시작 컨테이너의 모든 요청이 RM에게 제대로 승인됐음을 보장
6. WebServer
- 응용프로그램, 주어진 시점에서 실행 중인 컨테이너들, 노드 상태에 관련된 정보들
- 컨테이너에 의해서 생성된 로그들의 목록을 보여줌
Subscribe via RSS