如何解决 Amazon EMR 中 s3-dist-cp 作业上出现的“Error Code: 503 Slow Down”问题?

上次更新时间:2020 年 2 月 10 日

由于 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)

简短描述

“Slow Down”错误会在您超出 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 参数可以设置作业的 Reduce 数量。Amazon EMR 会根据集群中的节点数和集群的内存资源自动设置 mapreduce.job.reduces。运行以下命令,确认集群中作业的默认 Reduce 数量:

$ hdfs getconf -confKey mapreduce.job.reduces

要为 mapreduce.job.reduces设置新值,请运行类似以下内容的命令。此命令将 Reduce 的数量设置为 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/")