Хранение Spark Scala S3: разрешение запрещено - PullRequest
0 голосов
/ 11 октября 2018

Я прочитал много тем в Интернете о том, как заставить работать Spark с S3, но ничего не работает должным образом.Я скачал: Spark 2.3.2 с hadoop 2.7 и выше .

Я скопировал только некоторые библиотеки из Hadoop 2.7.7 (что соответствует версии Spark / Hadoop) в папку jark Spark:

  • 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-адрес файла.Этот код дает мне следующий URL-адрес файла:

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

Как мне установить / настроить / загрузить, чтобы у spark была возможность читать и писать с моего сервера S3?

Редактировать 3:

Использование инструмента отладки в комментариях вот результат .
Похоже, проблема вс подписью не уверен, что это значит.

1 Ответ

0 голосов
/ 24 октября 2018

Сначала вам нужно скачать 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 .
Большое спасибоза драгоценную помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...