보물창고/Big Data2014.07.25 22:00





Apache Spark Resource Management and YARN App Models

http://blog.cloudera.com/blog/2014/05/apache-spark-resource-management-and-yarn-app-models/

위 문서 내용을 공부하면서 발번역 하였습니다

흐름을 파악하는데 참고해 주세요


 Spark를 스터디하면서 Spark on YARN 모드 2종류를 이해하기가 가장 어려웠습니다. 영어가 부족한데다가 글로 설명된 내용을 보니 계속 미궁속으로 빠지고 있었습니다. 번역하면서 본 이 글은 저의 궁금증을 깔끔하게 해소시켜주는 핵심적인 글이고 저외에 다른 누군가도 이 글이 도움이 되었으면 하는 바람에 블로그에 올려 놓습니다





Apache Spark 리소스 매니지먼트와 YARN App 모델 (Apache Spark Resource Management and YARN App Models)

* YARN에서 MapReduce의 클러스터 리소스 관리와 Spark에대한 차이점을 간략히 봅니다
MapReduce 이후 가장 인기 있는 Apache YARN 응용프로그램은 Apache Spark입니다
클라우데라에서 Spark-on-YARN을 안정시키기 위해 많은 노력을 했습니다(SPARK-1101) 
SPARK-1101 : https://issues.apache.org/jira/browse/SPARK-1101

이 포스트에서, Spark와 MapReduce 아키택쳐의 차이점에대해 알아볼것입니다
당신이 관심있는, YARN 클러스터 ResourceManager에서 실행하는 방법을 설명합니다

* Applications
MapReduce 에서 computation에서 최고 단위는 job입니다
job의 동작은 데이터를 로드해서 map연산 후 shuffles를하고 reduce연산한 결과를 영구저장소에 데이터를 씁니다
Spark도 비슷한 개념의 작업이 있습니다 (job하나에 더 많은 map과 reduce단계를 구상할 수 있지만)
또한 여러 job을 순차 또는 병렬로 실행할 수 있는 "application"이라는 상위 레벨 구조를 가지고 있습니다



* Spark 어플리케이션 아키택쳐 (Spark application architecture)
Spark API에 익숙한 사람들을 위해, application은 SparkContext 클래스 인스턴스에 해당합니다
application은 하나의 배치작업을 위해 사용될 수 있습니다
여러 job과 상호작용하는 세션은 시간차이를 두거나, 오래 실행되는 서버가 지속적으로 적합 합니다
MapReduce와는 달리 application은 어떤 작업도 수행하지 않습니다
이 경우에 대리자로서 Executor라는 프로세스를 갖게 됩니다.
이 방법은 빠른 액세스를 위해 메모리에 데이터를 저장 할뿐만 아니라 초고속의 작업시간을 가집니다

* Executors
MapReduce는 자체 프로세스에서 각 job을 실행합니다. job이 완료되면 프로세스가 사라집니다
Spark는 많은 job을 단일 프로세스에서 동시에 실행할 수 있으며 이 과정에 job이 실행되고 있지 않은 경우에도 Spark application의 lifetime동안 실행됩니다

이 모델의 장점은 위에 적은것과 같이,
속도 : 작업이 매우 빨리 시작되고 프로세스 메모리 내에 데이터가 있습니다
단점은 분할된 자원관리입니다
application에 대한 Executor의 수는 고정되어있고 Executor에 대한 자원이 고정되어있기 때문에 Application이 실행중인 전체 시간 동안에는 같은 자원을 사용합니다
YARN이 지원하는 컨테이너 resizing을 이용해 동적으로 자원을 주고 받는 기능을 Spark에 활용할 계획입니다

* Active Driver
job흐름과 스케줄 작업을 관리하기위해 Spark는 active driver 프로세스에 의존합니다
YARN모드일때 클러스터에서 driver를 실행할 수 있지만
일반적으로 driver 프로세스는 job을 시작하는데 사용되는 클라이언트 프로세스와 동일합니다
반면 MapReduce에서 클라이언트 프로세스가 오래 동작할때 job이 계속 실핼될 수 있습니다
jobTracker는 hadoop1.x에서 작업 일정에대한 책임이 있었고 hadoop2.x에서는 MapReduce 어플리케이션의 master역할을 맡았습니다

* 플러그 자원 관리 (Pluggable Resource Management)
Spark 형플러그 형식으로 클러스터 관리를 지원합니다
클러스터 관리자는 실 행프로그램 프로세스를 시작 하기위한 책임이 있습니다
Spark applecation 작성자는 Spark가 어떤 클러스터 관리자에서 실행되고 있는지 걱정할 필요가 없습니다

Spark를 지원하는 클러스터 종류에는 YARN과 Mesos, 그리고 고유한 "standalone"이 있습니다
이러한 세가지 프레임워크는 두종류의 구성요소로 되어 있습니다
중앙 master 서비스는 application이 프로세스를 실행하기 위해 (YARN ResourceManager, Mesos Master, Spark 독립 master) 자원을 얻는것을 결정합니다
뿐만 아니라 어딘가에서 실행이 결정되면
모든 노드에서 실행되는 slave서비스는 실제 executor 프로세스를 실행합니다(YARN NodeManager, Mesos slave, Spark 독립 slave)
또한 자신의 동작내용과 자원 상황 을모니터링 할 수 있습니다

