3

爲了訪問我的S3存儲我已經出口我creds(蟒蛇)星火.textFile(S3:// ...)拒絕訪問403具有有效憑據

export AWS_SECRET_ACCESS_KEY= 
export AWS_ACCESSS_ACCESS_KEY= 

我可以驗證一切工作由做

aws s3 ls mybucket 

我還可以boto3,它工作在Python驗證

resource = boto3.resource("s3", region_name="us-east-1") 
resource.Object("mybucket", "text/text.py") \ 
      .put(Body=open("text.py", "rb"),ContentType="text/x-py") 

這工作,我可以看到網絡連接在桶裏。

但是當我這樣做火花:

spark_context = SparkContext() 
sql_context = SQLContext(spark_context) 
spark_context.textFile("s3://mybucket/my/path/*) 

我得到一個不錯的

> Caused by: org.jets3t.service.S3ServiceException: Service Error 
> Message. -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error 
> Message: <?xml version="1.0" 
> encoding="UTF-8"?><Error><Code>InvalidAccessKeyId</Code><Message>The 
> AWS Access Key Id you provided does not exist in our 
> records.</Message><AWSAccessKeyId>[MY_ACCESS_KEY]</AWSAccessKeyId><RequestId>XXXXX</RequestId><HostId>xxxxxxx</HostId></Error> 

這是我在本地提交作業

火花提交--packages融爲一體。 amazonaws:aws-java-sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws:2.7.3 test.py

它爲什麼起作用s用命令行+ boto3,但火花塞住了嗎?

編輯:

同樣的問題,使用S3A://使用AWS-SDK 1.7.4和Hadoop與

hadoopConf = spark_context._jsc.hadoopConfiguration() 
hadoopConf.set("fs.s3a.access.key", "xxxx") 
hadoopConf.set("fs.s3a.secret.key", "xxxxxxx") 
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") 

和同樣的問題2.7.2

+0

閱讀此內容? https://www.cloudera.com/documentation/enterprise/latest/topics/spark_s3.html –

+0

我認爲它也適用於導出AWS_SECRET_ACCESS_KEY和AWS_ACCESS_KEY。創建憑證文件真的是必要的嗎?正如你所看到的,Spark正確地從env變量中選擇了AWS_ACCESS_KEY,但是由於原因未能進行身份驗證? – Johny19

+0

Spark分發。因爲你在一個執行者中有ENV變量,並不意味着其他執行者也有這個變量。您應該使用'SparkConf'設置值 –

回答

2

星火會自動複製您的AWS對s3n和s3a祕密的證書。 Apache Spark版本不會觸及s3:// URL,就像在Apache Hadoop中那樣,s3://模式與原始的,現在不推薦使用的s3客戶端相關聯,而s3客戶端與其他一切不兼容。

在Amazon EMR上,s3://綁定到亞馬遜EMR S3; EC2虛擬機將自動爲執行者提供祕密。所以我不認爲它與env var傳播機制有關。它可能也是它如何設置認證鏈,你不能覆蓋EC2/IAM數據。

如果你想談S3和你是不是在EMR VM運行,那麼想必你使用的是Apache的Spark與Apache Hadoop的JAR文件,而不是EMR版本。在這個世界中,使用s3a://獲取最新S3客戶端庫的URL:

如果這樣做不起作用,請查看the apache docs的疑難解答部分。有一個關於「403」的部分,包括推薦的故障排除步驟。這可能是由於classpath/JVM版本問題以及證書問題,甚至是客戶端和AWS之間的時鐘偏差。

+0

對不起,我忘了在originap文章中提到它,但我沒有在EMR中運行它(它在那裏工作),我在本地運行它,我將嘗試使用s3a :// – Johny19

+0

同樣的事情,但錯誤略有不同: 錯誤消息:狀態碼:403,AWS服務:Amazon S3,A WS請求ID:XXXX,AWS錯誤代碼:null,AWS錯誤消息:禁止 – Johny19

+0

好吧,S3A是ASF代碼。除了授權問題之外,它還可能因Joda時間和JVM版本之間的不兼容性而受到影響。我將通過指向相關文檔的鏈接編輯我的答案 –