【问题标题】:Providing AWS_PROFILE when reading S3 files with Spark使用 Spark 读取 S3 文件时提供 AWS_PROFILE
【发布时间】:2021-07-19 20:59:53
【问题描述】:

我希望我的 Spark 应用 (Scala) 能够读取 S3 文件

spark.read.parquet("s3://my-bucket-name/my-object-key")

在我的开发机器上,我可以使用 ~/.aws/config~/.aws/credentials 中的预配置配置文件 awscli 访问 S3 文件,例如:

aws --profile my-profile s3 ls s3://my-bucket-name/my-object-key

但是当尝试从 Spark 读取这些文件时,将 aws_profile 作为环境变量 (AWS_PROFILE) 提供,我收到以下错误:

doesBucketExist on my-bucket-name:com.amazonaws.AmazonClientException:BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider 没有提供 AWS 凭证:com.amazonaws.SdkClientException:无法从服务端点加载凭证

还尝试将配置文件作为 JVM 选项 (-Daws.profile=my-profile) 提供,但没有成功。

感谢阅读。

【问题讨论】:

    标签: apache-spark hadoop amazon-s3 profile aws-credentials


    【解决方案1】:

    如果将fs.s3a.aws.credentials.provider设置为com.amazonaws.auth.profile.ProfileCredentialsProvider并正确设置AWS_PROFILE后仍然出现问题,可能是因为您使用的Hadoop 2不支持上述配置。

    因此,我发现的唯一解决方法是升级到 Hadoop 3。

    查看this post 和Hadoop docs 了解更多信息。

    【讨论】:

      【解决方案2】:

      解决方法是提供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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-31
        • 2015-12-04
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        相关资源
        最近更新 更多