爲了訪問我的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
閱讀此內容? https://www.cloudera.com/documentation/enterprise/latest/topics/spark_s3.html –
我認爲它也適用於導出AWS_SECRET_ACCESS_KEY和AWS_ACCESS_KEY。創建憑證文件真的是必要的嗎?正如你所看到的,Spark正確地從env變量中選擇了AWS_ACCESS_KEY,但是由於原因未能進行身份驗證? – Johny19
Spark分發。因爲你在一個執行者中有ENV變量,並不意味着其他執行者也有這個變量。您應該使用'SparkConf'設置值 –