【问题标题】:Unable to read from s3 bucket using spark无法使用 spark 从 s3 存储桶中读取
【发布时间】:2017-11-19 05:59:39
【问题描述】:
val spark = SparkSession
        .builder()
        .appName("try1")
        .master("local")
        .getOrCreate()

val df = spark.read
        .json("s3n://BUCKET-NAME/FOLDER/FILE.json")
        .select($"uid").show(5)

我已将 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 作为环境变量。尝试从 S3 读取时遇到以下错误。

Exception in thread "main" org.apache.hadoop.fs.s3.S3Exception: org.jets3t.service.S3ServiceException: S3 HEAD request failed for '/FOLDER%2FFILE.json' - ResponseCode=400, ResponseMessage=Bad Request

我怀疑该错误是由于某些内部函数将“/”转换为“%2F”引起的,因为错误显示的是 '/FOLDER%2FFILE.json' 而不是 '/FOLDER/FILE.json'

【问题讨论】:

    标签: scala amazon-web-services apache-spark amazon-s3 apache-spark-sql


    【解决方案1】:

    如果您不告知,您的 spark (jvm) 应用程序将无法读取环境变量,因此请快速解决:

    spark.sparkContext
         .hadoopConfiguration.set("fs.s3n.awsAccessKeyId", awsAccessKeyId)
    spark.sparkContext
         .hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", awsSecretAccessKey)
    

    您还需要精确的 s3 端点:

    spark.sparkContext
         .hadoopConfiguration.set("fs.s3a.endpoint", "<<ENDPOINT>>");
    

    要了解有关什么是 AWS S3 Endpoint 的更多信息,请参阅以下文档:

    【讨论】:

    • 谢谢@elisah,我尝试将您的aws凭据包含在您提到的代码中,但代码400仍然存在相同的错误。我假设这不是问题,因为凭据为它会以这种方式引发身份验证错误(错误代码 403)?
    • Hadoop 文档中有关于 S3A 故障排除的部分;你应该从那里开始。假设“错误的身份验证”有很多可能的原因
    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2015-08-05
    • 2020-02-11
    • 2019-03-25
    • 2022-01-13
    • 2022-10-14
    • 2021-09-27
    相关资源
    最近更新 更多