【发布时间】: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