spark 를 yarn 위에서 실행하다가 자원 관련 문제를 맞닥뜨려서 yarn 메모리 관리하는 방법에 대해 공부하기로 함.

공부하고 있는 내용을 적은 거라서, 틀린 내용이 있을 수 있습니다.

 

 

yarn 은 다양한 app 이 구동될 때 자원을 제공한다.

자원은 container 라는 단위로 제공된다.

container 는 cpu 와 memory 로 구성이 되어있다.

 

예를 들어 saprk에서 wordcount app 을 실행시킨다고 하자.

이 app 이 1.5gb 의 memory 와 2개의 코어가 필요하다고 yarn 에게 알려주면,

yarn 은 2gb 의 memory와 2개의 코어를 갖는 container 를 만들어서 제공한다.

그러면 app 은 해당 container 를 받고 그 위에서 일을 한다.

(일이 마무리 된 후 container(자원)는 yarn 에게 돌려줌)

 

 

yarn 이 container 로 만들 수 있는 total memory  는

(yarn.nodemanager.resource.memory-mb) * (num of node managers) 

만큼이라고 한다.

아래서 설명할 yarn.nodemanager.resource.memory-mb 값이랑 노드 매니저의 개수를 곱하면 total memory 가 나온다.

 

 

 

yarn 관련 모니터링을 위한 webUI 가 있다.

[ip address]:8088 로 접속하여 볼 수 있다.

 

 

 

여기 그림이 배경 지식을 이해하기에 굉장히 잘 나와있어서 참고한다.

아래 접은 글을 열면 해당 설명을 볼 수 있다.

더보기

하나의 서버가 갖고 있는 자원을 위의 그림처럼 나타낼 수 있다.
memory 와 virtual cpu 코어.

어떤 app 이 자원을 요청하면 그 요청한 자원 만큼 container 를 만들어서 제공해주고
그것을 위와 같이 표현할 수 있다.

 

어떤 app은 memory 를 많이 요청할 수 있다.

어떤 app 은 core 를 많이 요청할 수 있다.

 

yarn 의 resource manager 는 서버의 한정된 자원을 최대한 효율적으로
container 로 만들어 제공하려고 노력한다.

 

yarn 으로부터 자원 container 를 할당받은 app(여기서는 MapReduce tasks)들은
해당 container 내의 자원을 모두 사용한다.

서버의 자원을 남김없이 모두 사용하여 container 로 만들어 app 에 제공하는 것이
가장 효율적으로 yarn 을 사용하는 방법이 된다.
따라서 내 컴퓨터의 환경을 토대로 memory 와 vcores 를 조절하여 튜닝하면 성능이 올라간다. 

 

 

 

 

 

 

 

yarn 을 설정할 때는 yarn-site.xml 을 살펴보면 된다.

yarn-site.xml 내부 옵션 값들을 직접 지정해줄 수 있는데 설명은 다음과 같다.

참고로 master node 뿐 아니라 worker node 의 옵션들도 바꿀 수 있다.

 

 

memory 관련 옵션

 

< yarn.nodemanager.resource.memory-mb >

 

이 옵션은 각 노드 매니저가 컨테이너 할당에 사용할 메모리 크기를 나타낸다.

서버마다 yarn 에서 관리하고 있는 노드 매니저가 하나씩 있는데(서버 당 하나씩 총 20개),

이 노드 매니저가 container 를 만들 때 사용할 수 있는 메모리 크기를 말한다.

예를 들어, 위의 값이 20gb 라면,

1gb 짜리 container 를 20개 만들 수 있고,

5gb 짜리 container 4개를 만들 수 있다.

 

우리의 가정에서는 하나의 서버에 128gb 메모리가 있으므로

yarn.nodemanager.resource.memory-mb 값을 128gb 로 잡아두면

하나의 서버가 갖는 모든 메모리를 yarn 이 사용하게 한다는 의미가 된다.

 

하지만 그렇게 하지 않는데, 이유는 서버가 yarn 말고 돌려야 할 다른 소프트웨어들이 많기 때문이다.

예를 들면 서버 os.

따라서 하나의 서버의 전체 메모리 크기에서 적정 양만큼 제외한 값을 container 만드는 데 사용할 수 있도록

yarn.nodemanager.resource.memory-mb 값을 지정한다.

예를 들어 서버 하나의 크기가 128gb 니까, 8gb 는 os가 돌아갈 메모리로 남겨두고 남은 120gb 를

