【问题标题】:Writing parquet file from transient EMR Spark cluster fails on S3 credentials在 S3 凭据上从瞬态 EMR Spark 集群写入 parquet 文件失败
【发布时间】:2018-09-19 01:50:38
【问题描述】:

我正在以编程方式创建瞬态 EMR Spark 集群,读取 vanilla S3 对象,将其转换为 Dataframe 并写入 parquet 文件。

在本地集群上运行(提供 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 设置的策略。

我得到我试图将 parquet 文件写入的“文件系统”是特殊的,但我不知道需要设置什么才能使其工作。

【问题讨论】:

    标签: amazon-web-services apache-spark amazon-s3 amazon-emr


    【解决方案1】:

    啊啊啊啊啊!基本上,我一发布我的问题,灯泡就熄灭了。

    在我的 Spark 工作中,我有

    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 凭证提供程序作为默认情况下使用的最后一个凭证提供程序。
    【解决方案2】:

    如果您在 AWS 代码(而非 EMR)上的 EC2 中运行,请使用 S3A 连接器,因为它将使用 EC2 IAM 凭据提供程序作为其默认使用的最后一个凭据提供程序。

    IAM 凭证是短暂的,并且包含一个会话密钥:如果您要复制它们,那么您需要至少每小时刷新一次并设置所有三个项目:访问密钥、会话密钥和秘密。

    就像我说的:s3a 处理这个问题,只要前一个密钥过期,IAM 凭据提供程序就会触发实例信息 HTTP 服务器的新 GET。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-16
      • 2019-06-07
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      相关资源
      最近更新 更多