我正在以编程方式创建一个瞬态EMR Spark集群,读取一个vanilla S3对象,将其转换为Dataframe并编写一个镶木地板文件。
在本地群集上运行(提供S3凭据)一切正常。
在写入S3时,启动瞬态集群并提交作业失败,并显示以下错误:
AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records.
但是我的工作能够从S3读取vanilla对象,并且正确地记录到S3。另外,我看到EMR_EC2_DefaultRole
设置为EC2 instance profile
,EMR_EC2_DefaultRole
具有正确的S3权限,而我的存储分区有EMR_EC2_DefaultRole
的策略集。
我得到了'文件系统'我正在尝试编写镶木地板文件是特殊的,但我无法弄清楚需要为此设置什么。
答案 0 :(得分:0)
Arrrrgggghh!基本上,只要我发出问题,灯泡就会熄灭。
在我的Spark工作中,我有
this
在测试集群中本地运行时是必需的,但在EMR上运行时会破坏好的值。我将块改为
val cred: AWSCredentials = new DefaultAWSCredentialsProviderChain().getCredentials
session.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", cred.getAWSAccessKeyId)
session.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", cred.getAWSSecretKey)
并将凭证检索推送到我的测试工具中(当然,这应该是应该一直存在的地方。)
答案 1 :(得分:0)
如果您在AWS代码(而非EMR)上使用EC2运行,请使用S3A连接器,因为它将使用EC2 IAM凭据提供程序作为其默认使用的最后一个凭据提供程序。
IAM凭证是短暂的并且包含会话密钥:如果您要复制它们,那么您至少需要每小时刷新一次并设置所有三个项目:访问密钥,会话密钥和秘密。
就像我说的:s3a处理这个问题,IAM凭证提供程序会在上一个密钥到期时触发instance-info HTTP服务器的新GET。