* YARN에서 실행하는 이유? (Why Run on YARN?)
Spark의 클러스터 manager로 YARN을 사용하면 Spark 독립모드와 Mesos를 이용하면 몇가지 장점이 있습니다
  • YARN을 사용하면 자원을 동적으로 공유하고 중앙 YARN에서 실행되는 모든 프레임 워크 사이의 클러스터자원을 동일한 풀에서 구성할 수 있습니다
    그런 다음 구성변경 없이 Impala 쿼리 및 Spark application의 일부를 MapReduce전체 클러스터에서 실행 할 수 있습니다
  • YARN 스케줄러의 categorizing(카테고리화), isolating(분리), 과 prioritizing wprkload(워크로드 우선순위)의 모든 기능을 활용할 수 있습니다
    YARN 스케줄러의 모든 기능 : http://hadoop.apache.org/docs/r2.4.0/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
  • Spark 독립형 모드에서는 모 든클러스터 모드에서 각 application이 실행되는 반면 YARN에서는 사용할 executor의 수를 선택합니다
  • YARN은 Spark 보안을 지원하는 유일한 클러스터 관리 자입니다
    실제로 프로세스간 보안인증을 사용하는 Kerberos 암호화를 hadoop cluster에 서실행할  수있습니다
* YARN에서 실행하기 (Running on YARN)
Spark on YARN을 실행하는 경우 Spark executor은 YARN 컨테이너로 실행됩니다
MapReduce 스케줄러가 하나의 컨테이너에서 각 task에대한 JVM을 실행 할 때 Spark는 같은 컨테이너 안에서 여러 task를 호스트 합니다
규모가 있는 명령의 task를 빠르게 실행할 수 있는 방법 입니다

Spark는 YARN의 "yarn-cluster" mode와 "yarn-client"mode두가지를 지원합니다
대체로 yarn-cluster mode는  production jobs에 일때 의미가 있습니다
yarn-client mode는 application 출력(번역중-stdout?)을 참조하거나 대화형 디버깅을 할때 일때 의미가 있습니다

차이를 이해 할때 YARN의 Master응용프로그램 개념의 이해가 필요합니다
YARN에서 각 application 인스턴스는 첫번째 컨테이너가 Application Master 프로세스를 담당하고 해당 application을 실행합니다
application은 ResourceManager에서 리소스 할당을 요청하할 책임이 있으며 대신할 컨테이너를 start하도록 NodeManager에게 이야기 합니다
Application Master는 Active client에대한 요구를 사전에 없앱니다
application을 시작하는 과정은 멀어졌(번역중-추상화?)고 클러스터 관리는 YARN의 실행으로 계속 관리됩니다

yarn-cluster mode에서 dirver는 Application Master에서 실행됩니다
동일한 프로세스에서(YARN container) YARN에 리소스를 요청하는것과 YARN컨테이너 내부에서 프로세스를 실행하는 application을 모두 구동하는것에 책임이 있습니다
application을 start하는 클라이언트는 전체 lifetime시간동안 있어야할 필요가 없습니다

이미지 : yarn-cluster mode


yarn-cluster mode는 대화식 Spark사용에는 적합하지 않습니다
Spark shell과 PySpark처럼 사용자 입력을 요청하는 Spark application은 Spark application을 start하는 클라이언트 프로세스 내에서 실행하는 Spark dirver가 필요합니다
yarn-client mode에서 Application Master는 단지 YARN에서 executor 컨테이너를 요청하는 존재입니다
클라이언트가 시작한 후 작업을 스케줄링하는 컨테이너와 통신합니다

이미지 : yarn-client mode


아래 테이블은 각 모드 사이의 차이를 간결하게 나타냈습니다


* 주요개념 요약 (Key Concepts in Summary)
  • Application : 이것은 하나의 job이 될 수도 있으며 작업의 순서와 필요에 따라 새 명령을 실행하는  long-running 서비스 또는 대화형 탐색 세션 입니다
  • Spark Driver : Spark context를 실행하는 프로세스 입니다. 이는 application 세션을 나타냅니다. 
  • Spark Application Master : YARN driver에의해 자원 요청을 협상하고 host/containers Spark application을 실행하는데에 적절한 설정을 찾는데 책임을 지지 않습니다 application당 하나의 application master가 있습니다
  • Spark Executor : 하나의 Spark application은 노드에서 하나의 JVM 인스턴스를 제공합니다. executor은 lifetime동안 많은 job을 동시에 수행합니다. 노드는 많은 Spark실행자를 가질수 있으며, 각 클라이언트 application에 대한 Spark Executor를 실행하 많은 노드가 있습니다
  • Spark Task : Spark Task는 분산된 데이터 집합의 파티션 작업 단위를 나타냅니다

Further reading:

Sandy Ryza is a data scientist at Cloudera, and an Apache Hadoop committer.


신고





Posted by 파란물