HTTP 503 "Slow Down" AmazonS3Exception과 함께 Amazon EMR에서의 Spark 또는 Hive 작업이 실패함

최종 업데이트 날짜: 2020년 4월 20일

다음과 같이 HTTP 503 "Slow Down" AmazonS3Exception과 함께 Amazon EMR에서 Spark 또는 Apache Hive 작업이 실패합니다.

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) 요청 속도를 초과할 때 발생합니다. 요청 속도는 버킷에서 접두사마다 초당 3,500개의 PUT/COPY/POST/DELETE 및 5,500개의 GET/HEAD 요청입니다.

이 문제는 세 가지 방법으로 해결할 수 있습니다.

  • S3 버킷에 더 많은 접두사를 추가합니다.
  • Amazon S3 요청 수를 줄입니다.
  • EMR 파일 시스템(EMRFS) 재시도 제한을 늘립니다.

해결 방법

요청이 너무 많은 문제를 식별하기 전에 먼저 Amazon CloudWatch 요청 지표를 구성하십시오.

CloudWatch 요청 지표 구성

Amazon S3 요청을 모니터링하려면 버킷에 대해 CloudWatch 요청 지표를 활성화합니다. 그리고 접두사에 대한 필터를 정의합니다. 모니터링하는 데 유용한 지표 목록은 Amazon S3 CloudWatch 요청 지표를 참조하십시오.

지표를 활성화한 후 지표의 데이터를 사용하여 사용 사례에 가장 적합한 해결 방법을 결정합니다.

S3 버킷에 더 많은 접두사 추가

버킷의 접두사 수에는 제한이 없습니다. 요청 빈도는 버킷이 아닌 각 접두사에 적용됩니다. 예를 들어 다음과 같이 버킷에서 접두사 3개를 생성하는 경우:

  • s3://awsexamplebucket/images
  • s3://awsexamplebucket/videos
  • s3://awsexamplebucket/documents

그러면 해당 버킷에 대해 초당 10,500건의 쓰기 요청 또는 16,500건의 읽기 요청을 할 수 있습니다.

Amazon S3 요청 수 줄이기

  • 여러 동시 작업(Spark, Apache Hive 또는 s3-dist-cp)이 동일한 Amazon S3 접두사에 읽거나 쓰는 경우: 동시 작업 수를 줄입니다. 읽기/쓰기 작업이 많은 작업부터 시작합니다. Amazon S3에 대한 계정 간 액세스를 구성하는 경우 다른 계정이 접두사에 작업을 제출할 수도 있다는 점에 유의하십시오.
  • 작업이 대상 버킷에 쓰려고 할 때 오류가 발생하는 경우: 작업의 병렬 처리를 줄입니다. 예를 들어 Spark .coalesce() 또는 .repartition() 작업을 사용하여 Amazon S3에 쓰기 전에 Spark 출력 파티션의 수를 줄입니다. 실행기당 코어 수를 줄이거나 실행기 수를 줄일 수도 있습니다.
  • 작업이 원본 버킷에서 읽기를 시도할 때 오류가 발생하는 경우: 파일 수를 줄여 Amazon S3 요청 수를 줄입니다. 예를 들어 s3-dist-cp를 사용하여 많은 수의 작은 파일을 줄여 대용량 파일로 병합합니다.

EMRFS 재시도 제한 증가

기본적으로 EMRFS 재시도 제한은 4로 설정되어 있습니다. 새 클러스터, 실행 중인 클러스터 또는 애플리케이션 실행 시간에 대한 재시도 제한을 늘릴 수 있습니다.

EMRFS 일관성이 없는 새 클러스에서 재시도 제한을 늘리려면 클러스터를 시작할 때 다음과 같이 구성 객체를 추가합니다.

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

EMRFS 일관성과 더 높은 재시도 한도를 사용하여 새 클러스터를 시작하려면:

[3단계: 일반 클러스터 설정]에서 [EMRFS 일관성 보기]를 활성화하는 대신 [추가 옵션]에서 클러스터를 시작할 때 다음과 유사한구성 객체를 추가합니다. 이 구성은 EMRFS 일관성 보기에 필요한 모든 속성을 지정하고 재시도 제한을 20으로 늘립니다.

[
    {
      "Classification": "emrfs-site",
      "Properties": {
        "fs.s3.maxRetries": "20",
        "fs.s3.consistent.retryPeriodSeconds": "10",
        "fs.s3.consistent": "true",
        "fs.s3.consistent.retryCount": "5",
        "fs.s3.consistent.metadata.tableName": "EmrFSMetadata"
      }
    }
]

클러스터가 시작된 후 Spark 및 Hive 애플리케이션은 새 제한을 사용합니다.

실행 중인 클러스터의 재시도 제한을 늘리려면:

1.    Amazon EMR 콘솔을 엽니다.

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

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

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

5.    [재구성] 드롭다운 메뉴에서 [테이블에서 편집]을 선택합니다.

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

분류: emrfs-site
속성 fs.s3.maxRetries
: 재시도 제한의 새 값(예: 20).

7.    [이 구성을 모든 활성 인스턴스 그룹에 적용]을 선택한 다음 [변경 내용 저장]을 선택합니다.

구성이 배포된 후 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 ....