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 에 제공할 수 있다.
< yarn.scheduler.minimum-allocation-vcores >
|
여기선 옵션의 의미만 설명하고,
실질적인 튜닝 방법은 다음에 적겠음.
위에서 설명한 옵션들을 모아둔 리스트
설명도 영어로 되어있음.
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
'Hadoop' 카테고리의 다른 글
[HDFS] S3와 HDFS 차이점 (0) | 2020.02.04 |
---|---|
[Hadoop] EMR 에서 yarn-site.xml 위치 (0) | 2020.01.20 |
[HDFS] 연결된 node 보는 명령어 (0) | 2019.12.20 |
[Hadoop] Docker 로 Hadoop Cluster 설치하기 (0) | 2019.12.03 |
[HDFS] master:9000 failed on connection exception 에러 (0) | 2019.11.20 |