Amazon EMR에서 Spark의 "no space left on device" 단계 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 1월 8일

Apache Spark 애플리케이션을 Amazon EMR 클러스터에 제출했습니다. 다음과 같이 "no space left on device" 단계 오류와 함께 애플리케이션이 실패합니다.

Job aborted due to stage failure: Task 31 in stage 8.0 failed 4 times, most recent failure: Lost task 31.3 in stage 8.0 (TID 2036, ip-xxx-xxx-xx-xxx.compute.internal, executor 139): org.apache.spark.memory.SparkOutOfMemoryError: error while calling spill() on org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter@1a698b89 : No space left on device

간략한 설명

Spark는 코어 및 작업 노드의 로컬 디스크를 사용하여 중간 데이터를 저장합니다. 디스크의 공간이 부족하면 "no space left on device" 오류와 함께 작업이 실패합니다. 이 오류를 해결하려면 다음 방법 중 하나를 사용합니다.

  • Amazon EBS(Amazon Elastic Block Store) 용량을 더 추가합니다.
  • Spark 파티션을 더 추가합니다.
  • 부트스트랩 작업을 사용하여 코어 및 작업 노드의 스토리지를 동적으로 확장합니다. 자세한 내용과 권장되는 부트스트랩 작업 스크립트는 Dynamically scale up storage on Amazon EMR clusters를 참조하십시오.

해결 방법

EBS 용량 추가

새 클러스터의 경우: 더 큰 EBS 볼륨 사용

Amazon EMR 클러스터를 시작하고 더 큰 EBS 볼륨의 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스 유형을 선택합니다. 각 인스턴스 유형에 할당된 스토리지 양과 볼륨 수에 대한 자세한 내용은 인스턴스의 기본 EBS 스토리지를 참조하십시오.

실행 중인 클러스터의 경우: 더 많은 EBS 볼륨 추가

1.    더 큰 EBS 볼륨으로 문제가 해결되지 않으면 코어와 작업 노드에 더 많은 EBS 볼륨을 연결합니다.

2.    연결된 볼륨을 포맷하고 마운트합니다. 올바른 디스크 번호를 사용해야 합니다(예: /data가 아니라 /mnt1 또는 /mnt2).

3.    SSH를 사용하여 노드에 연결합니다.

4.    /mnt2/yarn 디렉터리를 생성한 다음 디렉터리의 소유권을 YARN 사용자로 설정합니다.

sudo mkdir /mnt2/yarn
chown yarn:yarn /mnt2/yarn

5.    /etc/hadoop/conf/yarn-site.xmlyarn.nodemanager.local-dirs 속성 내에 /mnt2/yarn 디렉터리를 추가합니다. 예:

<property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/mnt/yarn,/mnt1/yarn,/mnt2/yarn</value>
</property>

6.    NodeManager 서비스를 다시 시작합니다.

sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager

Spark 파티션 추가

클러스터에 있는 코어 및 작업 노드의 수에 따라 Spark 파티션의 수를 늘리는 것을 고려합니다. 다음 Scala 코드를 사용하여 Spark 파티션을 더 추가합니다.

val numPartitions = 500
val newDF = df.repartition(numPartitions)

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?