최근 포토로그


Spark architecture (Spark 2.x) Spark

Spark는 in-memory기반의 모델로 RDD라는 읽기전용 메모리 블럭을 사용하여 기존 Hadoop Mapreduce보다 월등히 향상된 속도를 자랑하며, 장애처리 또한 기존에 복구로직(장애발생 시점 파일에 쓰고, 다시 로드하는 처리) 이 아니라, 처음부터 다시 수행한다. 기본적으로 Spark는 lazy-execution방식으로 동작한다.

Spark에서는 클러스터를 구동하는 방식이 stand-alone 모드, Yarn 모드, mesos모드를 지원한다. stand-alone모드는 Spark에서 제공해주는 master, slave설정을 통해 구동하는 방식이며, Yarn과 mesos는 Yarn, mesos에서 클러스터를 구동한다.
따라서 Yarn 클러스터를 사용할 시, Spark 로 개발된 app가 Hadoop Yarn의 RM(Resource Manager) 을 통해 스케줄링 되며, 분산 처리를 수행한다.


Spark app은 app을 수행할 시, driver와 executor로 동작한다. 따라서 memory, core와 같은 설정값도 개별적으로 등록해야 한다.

쉽게 이해하자면, 로직상 driver 는 executor 외의 부분이며, executor는 실제 분산처리를 위한 map / reduce를 수행한다고 생각하면 된다.



이미지 출처 : http://www.slideshare.net/FerranGalReniu/yarn-by-default-spark-on-yarn






또한, Spark app을 Yarn을 통해 수행할 시 yarn-client, yarn-cluster 의 2가지 모드가 있다.

  1. yarn-client  는 driver 가 AM 외부 클라이언트로 수행하는 것 (AM, dirver, executor)
  2. yarn-cluster 는 AM 내부에서 driver 가 수행하는 것(AM, executor)

따라서, Spark을 Yarn 위에서 동작하기 위한 Configuration 작업이 프로그래밍 그 이상으로 난해했다.



