Spark的S3角色授权?
Posted
技术标签:
【中文标题】Spark的S3角色授权?【英文标题】:S3 roles authorization for Spark? 【发布时间】:2017-03-14 14:32:01 【问题描述】:在 AWS 中的 Cloudera 上使用 pyspark2(版本 2.0.0.cloudera1)
我正在尝试将数据帧从 Spark 写入 S3 存储,但由于身份验证而失败:
pyspark.sql.utils.IllegalArgumentException: u'AWS 访问密钥 ID 和 Secret Access Key 必须通过设置 fs.s3n.awsAccessKeyId 和 fs.s3n.awsSecretAccessKey 属性 (分别)。'
我的 pyspark 代码是:
utp.coalesce(1).write.format('com.databricks.spark.csv').save('s3n://my_bucket/tmr_xfers/test_output')
我们使用角色来访问 S3,即“aws_iam_role=arn:aws:iam::123456789012:role/RoleName”——而不是单独的 AccessKeyID
我需要在我的 Spark 代码中进行哪些更改,以便使用角色而不是单独的 AccessKeyId 和 SecretAccessKey 将我的 csv 写入 S3?
【问题讨论】:
您在这里找到解决方案了吗?我已经设置了 AIM,但是在使用 s3n 时我仍然无法访问。也许我需要使用 s3a。 【参考方案1】:我遇到了同样的问题并通过使用s3a://
来解决它,这显然在任何情况下都更加现代和高效。
问题在于负责访问 S3 文件系统的 Hadoop 驱动程序代码(我认为是hadoop-aws.jar
)。显然s3n
'native' 协议使用了一些旧的 jets3t 驱动程序,这些驱动程序很难使用,每个人都不敢乱用。新的s3a
协议实现直接使用AWS SDK,并支持实例配置文件等。
看看这些HADOOP-9680 和HADOOP-9384 看看为什么他们不会解决这个问题。
【讨论】:
【参考方案2】:这是scala spark2中的一个解决方案,注意安全问题。
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "xxxxx")
spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "xxxxxxxx")
Df.write.
format("com.databricks.spark.csv").option("header", "true").
save("s3n://my_bucket/tmr_xfers/test_output")
【讨论】:
这看起来您使用的是访问密钥,而不是 IAM 角色。您如何为此使用 IAM 角色?以上是关于Spark的S3角色授权?的主要内容,如果未能解决你的问题,请参考以下文章
[AWS][安全][S3] IAM 角色授权 EC2 访问 S3