由于 Amazon Simple Storage Service(Amazon S3)节流限制,Amazon EMR 任务上的 S3DistCp (s3-dist-cp) 任务失败。我收到类似于以下内容的错误消息:
mapreduce.Job: Task Id : attempt_xxxxxx_0012_r_000203_0, Status : FAILED Error: 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: D27E827C847A8304; S3 Extended Request ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo=), S3 Extended Request ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo= at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712)
简短描述
“运行缓慢”错误会在您超出 Amazon S3 请求速率(在存储桶中每个前缀在每秒处理 3500 个 PUT/COPY/POST/DELETE 和 5500 个 GET/HEAD 请求)时发生。当您的数据使用 Apache Hive 样式的分区时,通常会发生这种情况。例如,以下 Amazon S3 路径使用相同的前缀 (/year=2019/)。这表示请求限制为每秒 3500 个写入请求或 5500 个读取请求。
- s3://awsexamplebucket/year=2019/month=11/day=01/mydata.parquet
- s3://awsexamplebucket/year=2019/month=11/day=02/mydata.parquet
- s3://awsexamplebucket/year=2019/month=11/day=03/mydata.parquet
如果无法增加分区数,请减少 Reducer 任务的数量或增加 EMR (EMRFS) 文件系统重试限制,来解决 Amazon S3 限制错误。
解决方法
选择以下任一方法,解决 s3-dist-cp 任务上的节流限制错误。
降低 Reduce 的数量
mapreduce.job.reduces 参数可以设置任务减少数量。Amazon EMR 会根据集群中的节点数和集群的内存资源自动设置 mapreduce.job.reduces。运行以下命令,确认集群中作业的默认 Reduce 数量:
$ hdfs getconf -confKey mapreduce.job.reduces
要为 mapreduce.job.reduces设置新值,请运行类似以下内容的命令。此命令将减少数量设置为 10。
$ s3-dist-cp -Dmapreduce.job.reduces=10 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
提高 EMRFS 重试限制
默认情况下,EMRFS 重试限制设置为 4。运行以下命令,以确认集群的重试限制:
$ hdfs getconf -confKey fs.s3.maxRetries
要提高单个 s3-dist-cp 作业的重试限制,请运行类似以下内容的命令。该命令将重试限制设置为 20。
$ s3-dist-cp -Dfs.s3.maxRetries=20 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
要提高新集群或正在运行的集群的重试限制:
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
提高集群的重试限制时,Spark 和 Hive 应用程序页可以使用新限制。以下是使用更高重试限制的 Spark shell 会话的示例:
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/")
相关信息
最佳实践设计模式:优化 Amazon S3 性能
为什么 Amazon EMR 上的 Spark 或 Hive 任务失败并显示“HTTP 503 "Slow Down" AmazonS3Exception(HTTP 503“运行缓慢”AmazonS3Exception)”错误?