在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?
答案 0 :(得分:1)
我遇到了同样的问题并且通过使用s3a://
代替了它,这显然在任何情况下都更加现代和高效。
问题在于Hadoop驱动程序代码(我认为hadoop-aws.jar
)负责访问S3文件系统。显然,s3n
'本地'协议使用了一些难以使用的旧jets3t驱动程序,每个人都害怕陷入困境。新的s3a
协议实现直接使用AWS SDK,并支持实例配置文件等。
看看这些HADOOP-9680和HADOOP-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")