我希望我的 Spark 应用程序 (Scala) 能够读取 S3 文件
spark.read.parquet("s3://my-bucket-name/my-object-key")
在我的开发机器上,我可以使用 awscli 访问 S3 文件,这是
~/.aws/config
或 ~/.aws/credentials
中预先配置的配置文件,例如:
aws --profile my-profile s3 ls s3://my-bucket-name/my-object-key
但是当尝试从 Spark 读取这些文件时,并使用作为环境变量提供的 aws_profile (AWS_PROFILE),我收到以下错误:
我的存储桶名称上的 doesBucketExist:com.amazonaws.AmazonClientException:BasicAWSCredentialsProvider 没有提供 AWS 凭证 EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider:com.amazonaws.SdkClientException:无法从服务端点加载凭证
还尝试提供配置文件作为 JVM 选项 (
-Daws.profile=my-profile
),但没有成功。
感谢您的阅读。
解决方案是提供spark属性:
fs.s3a.aws.credentials.provider
,将其设置为com.amazonaws.auth.profile.ProfileCredentialsProvider
。
如果我可以更改代码来构建 Spark 会话,那么就像:
SparkSession
.builder()
.config("fs.s3a.aws.credentials.provider","com.amazonaws.auth.profile.ProfileCredentialsProvider")
.getOrCreate()
另一种方法是提供 JVM 选项
-Dspark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.profile.ProfileCredentialsProvider
。spark.hadoop
我有两个与 Spark+AWS 兼容性相关的问题。
首先,pyspark 没有看到
~/.aws/config
文件中指定的配置文件。我必须将其移至 ~/.aws/credentials
,以便 Spark 至少承认该配置文件存在。至少从jupyter
内部并使用pyspark
。
更重要的是,sso/身份服务器是从本地计算机访问 AWS 的推荐方式,但
s3a
连接链不支持基于 sso 的身份验证设置。在另一个问题的答案中对此进行了解释。