当前位置: 首页 > 知识库问答 >
问题:

403尝试在S3本地从拼花文件构建数据帧时出现异常

程举
2023-03-14

我正在构建一个Spark应用程序,并尝试在EMR或容器中启动它之前在本地运行它。当parquet文件本身是本地时,我可以让DataFrame正常工作,但如果parquet文件在S3中,它拒绝读取该文件。我已经尝试设置了所有我能想到的变量,这些变量是从S3a读入时建议的,下面是我如何创建我的Spark会话的:

package util

import org.apache.spark.sql.SparkSession
import scala.io.Source

object SparkSessionFactory {

  def generateSession(sessionLocation: String): SparkSession = {
    val session = {
      sessionLocation match {
        case "local" =>
          SparkSession.builder().appName("LocalS3SparkProfiler").master("yarn").master("local[*]")
            .config("spark.driver.host", "localhost")
            .config("fs.s3a.enableServerSideEncryption", "true")
            .config("fs.s3a.serverSideEncryptionAlgorithm", "aws:kms")
            .getOrCreate()
      }
    }
    setHadoopConfigs(session, sessionLocation)
    session
  }

  private def setHadoopConfigs(session:SparkSession, sessionLocation:String) = {
    session.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    session.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true")
    sessionLocation match {
      case "local"=> {
        val userHome = System.getProperty("user.home")
        val aWSCredentialsLines = Source.fromFile(s"$userHome/.aws/credentials").getLines.toList

        val key = aWSCredentialsLines(1).substring(aWSCredentialsLines(1).lastIndexOf(" ")).trim
        val secret = aWSCredentialsLines(2).substring(aWSCredentialsLines(2).lastIndexOf(" ")).trim
        val s3Token = aWSCredentialsLines(3).substring(aWSCredentialsLines(3).lastIndexOf(" ")).trim

        session.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", key)
        session.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", secret)
        session.sparkContext.hadoopConfiguration.set("fs.s3a.session.token", s3Token)
        session.sparkContext.hadoopConfiguration.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")
      }
    }
  }
}

然后当我试图读取数据帧时,我调用

val spark = SparkSessionFactory.generateSession("local")
val df = spark.read.parquet("s3a://my-bucket/thepath/myparquetfile")

抛出的错误如下:

线程“main”com.amazonaws.services.S3.model.amazons3异常:禁止(服务:Amazon S3;状态代码:403;错误代码:403禁止;请求ID:366CFE11F21144F3;S3扩展请求ID:EW4C6PQZ4USJOPMYKOZ8QCWMK4PWL6EFPWEF9E1KLA3KL2LSICMCTZ+ZLYVPLZH927Inisro7KO=)、S3扩展请求TPClient$RequestExecutor.Access$500(AmazonHttpClient$RequestExecutionBuilderImpl.Execute(AmazonHttpClient.java:649)(Com.AmazonAws.http.AmazonHttpClient.513)(Com.AmazonAws.services.s3.AmazonS3Client.Invoke(AmazonS3Client.Invoke)(Com.AmazonAws.services.s3.AmazonS3Client.Invoke)(AmazonS3Client.java:4277)(

我所读到的一切都表明我需要的证明是我提供的。我检查了keysecrets3token值,它们看起来是正确的,因为我在另一个使用普通AWS SDK的项目中使用了这些凭据,没有任何问题。

你知道这是什么问题吗?

共有1个答案

盖绪
2023-03-14

调试AWS身份验证失败是很困难的,因为AWS和任何实现客户端都不希望将机密记录到控制台。“403”一般和“400”一样无用调试

  1. 查看S3A故障排除
  2. 除了直接的身份验证问题外,如果使用AWS KMS密钥对文件进行SSE-KMS加密,而您的帐户没有访问权限,则会出现身份验证失败。错误消息没有特别指出这一点。
  3. 尝试使用相同CRED的AWS cli以查看它们是否工作。如果他们让您看到数据,那么这不可避免地是一些spark/s3a配置问题。
  4. 下载Hadoop的最新版本(理想情况下是3.2),安装它并配置它的core-site.xml和选项。然后使用Cloudstore StoriDiag让它对登录过程进行结构化调试。如果这不起作用,spark也不起作用。
 类似资料:
  • 我有一个很大的数据框,我正在HDFS中写入拼花文件。从日志中获取以下异常: 谷歌对此进行了搜索,但找不到任何具体的解决方案。将推测设置为false:conf.Set(“spark.投机”,“false”) 但仍然没有帮助。它只完成了几个任务,生成了几个零件文件,然后突然因此错误而停止。 详细信息:Spark版本:2.3.1(这在1.6x中没有发生) 只有一个会话正在运行,这排除了不同会话访问同一位

  • 我试图为hibernate OGM mongo DB应用程序添加hibernate搜索支持。当我尝试使用行重新生成索引时,经常会出现以下异常。 HSearch000058:HSearch000116:MassIndexer操作过程中出现意外错误java.lang.NosuchMethoderror:org.hibernate.search.engine.spi.documentBuilderInd

  • 我试图做一些非常简单的事情,我有一些非常愚蠢的挣扎。我想这一定与对火花的基本误解有关。我非常感谢任何帮助或解释。 我有一张非常大的桌子(~3 TB,~300毫米行,25k个分区),在s3中保存为拼花地板,我想给一些人一个很小的拼花文件样本。不幸的是,这要花很长时间才能完成,我不明白为什么。我尝试了以下方法: 然后当这不起作用时,我尝试了这个,我认为应该是一样的,但我不确定。(我添加了,以尝试调试。

  • 我正在尝试使用Kafka-connect来消耗Kafka的消息并将它们写入s3拼花文件。所以我写了一个简单的生产者,它用byte[]生成消息 我的Kafka连接配置是: 这是我得到的错误: 原因:java。lang.IllegalArgumentException:Avro架构必须是记录。在org。阿帕奇。拼花地板阿夫罗。AvroSchemaConverter。转换(AvroSchemaConve

  • Spark版本:2.3 hadoop dist:azure Hdinsight 2.6.5平台:azure存储:BLOB 集群中的节点:6个执行器实例:每个执行器6个内核:每个执行器3个内存:8gb 试图通过同一存储帐户上的spark数据框将azure blob(wasb)中的csv文件(大小4.5g-280列,2.8 mil行)加载到拼花格式。我重新划分了大小不同的文件,即20、40、60、10

  • 我看到Kafka Connect可以以Avro或JSON格式写入S3。但是没有Parket支持。添加这个有多难?