当前位置: 首页 > 知识库问答 >
问题:

(python)Spark.textfile(s3:/…)使用有效凭据访问被拒绝403

东门晨
2023-03-14

为了访问我的S3 bucket,我导出了我的cred

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--sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws:2.7.3test.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也存在同样的问题

共有1个答案

贲铭
2023-03-14

Spark会自动将您的AWS凭据复制到s3n和s3a机密。Apache Spark版本不涉及s3://URL,就像在Apache Hadoop中一样,s3://模式与最初的s3客户机相关联,该客户机现在已被弃用,它与其他任何东西都不兼容。

在亚马逊EMR上,s3://与亚马逊EMR S3绑定;EC2虚拟机将自动为执行程序提供秘密。所以我不认为它与env var传播机制有关。还可能是它如何设置身份验证链,您不能覆盖EC2/IAM数据。

如果您试图与S3对话,并且不是运行在EMR VM中,那么您可能是在Apache Hadoop JAR中使用Apache Spark,而不是EMR版本。在世界范围内,使用带有s3a://URL来获取最新的S3客户端

如果这不起作用,请查看apache文档的故障排除部分。这里有一个关于“403”的部分,包括故障排除的推荐步骤。这可能是由于类路径/JVM版本问题以及凭据问题,甚至是客户机和AWS之间的时钟偏斜。

 类似资料:
  • 我实际上能够检查我的桶是否正确存在,也就是我的s3Client是否正确更新。有没有人可以帮助我。提前道谢!

  • 我有一个lambda函数,它使用一个具有以下策略摘录的角色 我的桶策略如下所示 我在角色和bucket策略上都允许使用GetObject和ListBucket。但是,当我的函数运行时 我明白了 [错误]ClientError:调用GetObject操作时发生错误(AccessDenied):拒绝访问 我还需要添加哪些权限?对象就在那里,当我使用管理员角色在本地运行代码时,我可以得到它。 最新消息

  • 我正在尝试将图像上传到我的AWS存储桶,我创建了一个新用户授予他完整的控制权 但是,在上传时,我收到以下错误: 05-27 07:09:47.219: W/System.err(20594):com.amazonaws.services.s3.model.Amazon S3异常:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:访问被拒绝;请求ID:),S3扩展请求ID:/=

  • 我正在尝试用office 365 API构建我的第一个应用程序,但有一个大问题。 我正试图通过Office 365 API和Azure Active Directory获取用户的主要信息,为此我正在做: 1)获取访问令牌。对https://login.windows.net/common/oauth2/token令牌的http post请求: 头:内容类型:应用程序/x-www-表单-乌伦编码 发

  • 我尝试按照此权限指南在node.js上使用Microsoft Graph API(https://graph.microsoft.com/v1.0/me/calendarView)访问日历事件,但收到错误响应: 调用是使用 : 请求具有有效令牌和对…/me/via的调用 退货: 因此,我假设这是在我创建了两个应用程序(一个用于节点服务器,一个用于 Web 客户端应用程序)https://manag

  • 问题内容: 我在使它工作时遇到问题。它接收一个字符串,其中包含几条信息。但是,当我尝试将String写入文件以跟踪程序随时间的变化时,我收到拒绝访问错误: 叠层纱 完整的堆栈跟踪: 58行: 问题答案: 您必须先创建文件夹。但是您不能调用file.mkdirs()-您需要调用file.getParentFile()。mkdirs()-否则,您将使用文件名创建一个文件夹(这将阻止您使用以下命令创建文