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故障排除的部分;你應該從那裏開始。我們只是說「不好的認證」有很多可能的原因 –