2
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存储读取。在尝试从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引起“

回答

1

你的火花(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端点,请参考以下文件:

+0

感谢@elisah,我试过在代码中包括你的aws证书,就像你提到的一样,但我仍然有与代码400相同的错误。我假设这不是问题,因为它会以这种方式抛出认证错误(错误代码403)? – san8055

+1

在Hadoop文档中有关于S3A故障排除的部分;你应该从那里开始。我们只是说“不好的认证”有很多可能的原因 –