spark dynamic allocation 기능은 job 실행시 executor 개수를 지정하지 않고 적절한 개수의 executor가 실행되게 하는 기능이다. 하둡 클러스터의 가용 리소스 내에서 최대 성능을 낼 수 있으므로 가능한 사용하는 것이 좋다.
2. dynamic allocation 세팅
dynamic allocation 을 사용하기 위해서는 spark-submit 실행시 옵션 추가만으로 안 될 수도 있다. 하둡 클러스터에 필요한 세팅이 안되어 있으면 job 실행 후 executor가 뜨지 않고 진행율 0%가 계속 유지된다. 클러스터의 각 노드마다 세팅을 변경하고 node manager를 재시작 해주어야 한다.
환경: hadoop 2.5.1, spark 1.6.3(prebuilt for hadoop 2.4)
2-1. spark이 설치 된 곳에서 spark-xxx-yarn-shuffle.jar 파일을 찾아서 각 노드에 복사해준다.
hadoop-2.5.1/share/hadoop/yarn 이런 디렉토리에 복사해 놓으면 classpath로 지정되어 있어서 이 jar 파일을 읽을 수 있다.
2-2. 각 노드에서 yarn-site.xml 파일 편집
<property>
<name>yarn.nodemanager.aux-services</name>
<value>spark_shuffle,mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
위와 같이 편집한다.
2-3. 각 노드에서 node manager 재시작
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh start nodemanager
stop이 잘 안되면 kill -TERM <pid> 로 종료시키면 된다. 클러스터를 아무도 사용하지 않을 때라면 네임노드에서 전체 nodemanger를 한꺼번에 재시작 할 수도 있다. 공용 클러스터라서 중단없이 운영되기를 원한다면 한꺼번에 재시작 대신 반 정도로 나누어서 두번에 걸쳐 nodemanager를 재시작 해주면 될거다.
3. dynamic allocation 사용
spar-submit 에 --conf spark.shuffle.service.enabled=true --conf spark.dynamicAllocation.enabled=true 두 옵션을 추가하면 사용할 수 있다. 그 밖에 상세 옵션들도 필요하면 쓸 수 있고. 커맨드라인 옵션 대신 spark-defaults.conf 에 추가해서 사용할 수도 있다.
참고