【发布时间】:2017-07-27 20:01:46
【问题描述】:
为了访问我的 S3 存储桶,我导出了我的凭据
export AWS_SECRET_ACCESS_KEY=
export AWS_ACCESSS_ACCESS_KEY=
我可以通过以下方式验证一切正常
aws s3 ls mybucket
我也可以用 boto3 验证它是否可以在 python 中工作
resource = boto3.resource("s3", region_name="us-east-1")
resource.Object("mybucket", "text/text.py") \
.put(Body=open("text.py", "rb"),ContentType="text/x-py")
这行得通,我可以看到存储桶中的文件。
但是,当我使用 spark 执行此操作时:
spark_context = SparkContext()
sql_context = SQLContext(spark_context)
spark_context.textFile("s3://mybucket/my/path/*)
我觉得不错
> Caused by: org.jets3t.service.S3ServiceException: Service Error
> Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error
> Message: <?xml version="1.0"
> encoding="UTF-8"?><Error><Code>InvalidAccessKeyId</Code><Message>The
> AWS Access Key Id you provided does not exist in our
> records.</Message><AWSAccessKeyId>[MY_ACCESS_KEY]</AWSAccessKeyId><RequestId>XXXXX</RequestId><HostId>xxxxxxx</HostId></Error>
这就是我在本地提交作业的方式
spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws:2.7.3 test.py
为什么它与命令行 + boto3 一起工作,但 spark 阻塞?
编辑:
使用 s3a:// 时同样的问题
hadoopConf = spark_context._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.access.key", "xxxx")
hadoopConf.set("fs.s3a.secret.key", "xxxxxxx")
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
同样的问题使用 aws-sdk 1.7.4 和 hadoop 2.7.2
【问题讨论】:
-
我认为它也适用于导出 AWS_SECRET_ACCESS_KEY 和 AWS_ACCESS_KEY。创建该凭据文件真的有必要吗?如您所见,Spark 正确地从 env 变量中获取 AWS_ACCESS_KEY 但由于原因无法进行身份验证?
-
Spark 已分发。因为您在一个执行程序中有 ENV 变量并不意味着其他执行程序也有它。您应该使用
SparkConf设置值 -
hadoopConf = spark_context._jsc.hadoopConfiguration() hadoopConf.set("fs.s3.awsAccessKeyId", "xxxxx") hadoopConf.set("fs.s3.awsSecretAccessKey", "xxxxxx) 和使用 SparkConf 设置时同样的错误
-
@cricket_007我想我找到了问题我已经为它创建了一个新帖子stackoverflow.com/questions/42669246/…
标签: apache-spark amazon-s3 pyspark http-status-code-403 access-keys