중요한 Spark Configuration Properties에 대해서는 아래와 같다.

  • spark.master : 클러스터 마스터를 지정 (Yarn 모드에서는 yarn-client or yarn-cluster,  stand-alone 모드에서는 spark://...., mesos 모드에서는 mesos://...)
  • spark.driver.cores : Driver 프로세스에서 사용하는 코어수로 클러스터 모드에서만 사용 (default: 1)
  • spark.driver.maxResultSize : 개별 Spark Action 관련함수(show, collect..)에 대한 모든 파티션의 직렬화된 결과의 총 크기 제한 (default: 1G)
  • spark.driver.memory : SparkContext가 초기화 되는 Driver 프로세스에서 사용하는 메모리 (default : 1G)
  • spark.executor.cores : Executor 프로세스에서 사용되는 코어수. (default : Yarn 모드에서는 1, stand-alone과 mesos에서는 이용가능한 모든 코어 수)
  • spark.executor.memory : Executor 당 사용하는 메모리 (default: 1G)

spark.executor.cores 를 제외한 properteis는 app 수행시 필요한 속성값이며, spark.executor.cores 는 실행 시 적용된다.

Spark에서 제공하는 Dynamic Allocation를 통해 spark.executor.cores 속성값을 동적으로 핸들링 할 수 있기 때문에 실행 후 executor 의 core 수가 결정된다.


자세한 Spark Configuration Properties는 아래의 주소를 참고하자.

-> http://spark.apache.org/docs/latest/configuration.html



Spark를 Yarn모드로 동작할 시 추가로 설정해야 하는 Properties가 있다.

Driver가 AM(Application Master) 내부가 아닌 개별 클라이언트로 수행하는 'yarn-client' 경우에는 'spark.yarn.am.xxxxx' 설정값을 확인해야 한다.

  • spark.yarn.am.memory : yarn-client로 수행시 AM(Application Master) 가 사용하는 메모리 (default : 512m)
  • spark.yarn.am.cores : yarn-client로 수행시 AM(Application Master) 가 사용하는 코어수 (default : 1)
  • spark.executor.instances : Executor의 수로 Dynamic Allocation 를 활용할 시 동적으로 늘어날 수 있다.(default : 2)
  • spark.yarn.executor.memoryOverhead : Executor당 할당할 off-heap memory의 양 (default: executorMemory * 0.10, with minimum of 384)
  • spark.yarn.driver.memoryOverhead : Driver당 할당할 off-heap memory의 양 (default: driverMemory * 0.10, with minimum of 384)
  • spark.yarn.am.memoryOverhead : yarn-client로 수행시 AM(Application Master) 할당할 off-heap memory의 양 (default: AM memory * 0.10, with minimum of 384)
  • spark.yarn.jars : Yarn Container에 배포할 Spark코드가 포함된 라이브러리로 일반적으로는 로컬의 jar를 사용하지만, HDFS에 위치시키면 Yarn에서 캐싱되어 app 실행시 배포할 필요가 없다. 따라서 HDFS에 올리는 것이 좋다.

* off-heap memory 는 In-Memory 아키텍처에서 나오는 용어로, http://d2.naver.com/helloworld/106824 를 참고하기 바란다.


자세한 Spark on Yarn Configuration Properties는 아래의 주소를 참고하자.

-> http://spark.apache.org/docs/latest/running-on-yarn.html,



* Hadoop측 AM 관련 yarn configuration
  • yarn.app.mapreduce.am.resource.mb : 'spark.yarn.am.memory' 와 같은 의미. 지정하지 않을 시 Hadoop mapred-site.xml설정에 있는 1536m으로 설정 (default: 1536)
  • yarn.app.mapreduce.am.resource.cpu-vcores : 'spark.yarn.am.cores' 와 같은 의미. 지정하지 않을 시 Hadoop mapred-site.xml설정에 있는 1로 설정 (default: 1)
  • yarn.app.mapreduce.am.command-opts : AM(Application Master) 를 위한 자바 옵션 (default: -Xmx1024m)

* 예제 시나리오 (yarn-client)
spark.yarn.am.memory : 2g
spark.executor.instances : 4
spark.executor.cores : 5
spark.driver.memory : 3g
spark.executor.memory 7g

-- 일부러 dynamicAllocation을 지정하였다.
spark.dynamicAllocation.enable : true
spark.shuffle.service.enabled : true
spark.dynamicAllocation.minExecutors : 3
spark.dynamicAllocation.maxExecutors : 6



1. Hadoop Web UI창을 열어보면 아래와 같이 app 이 수행된다 (defaultxxx.xxx.xxx.xxx:8088)
ID는 SparkContext가 초기화 되면 생성해주는 값이고, Name은 spark.app.name 속성의 값이다.




2. 위 그림에서 ID를 클릭하면 아래와 같은 app 정보를 볼 수 있다. 기본적으로 Hadoop에서 app를 수행하면 fail시에 재시도를 수행한다.
아래는 한번시도로 AM(ApplicationMaster)가 수행된다는 것이다.




3. 위 그림에서 Attempt ID를 클릭하면 Yarn 의 Container들에게 AM(ApplicationMaster) 과 Spark의 Executor들이 할당된 리스트가 나온다.
AM(ApplicationMaster)도 Container에 할당됨을 유의해야 한다.
상단에 AM Containser 가 AM(ApplicationMaster) 가 할당된 Container이다.
spark.executor.instances 값이 4이므로 AM+executor = 5를 최초 할당한다.
하지만 dynamicAllocation 을 적용하였기 때문에 minExecutors 값인 3이 적용되어 1+3인 4가 된다.
spark.executor.instances 값을 지정할 시에는 minExecutors값보다 크게 설정하면 이렇게 문제의 여지가 생긴다.
차라리 minExecutors값을 지정하지 않고 app수행시 spark.executor.instances를 지정하는게 안전하다.
차후에 maxExecutors 수 만큼 늘어날 수 있다. 따라서 Total Allocated Containers : 7 이 나온다(AM+maxExecutors)




4. AM(ApplicationMaster) 가 할당된 Container를 클릭하면 아래 그림이 나온다.
spark.yarn.am.memory를 2g 로 설정해도 3g 을 할당하였다.
그 이유는, yarn.scheduler.minimum-allocation-mb 설정이 1024이기 때문이다.
RM(ResourceManager) 는 위의 설정값에 따라 Container 크기를 증가시킨다.




5. 3번 그림에서 AM(ApplicationMaster) 가 아닌 Spark executor 로 쓰이는 Container를 클릭하면 아래 그림이 나온다.
spark.executor.memory를 7g 로 설정해도 8g 을 할당하였다.
그 이유는, yarn.scheduler.minimum-allocation-mb 설정이 1024이기 때문이다.
RM(ResourceManager) 는 위의 설정값에 따라 Container 크기를 증가시킨다.




6. 1번 그림에서 Tracking UI인 ApplicationMaster를 클릭하면 아래 그림이 나온다.
Spark Web UI로 여기에서 디버깅 및 stage 등등의 정보를 확인하면 된다.
병렬처리 및 파티셔닝, 실시간 처리 등 모든 정보를 확인할 수 있다.





7. executors탭에 현재 app이 수행되는 driver / executor 에 대한 정보를 확인할 수 있다.
dynamicAllocation의 minExecutors에 의해 executor ID 4번이 dead된 것을 볼 수 있다. dynamicAllocation은 자원을 재활용 및 동적으로 할당
받는다.
executors 에 Cores 에는 spark.executor.cores 값인 5가 세팅되었다.
spark.driver.memory 와 spark.executor.memory는 Storage Memory 에 표기된다.
하지만 3g, 7g가 정확하게 할당되지 않는다
그 이유에 대한 설명은 http://tobby48.egloos.com/4411869 를 참고하기 바란다.



덧글

  • Len 2019/06/24 10:33 # 삭제 답글

    좋은글 감사합니다.
댓글 입력 영역