yarn.nodemanager.resource.memory-mb 값으로 지정하는 것이다.

 

yarn.nodemanager.resource.memory-mb의 default 값은 8gb이다.

 

 

< yarn.scheduler.maximum-allocation-mb >

 

이 옵션은 container 에 할당할 수 있는 최대 memory 크기를 의미한다.

기본값은 8gb 이다.

기본값 8gb 가 적용되었다는 상황을 가정해보자.

예를 들어 spark 에서 어떤 app 을 구동시키는 데 6gb memory 가 필요하다면,

8gb 보다 작기 때문에 6gb 만큼 container 를 만들어서 app 에 제공할 수 있다.

만약 app 을 구동시키는 데 10gb memory 가 필요하다면,

8gb 보다 크기 때문에 container 를 만들어서 제공할 수 없어 에러를 내보낸다.

 

 

< yarn.scheduler.minimum-allocation-mb >

 

이 옵션은 container 에 할당하는 memory 의 단위를 의미한다.

기본값은 1gb 이다.

기본값 1gb 가 적용되었다는 상황을 가정해보자.

예를 들어 spark 에서 어떤 app 을 구동시키는 데 800mb memory 가 필요하다면,

1gb container 를 만들어서 app 에 제공한다.

왜냐하면 1gb 가 memory 를 제공하는 단위이기 때문이다.

만약 app 을 구동시키는 데 1.9gb memory 가 필요하다면,

2gb container 를 만들어서 app 에 제공한다.

만약 app 을 구동시키는 데 2.1gb memory 가 필요하다면,

3gb container 를 만들어서 app 에 제공한다.

 

 

 

 

 

cpu(코어) 관련 옵션

 

< yarn.nodemanager.resource.cpu-vcores >

 

이 옵션은 각 노드 매니저가 컨테이너 할당에 사용할 cpu 코어 개수를 의미한다.

노드 매니저가 container 를 만들 때 사용할 수 있는 코어 개수를 말한다.

예를 들어 코어 개수가 20개라면,

1코어짜리 container 20개를 만들 수 있고,

2코어짜리 container 10개를 만들 수 있겠다.

 

기본 값은 8이다.

 

 

 

yarn.scheduler.maximum-allocation-vcores >

 

이 옵션은 container 에 할당할 수 있는 최대 viertual cpu 코어 수를 의미한다.

maximum 코어 수가 10이라는 상황을 가정해보자.

예를 들어 spark 에서 어떤 app 을 구동시키는 데 5개 코어가 필요하다면,

10개 보다 작기 때문에 5개 코어 만큼 container 를 만들어서 app 에 제공할 수 있다.

만약 app 을 구동시키는 데 12개 코어가 필요하다면,
10개 보다 크기 때문에 container 를 만들어서 제공할 수 없어 에러를 내보낸다.

 

 

 

yarn.scheduler.minimum-allocation-vcores >


이 옵션은 container 에 할당하는 virtual cpu 코어의 단위를 의미한다.
minimum 코어 수가 3이라는 상황을 가정해보자.

예를 들어 spark 에서 어떤 app 을 구동시키는 데 1개의 코어가 필요하다면,
3개 코어 만큼의 container 를 만들어서 app 에 제공한다.
왜냐하면 3개가 cpu 를 제공하는 단위이기 때문이다.

만약 app 을 구동시키는 데 4개 코어가 필요하다면,
6개 코어 만큼의 container 를 만들어서 app 에 제공한다.

 

 

 

여기선 옵션의 의미만 설명하고,

실질적인 튜닝 방법은 다음에 적겠음.

 

 

 

 

 

 

 

 

위에서 설명한 옵션들을 모아둔 리스트

설명도 영어로 되어있음.

https://hadoop.apache.org/docs/r3.1.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

 

 

 

 

참고 

 

https://m.blog.naver.com/gyrbsdl18/220594197752

 

https://docs.cloudera.com/documentation/enterprise/5-5-x/topics/cdh_ig_yarn_tuning.html

 

컨테이너 개수 계산 : https://blrunner.tistory.com/103

 

https://wikidocs.net/27332

 

https://stackoverflow.com/questions/29940711/apache-spark-setting-executor-instances-does-not-change-the-executors

 

https://community.cloudera.com/t5/Support-Questions/from-where-we-get-the-Yarn-memory-value-from-the-dashboard/td-p/228709

 

+ Recent posts