Amazon EMR의 Spark 또는 Hive 작업이 HTTP 503 "Slow Down" AmazonS3Exception과 함께 실패하는 이유는 무엇인가요?

최종 업데이트 날짜: 2022년 5월 17일

Amazon EMR의 Apache Spark 또는 Apache Hive 작업이 다음과 유사한 HTTP 503 "Slow Down" AmazonS3Exception과 함께 실패합니다.

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3; Status Code: 503; Error Code: 503 Slow Down; Request ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=

간략한 설명

이 오류는 애플리케이션에 대한 Amazon Simple Storage Service(Amazon S3) 요청 속도가 일반적으로 지속되는 초당 5,000개 이상의 요청 속도를 초과하고 Amazon S3가 내부적으로 성능을 최적화할 때 발생합니다.

Amazon EMR을 사용하여 S3 데이터에 액세스할 때 요청 성공률을 높이려면 다음 접근 방식을 시도해 보세요.

  • S3 요청에 대한 재시도 전략을 수정합니다.
  • 동시 S3 요청 수를 조정합니다.

해결 방법

요청이 너무 많은 문제를 식별하려면 S3 버킷에 대한 Amazon CloudWatch 요청 지표를 구성하는 것이 좋습니다. 이러한 CloudWatch 지표를 기반으로 사용 사례에 가장 적합한 솔루션을 결정할 수 있습니다.

CloudWatch 요청 지표 구성

Amazon S3 요청을 모니터링하려면 버킷에 대해 CloudWatch 요청 지표를 켭니다. 그리고 접두사에 대한 필터를 정의합니다. 모니터링할 유용한 지표 목록은 Amazon CloudWatch를 사용한 지표 모니터링을 참조하세요.

S3 요청에 대한 재시도 전략 수정

기본적으로 EMRFS는 지수 백오프 전략을 사용하여 Amazon S3에 대한 요청을 재시도합니다. 기본 EMRFS 재시도 제한은 15입니다. 그러나 새 클러스터, 실행 중인 클러스터 또는 애플리케이션 런타임에 대한 재시도 제한을 늘릴 수 있습니다.

재시도 제한을 늘리려면 fs.s3.maxRetries 파라미터의 값을 변경합니다. 이 파라미터에 매우 높은 값을 설정하면 작업 기간이 더 길어질 수 있습니다. 이 파라미터를 높은 값(예: 20)으로 설정하고 작업의 지속 시간 오버헤드를 모니터링한 다음 사용 사례에 따라 이 파라미터를 조정합니다.

새 클러스터의 경우 클러스터를 시작할 때 다음과 유사한 구성 객체를 추가할 수 있습니다.

[
  {
    "Classification": "emrfs-site",
    "Properties": {
      "fs.s3.maxRetries": "20"
    }
  }
]

클러스터가 시작된 후 Amazon EMR에서 실행 중인 Spark 및 Hive 애플리케이션은 새 제한을 사용합니다.

실행 중인 클러스터의 재시도 제한을 늘리려면 다음을 수행하세요.

1.    Amazon EMR 콘솔을 엽니다.

2.    클러스터 목록의 [이름]에서 재구성하려는 활성 클러스터를 선택합니다.

3.    클러스터의 클러스터 세부 정보 페이지를 열고 [구성] 탭을 선택합니다

4.    필터(Filter) 드롭다운 목록에서 다시 구성할 인스턴스 그룹을 선택합니다.

5.    재구성(Reconfigure) 드롭다운 목록에서 테이블에서 편집(Edit in table)을 선택합니다.

6.    구성 분류 테이블에서 [구성 추가]를 선택한 후 다음을 입력합니다.

분류: emrfs-site

속성 fs.s3.maxRetries

: 재시도 제한의 새 값(예: 20).

7.    이 구성을 모든 활성 인스턴스 그룹에 적용(Apply this configuration to all active instance groups)을 선택합니다.

8.    변경 사항 저장(Save changes)을 선택합니다.

구성이 배포된 후 Spark 및 Hive 애플리케이션은 새 제한을 사용합니다.

런타임 시 재시도 제한을 늘리려면 다음과 유사한 Spark 셸 세션을 사용합니다.

spark> sc.hadoopConfiguration.set("fs.s3.maxRetries", "20")
spark> val source_df = spark.read.csv("s3://awsexamplebucket/data/")
spark> source_df.write.save("s3://awsexamplebucket2/output/")

다음은 Hive 애플리케이션의 런타임에 재시도 제한을 늘리는 방법의 예입니다.

hive> set fs.s3.maxRetries=20;
hive> select ....

동시 S3 요청 수 조정

  • 동일한 S3 접두사를 읽고 쓰는 여러 작업(Spark, Apache Hive 또는 s-dist-cp)이 있는 경우 동시성을 조정할 수 있습니다. 읽기/쓰기가 가장 많은 작업부터 시작하여 동시성을 낮춰 과도한 병렬 처리를 방지합니다. Amazon S3에 대한 계정 간 액세스를 구성하는 경우 다른 계정이 동일한 접두사에 작업을 제출할 수도 있다는 점에 유의하세요.
  • 작업이 대상 버킷에 쓰려고 할 때 오류가 표시되는 경우 과도한 쓰기 병렬 처리를 줄입니다. 예를 들어 Spark .coalesce() 또는 .repartition() 작업을 사용하여 Amazon S3에 쓰기 전에 Spark 출력 파티션의 수를 줄입니다. 실행기당 코어 수를 줄이거나 실행기 수를 줄일 수도 있습니다.
  • 작업이 소스 버킷에서 읽기를 시도할 때 오류가 표시되는 경우 객체의 크기를 조정합니다. 작은 객체를 큰 객체로 집계하여 작업에서 읽을 객체 수를 줄일 수 있습니다. 이렇게 하면 작업에서 더 적은 읽기 요청으로 데이터 집합을 읽을 수 있습니다. 예를 들어 s3-dist-cp를 사용하여 많은 수의 작은 파일을 줄여 대용량 파일로 병합합니다.