在aws
中使用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:cool/rolename' - 不是个人访问KeyiDs
我需要在火花代码中更改什么,以便我的CSV使用角色而不是单个AccessKeyId和SecretAccesskey将其写入S3?
我遇到了同样的问题,并通过使用s3a://
来解决它,在任何情况下,这显然更现代和表现。
问题在Hadoop驱动程序代码(我认为hadoop-aws.jar
)中负责访问S3文件系统。显然,s3n
'本机'协议使用了一些难以使用的旧JETS3T驱动程序,每个人都不敢与之混在一起。新的s3a
协议实现直接使用AWS SDK,并支持实例配置文件等。
看看这些Hadoop-9680和Hadoop-9384,以了解为什么他们想到了这个问题。
这是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")