簡體   English   中英

Spark Scala S3存儲:權限被拒絕

[英]Spark Scala S3 storage: permission denied

我已經在Internet上閱讀了很多有關如何使Spark與S3一起工作的主題,但仍然無法正常工作。 我已經下載了: hadoop 2.7及更高版本的Spark 2.3.2

我只從Hadoop 2.7.7(與Spark / Hadoop版本匹配)中復制了一些庫到Spark jars文件夾:

  • hadoop-aws-2.7.7.jar
  • hadoop-auth-2.7.7.jar
  • aws-java-sdk-1.7.4.jar

我仍然無法使用S3N或S3A來通過spark讀取我的文件:

對於S3A,我有以下例外情況:

sc.hadoopConfiguration.set("fs.s3a.access.key","myaccesskey")
sc.hadoopConfiguration.set("fs.s3a.secret.key","mysecretkey")
val file = sc.textFile("s3a://my.domain:8080/test_bucket/test_file.txt")
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: AE203E7293ZZA3ED, AWS Error Code: null, AWS Error Message: Forbidden

使用這段Python和更多代碼,我可以列出我的存儲桶,列出我的文件,下載文件,從計算機中讀取文件並獲取文件url。 這段代碼為我提供了以下文件網址:

https://my.domain:8080 / test_bucket / test_file.txt?Signature =%2Fg3jv96Hdmq2450VTrl4M%2Be%2FI%3D&Expires = 1539595614&AWSAccessKeyId = myaccesskey

我應該如何安裝/設置/下載以使Spark能夠從我的S3服務器進行讀寫?

編輯3:

在注釋中使用調試工具, 結果如下
似乎問題出在簽名上,不知道這意味着什么。

首先,您需要下載與spark-hadoop版本的安裝相匹配的aws-hadoop.jar和aws-java-sdk.jar,並將它們添加到spark文件夾內的jars文件夾中。
然后,如果您的S3服務器不支持動態DNS,則需要調整將要使用的服務器並啟用路徑樣式:

sc.hadoopConfiguration.set("fs.s3a.path.style.access","true")
sc.hadoopConfiguration.set("fs.s3a.endpoint","my.domain:8080")
#I had to change signature version because I have an old S3 api implementation:
sc.hadoopConfiguration.set("fs.s3a.signing-algorithm","S3SignerType")

這是我的最終代碼:

sc.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
val tmp = sc.textFile("s3a://test_bucket/test_file.txt")
sc.hadoopConfiguration.set("fs.s3a.access.key","mykey")
sc.hadoopConfiguration.set("fs.s3a.secret.key","mysecret")
sc.hadoopConfiguration.set("fs.s3a.endpoint","my.domain:8080")
sc.hadoopConfiguration.set("fs.s3a.connection.ssl.enabled","true")
sc.hadoopConfiguration.set("fs.s3a.path.style.access","true")
sc.hadoopConfiguration.set("fs.s3a.signing-algorithm","S3SignerType")
tmp.count()

我建議將大多數設置放入spark-defaults.conf

spark.hadoop.fs.s3a.impl                   org.apache.hadoop.fs.s3a.S3AFileSystem
spark.hadoop.fs.s3a.path.style.access      true
spark.hadoop.fs.s3a.endpoint               mydomain:8080
spark.hadoop.fs.s3a.connection.ssl.enabled true
spark.hadoop.fs.s3a.signing-algorithm      S3SignerType

我遇到的一個問題是將spark.hadoop.fs.s3a.connection.timeout設置為10,但是此值在Hadoop 3之前以毫秒為單位設置,這給您一個非常長的超時時間。 嘗試讀取文件后1.5分鍾將出現錯誤消息。

PS:
特別感謝Steve Loughran
非常感謝您的寶貴幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM