Сначала вам нужно скачать aws-hadoop.jar и aws-java-sdk.jar, которые соответствуют установке вашего выпуска spark-hadoop, и добавить их в папку jars
внутри папки spark.
Затем выпотребуется указать сервер, который вы будете использовать, и включить стиль пути, если ваш сервер 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 .
Большое спасибоза драгоценную помощь.