我想解决“Error Code: 503 Slow Down”(错误代码:503 运行缓慢)错误,该错误导致我的 S3DistCp 作业在 Amazon EMR 中失败。
解决方法
当您的数据使用 Apache Hive 风格的分区,并且您超出了 Amazon Simple Storage Service (Amazon S3) 请求速率时,您会收到以下错误:
“mapreduce.Job: 任务 ID:attempt_######_0012_r_000203_0,状态: “失败”,错误:com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: 运行缓慢(服务: Amazon S3;状态代码: 503;错误代码: 503 运行缓慢;请求 ID: D27E827C847A8304;S3 扩展请求 ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo=),S3 扩展请求 ID: XWxtDsEZ40GLEoRnSIV6+HYNP2nZiG4MQddtNDR6GMRzlBmOZQ/LXlO5zojLQiy3r9aimZEvXzo= at com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712)”
例如,以下 Amazon S3 路径使用相同的前缀,/year=2019/:
- 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
请求配额为每秒 3,500 个写入请求或 5,500 个读取请求。前缀内的所有操作均计入配额。
如果您无法增加分区数量,请使用以下选项之一来解决 S3DistCp 作业上的节流错误。
减少 reduce 任务的数量
mapreduce.job.reduces 参数用于设置作业的 reduce 任务数量。Amazon EMR 会根据集群中的节点数量和集群的内存资源自动设置 mapreduce.job.reduces。
运行以下命令以检查集群中作业的默认 reduce 任务数量:
hdfs getconf -confKey mapreduce.job.reduces
要为 mapreduce.job.reduces 设置新值,请运行以下命令:
s3-dist-cp -Dmapreduce.job.reduces=10 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
**注意:**请将 10 替换为要设置的 reduce 任务数量。此外,请将示例值替换为您的值。
增加 EMRFS 重试配额
默认情况下,EMRFS 重试配额设置为 4。
运行以下命令以检查集群的重试配额:
hdfs getconf -confKey fs.s3.maxRetries
要增加 s3-dist-cp 作业的重试配额,请运行以下命令:
s3-dist-cp -Dfs.s3.maxRetries=20 --src s3://awsexamplebucket/data/ --dest s3://awsexamplebucket2/output/
**注意:**请将 20 替换为要设置的重试配额。此外,请将示例值替换为您的值。
要增加新集群的重试配额,请在启动集群时添加配置对象。要增加正在运行的集群的重试配额,请使用配置对象覆盖实例组的集群配置。
Amazon EMR 版本 5.21.0 及更高版本的配置对象示例:
[
{
"Classification": "emrfs-site",
"Properties": {
"fs.s3.maxRetries": "20"
}
}
]
当您增加集群的重试配额时,Apache 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 错误?