我尝试使用 Pyspark 使用临时会话凭据从 S3 读取文件,但不断收到错误:
Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: null, AWS Request ID: XXXXXXXX, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request ID: XXXXXXX
Run Code Online (Sandbox Code Playgroud)
我认为问题可能是,org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider除了标准访问密钥和秘密密钥之外,还需要使用 S3A 连接来提取会话令牌,但即使设置了fs.s3a.aws.credentials.provider配置变量,它仍然尝试使用BasicAWSCredentialsProvider. 查看日志我看到:
DEBUG AWSCredentialsProviderChain:105 - Loading credentials from BasicAWSCredentialsProvider
Run Code Online (Sandbox Code Playgroud)
我已按照此处的说明添加必要的配置值,但它们似乎没有任何区别。这是我用来设置它的代码:
import os
import sys
import pyspark
from pyspark.sql import SQLContext
from pyspark.context import SparkContext
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk-pom:1.11.83,org.apache.hadoop:hadoop-aws:2.7.3 pyspark-shell'
sc = SparkContext()
sc.setLogLevel("DEBUG")
sc._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID"))
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
sc._jsc.hadoopConfiguration().set("fs.s3a.session.token", os.environ.get("AWS_SESSION_TOKEN"))
sql_context = SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)
为什么TemporaryAWSCredentialsProvider没有被使用?
| 归档时间: |
|
| 查看次数: |
5226 次 |
| 最近记录: |