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

使用承担角色从 lambda 访问 S3

S3 存储桶策略 IAM 角色显示为 API 密钥

Boto 无法使用 S3 IAM 角色进行身份验证

通过 jclouds 使用 AWS (S3) - 如何承担角色

澄清身份授权:将声明用作角色、角色和声明或角色声明