【问题标题】:Spark. Problem when writing a large file on aws s3a storage火花。在 aws s3a 存储上写入大文件时出现问题
【发布时间】:2020-01-10 14:31:47
【问题描述】:

我在将大文件上传到 s3a 时遇到无法解释的问题。我正在使用带有 spark-2.4.4-bin-hadoop2.7 和 Spark DataFrame 的 EC2 实例以 V4 版本写入 s3a。使用访问密钥和秘密密钥对 S3 进行身份验证。

程序如下: 1) 从 s3a 读取 csv 文件作为 Spark DataFrame; 2) 处理数据; 3) 将 Data Frame 以 parquet 格式上传到 s3a

如果我使用 400MB 的 csv 文件执行此过程,则没有问题,一切正常。但是,当我在将 parquet 文件写入 s3a 的过程中对 12 GB 的 csv 文件执行相同操作时,会出现错误:

状态代码:403,AWS 服务:Amazon S3,AWS 请求 ID:2CA5F6E85BC36E8D,AWS 错误代码:SignatureDoesNotMatch,AWS 错误消息:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

我使用以下设置:

import pyspark

from pyspark import SparkContext

import os

os.environ['PYSPARK_SUBMIT_ARGS'] = "--packages=org.apache.hadoop:hadoop-aws:2.7.3 pyspark-shell"

sc = SparkContext()

sc.setSystemProperty("com.amazonaws.services.s3.enableV4", "true")

hadoopConf = sc._jsc.hadoopConfiguration()

accesskey = input()
secretkey = input()

hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoopConf.set("fs.s3a.endpoint", "s3-eu-north-1.amazonaws.com")
hadoopConf.set("fs.s3a.fast.upload", "true")

hadoopConf.set("fs.s3a.fast.upload", "s3-eu-north-1.amazonaws.com")
hadoopConf.set("com.amazonaws.services.s3a.enableV4", "true")
hadoopConf.set("fs.s3a.access.key", accesskey)

hadoopConf.set("fs.s3a.secret.key", secretkey)

还尝试添加这些设置:

hadoopConf.set('spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version', '2')
hadoopConf.set('spark.speculation', "false")

hadoopConf.set('spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4', 'true')

hadoopConf.set('spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4', 'true')

但它没有帮助。

同样,问题只出现在大文件中。

如果有任何帮助,我将不胜感激。谢谢。

【问题讨论】:

  • 我遇到了同样的问题:Spark 2.2.0 using hadoop 2.7.2。我运行pyspark --driver-memory 16g --executor-memory 16g --packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.2 来启动pyspark,当我尝试将一个小文件上传到S3 时,它工作正常,但是当我尝试一个大文件(大约10 GB)时,它会抛出一个令人困惑的403 错误。

标签: amazon-web-services apache-spark pyspark


【解决方案1】:

尝试将fs.s3a.fast.upload 设置为true

否则,分段上传内容仅在 2.7 中是实验性的;你可能遇到了一个角落案例。升级到 hadoop-2.8 或更高版本,它应该会消失。

【讨论】:

  • 感谢您的回复。正如您在上面的代码中看到的,我已经设置了 hadoopConf.set("fs.s3a.fast.upload", "true"),但是它不起作用(应该考虑转移到 hadoop 2.8
  • 我花了半天时间,最终成功地将hadoop从2.7.3更新到2.8.5,现在一切正常,没有错误。我想知道为什么在 spark-2.4.4 的官方 apache.spark 网站上。没有选项可以下载 hadoop 2.8 的预构建版本?再次感谢史蒂夫!
  • 您可以随时自己构建;我正在针对 hadoop-3.2.1 RC 进行构建,以验证 s3a 和 abfs 连接器没有回归。
【解决方案2】:

将 hadoop 从 2.7.3 更新到 2.8.5,现在一切正常,没有错误。

【讨论】:

    【解决方案3】:

    有同样的问题。在 EMR (5.27.0) 上制作了一个 Spark 集群,并在 Hadoop 2.8.5 上使用 Spark 2.4.4 对其进行了配置。将我的带有我的代码的笔记本上传到我在 EMR JupyterLab 中制作的笔记本中,运行它,它运行良好!

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 2020-06-21
      • 2017-03-09
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2016-03-18
      • 2015-02-04
      • 1970-01-01
      相关资源
      最近更新 更多