To be able to use custom endpoints with the latest Spark distribution, one needs to add an external package (hadoop-aws
). Then, custum endpoints can be configured according to docs.
bin/spark-shell --packages org.apache.hadoop:hadoop-aws:2.7.2
Add this to your application, or in the spark-shell
:
sc.hadoopConfiguration.set("fs.s3a.endpoint", "<<ENDPOINT>>");
sc.hadoopConfiguration.set("fs.s3a.access.key","<<ACCESS_KEY>>");
sc.hadoopConfiguration.set("fs.s3a.secret.key","<<SECRET_KEY>>");
If your endpoint doesn't support HTTPS, then you'll need the following:
sc.hadoopConfiguration.set("fs.s3a.connection.ssl.enabled", "false");
You can use s3a urls like this:
s3a://<<BUCKET>>/<<FOLDER>>/<<FILE>>
Also, it is possible to use the credentials in the path:
s3a://<<ACCESS_KEY>>:<<SECRET_KEY>>@<<BUCKET>>/<<FOLDER>>/<<FILE>>
It was this simple! Incredible. Took me a few days to stumble upon this. Thank you !
For PySpark, you don't have direct access to
sc.hadoopContext
so you have to use (from here):