scala 无法使用spark从s3存储桶读取

eanckbw9  于 5个月前  发布在  Scala
关注(0)|答案(2)|浏览(72)
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”

gdrx4gfi

gdrx4gfi1#

如果不告诉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的更多信息,请参阅以下文档:

cnjp1d6j

cnjp1d6j2#

bucket可以被加密。需要定义sse算法和密钥

相关问题