Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在S3凭据上从瞬态EMR Spark cluster写入拼花文件失败_Amazon Web Services_Apache Spark_Amazon S3_Amazon Emr - Fatal编程技术网

Amazon web services 在S3凭据上从瞬态EMR Spark cluster写入拼花文件失败

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

我正在以编程方式创建一个瞬态EMR Spark集群,读取一个vanilla S3对象,将其转换为数据帧并编写一个拼花文件

在本地集群上运行(提供了S3凭据),一切正常

启动临时群集并在写入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凭据提供程序作为默认使用的最后一个凭据提供程序。