Spark的S3角色授权?

时间:2017-03-14 14:32:01

标签: amazon-s3 pyspark

在AWS中的Cloudera上使用pyspark2(版本2.0.0.cloudera1)

我正在尝试写出从Spark到S3存储的数据帧,但由于身份验证而失败:

  

pyspark.sql.utils.IllegalArgumentException:u'AWS访问密钥ID和   必须通过设置来指定秘密访问密钥   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' - 不是单独的AccessKeyIDs

我需要在Spark代码中更改哪些内容,以便使用角色而不是单独的AccessKeyId和SecretAccessKey将我的csv写入S3?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并且通过使用s3a://代替了它,这显然在任何情况下都更加现代和高效。

问题在于Hadoop驱动程序代码(我认为hadoop-aws.jar)负责访问S3文件系统。显然,s3n'本地'协议使用了一些难以使用的旧jets3t驱动程序,每个人都害怕陷入困境。新的s3a协议实现直接使用AWS SDK,并支持实例配置文件等。

看看这些HADOOP-9680HADOOP-9384,看看为什么他们WONTFIX这个问题。

答案 1 :(得分:1)

这是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")
相关问题