Amazon EMR에서 Apache Spark 또는 Apache Hive 작업이 HTTP 503 "Slow Down" AmazonS3Exception으로 인해 실패하는 이유는 무엇입니까?
간략한 설명
애플리케이션에 대한 Amazon Simple Storage Service(Amazon S3) 요청 속도가 일반적으로 지속되는 속도를 초과하고, Amazon S3가 내부적으로 성능을 최적화할 때 다음 오류가 발생합니다.
"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="
해결 방법
CloudWatch 요청 지표 구성
요청이 너무 많을 때 발생하는 문제를 식별하려면 Amazon S3 버킷에 Amazon CloudWatch 요청 지표를 구성하는 것이 좋습니다.
버킷의 CloudWatch 요청 지표를 활성화하고 접두사에 대한 필터를 정의합니다.
Amazon S3 요청에 대한 재시도 전략 수정
기본적으로 EMR 파일 시스템(EMRFS)은 지수 백오프 전략을 사용하여 Amazon S3에 대한 요청을 재시도합니다. 기본 EMRFS 재시도 제한은 15입니다. 하지만 새 클러스터, 실행 중인 클러스터 또는 애플리케이션 런타임에 대한 재시도 제한을 늘릴 수 있습니다.
재시도 제한을 늘리려면 fs.s3.maxRetries 파라미터의 값을 변경합니다.
참고: 이 파라미터의 값을 매우 높게 설정하면 작업 기간이 길어질 수 있습니다.
파라미터를 높은 값(예: 20)으로 설정하고 작업의 기간 오버헤드를 모니터링합니다. 그런 다음 사용 사례에 따라 파라미터를 조정합니다.
새 클러스터의 경우 클러스터를 시작할 때 다음과 비슷한 구성 객체를 추가할 수 있습니다.
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
클러스터를 시작하면 Amazon EMR에서 실행되는 Spark 및 Hive 애플리케이션이 새로운 한도를 사용합니다.
실행 중인 클러스터의 재시도 제한을 늘리려면 다음 단계를 완료하십시오.
- Amazon EMR 콘솔을 엽니다.
- 재구성하려는 활성 클러스터를 선택합니다.
- 구성 탭을 선택합니다.
- 필터 드롭다운 목록에서 재구성하려는 인스턴스 그룹을 선택합니다.
- 재구성 드롭다운 목록에서 테이블에서 편집을 선택합니다.
- 구성 분류 테이블에서 구성 추가를 선택한 후 다음 값을 입력합니다.
분류에는 emrfs-site 를 사용합니다.
속성에는 fs.s3.maxRetries 를 사용합니다.
값에는 새로운 재시도 제한 값을 사용합니다. 예를 들어 20을 사용합니다.
- 모든 활성 인스턴스 그룹에 이 구성 적용을 선택합니다.
- 변경 사항 저장을 선택합니다.
구성을 배포하면 Spark 및 Hive 애플리케이션은 새로운 제한을 사용합니다.
Spark 애플리케이션의 런타임 시 재시도 제한을 늘리려면 다음 예와 비슷하게 Spark 쉘 세션을 사용하여 fs.s3.maxRetries 파라미터를 수정하십시오.
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 ....
동시 Amazon S3 요청 수 조정
- 동일한 Amazon S3 접두사를 읽고 쓰는 작업이 여러 개 있는 경우(Spark, Apache Hive 또는 s-dist-cp) 동시성을 조정할 수 있습니다. 읽기 또는 쓰기가 가장 많은 작업부터 시작하고 동시성을 낮춰 과도한 병렬 처리를 방지하십시오.
**참고:**Amazon S3에 대한 교차 계정 액세스를 구성한 경우 다른 AWS 계정에서도 동일한 접두사로 작업을 제출할 수 있습니다.
- 작업에서 대상 버킷에 쓰려고 할 때 오류가 발생하면 과도한 쓰기 병렬 처리를 줄이십시오. 예를 들어, Amazon S3에 쓰기 전에 Spark .coalesce() 또는 .repartition() 작업을 사용하여 Spark 출력 파티션의 수를 줄이십시오. 또한 실행자당 코어 수를 줄이거나 실행자 수를 줄일 수 있습니다.
- 작업에서 소스 버킷에서 읽으려고 할 때 오류가 발생하면 객체 크기를 조정하십시오. 작업에서 읽는 객체 수를 줄이려면 작은 객체를 큰 객체로 집계하십시오. 예를 들어 s3-dist-cp를 사용하여 많은 수의 작은 파일을 더 적은 수의 큰 파일로 병합합니다.
관련 정보
모범 사례 설계 패턴: Amazon S3 성능 최적화
Amazon EMR 애플리케이션이 HTTP 403 "Access Denied" AmazonS3Exception 오류로 실패하는 이유는 무엇인가요?
Amazon EMR 애플리케이션이 HTTP 404 "Access Denied" AmazonS3Exception 오류로 실패하는 이유는 무엇인가요?