Amazon web services 在S3凭据上从瞬态EMR Spark cluster写入拼花文件失败
我正在以编程方式创建一个瞬态EMR Spark集群,读取一个vanilla S3对象,将其转换为数据帧并编写一个拼花文件 在本地集群上运行(提供了S3凭据),一切正常 启动临时群集并在写入S3时提交作业失败,错误为:Amazon web services 在S3凭据上从瞬态EMR Spark cluster写入拼花文件失败,amazon-web-services,apache-spark,amazon-s3,amazon-emr,Amazon Web Services,Apache Spark,Amazon S3,Amazon Emr,我正在以编程方式创建一个瞬态EMR Spark集群,读取一个vanilla S3对象,将其转换为数据帧并编写一个拼花文件 在本地集群上运行(提供了S3凭据),一切正常 启动临时群集并在写入S3时提交作业失败,错误为: AmazonS3例外:您提供的AWS访问密钥Id在我们的记录中不存在。 但我的工作是能够从S3读取普通对象,并且它正确地记录到S3。此外,我看到EMR\u EC2\u DefaultRole被设置为EC2实例概要文件,并且EMR\u EC2\u DefaultRole具有正确的S3
AmazonS3例外:您提供的AWS访问密钥Id在我们的记录中不存在。
但我的工作是能够从S3读取普通对象,并且它正确地记录到S3。此外,我看到EMR\u EC2\u DefaultRole
被设置为EC2实例概要文件
,并且EMR\u EC2\u DefaultRole
具有正确的S3权限,并且我的bucket为EMR\u EC2\u DefaultRole
设置了策略
我得到的结论是,我试图将拼花文件写入的“文件系统”是特殊的,但我无法确定需要设置什么才能使其工作。arrrgggghh!基本上,我一提出问题,灯泡就熄灭了 在我的星火工作中,我
val cred: AWSCredentials = new DefaultAWSCredentialsProviderChain().getCredentials
session.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", cred.getAWSAccessKeyId)
session.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", cred.getAWSSecretKey)
这在测试集群中本地运行时是必需的,但在EMR上运行时却破坏了良好的值。我把街区改成了
overrideCredentials.foreach(cred=>{
session.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", cred.getAWSAccessKeyId)
session.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", cred.getAWSSecretKey)
})
并将凭证检索推入我的测试线束(当然,它一直都应该在这里。)如果您在AWS代码(而不是EMR)的EC2中运行,请使用S3A连接器,因为它将使用EC2 IAM凭证提供程序作为默认使用的最后一个凭证提供程序 IAM凭据是短期的,并且包含会话密钥:如果要复制它们,则需要至少每小时刷新一次,并设置所有三项:访问密钥、会话密钥和机密
正如我所说:s3a处理这个问题,IAM凭据提供程序在前一个密钥过期时触发实例信息HTTP服务器的新GET。如果您在AWS代码(而不是EMR)上的EC2中运行,请使用s3a连接器,因为它将使用EC2 IAM凭据提供程序作为默认使用的最后一个凭据提供程序。