如何解决 Amazon EMR 中 S3DistCp 作业出现的“Error Code: 503 Slow Down”(错误代码:503 运行缓慢)错误?

1 分钟阅读
0

我想解决“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 错误?

AWS 官方
AWS 官方已更新 2 个月前