[yarn] Memory

rerun.life·2021년 8월 9일
0

yarn은 다양한 app 이 구동될 때 자원을 제공하고,
자원은 container 라는 단위로 제공된다.
container는 cpu와 memory로 구성이 되어있다.

예를 들어 spark에서 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 로 접속하여 볼 수 있다.

여기 그림이 배경 지식을 이해하기에 굉장히 잘 나와있어서 참고한다.
https://docs.cloudera.com/documentation/enterprise/5-5-x/topics/cdh_ig_yarn_tuning.html

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

profile
신나는인생

0개의 댓글