如何解决 Amazon EMR 中 s3-dist-cp 任务上出现的 Error Code: 503 Slow Down(错误代码:503 运行缓慢)问题?

2 分钟阅读
0

由于 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)”错误?

AWS 官方
AWS 官方已更新 2 年前