aws доступ к s3 из искры с использованием роли IAM

Я хочу получить доступ к s3 из spark, я не хочу настраивать какие-либо секретные ключи и ключи доступа, я хочу получить доступ с настройкой роли IAM, поэтому я выполнил шаги, указанные в s3-spark.

Но все же он не работает из моего экземпляра EC2 (который работает автономно)

это работает, когда я тестировал

[ec2-user@ip-172-31-17-146 bin]$ aws s3 ls s3://testmys3/
2019-01-16 17:32:38        130 e.json

но это не сработало, когда я попробовал, как показано ниже

scala> val df = spark.read.json("s3a://testmys3/*")

Я получаю ошибку ниже

19/01/16 18:23:06 WARN FileStreamSink: Error while looking for metadata directory.
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: E295957C21AFAC37, AWS Error Code: null, AWS Error Message: Bad Request
  at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798)
  at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421)
  at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)
  at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528)
  at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.java:1031)
  at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.java:994)
  at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:297)
  at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669)
  at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
  at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
  at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
  at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
  at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
  at org.apache.spark.sql.execution.datasources.DataSource$.org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary(DataSource.scala:616)

person kcoder    schedule 16.01.2019    source источник
comment
У меня нет опыта в Spark, но что произойдет, если вы укажете сам файл как s3a: //testmys3/e.json   -  person sudo    schedule 16.01.2019
comment
Почему вы не используете для этого EMR?   -  person Thiago Baldim    schedule 17.01.2019
comment
@Thiago: возможно, он не использует EMR, потому что ему нужна собственная сборка Spark, а не тот форк с закрытым исходным кодом, который предлагает команда EMR, или использование искрового релиза, предоставленного ASF или кем-то еще. Или он хочет использовать коннектор S3A, который сейчас опережает коннектор s3 с закрытым исходным кодом EMR и поставляется с поддержкой stackoverflow и apache JIRA?   -  person stevel    schedule 17.01.2019


Ответы (3)


"400 Bad Request" довольно бесполезен, и S3 не только не дает многого, но и коннектор S3A не имеет большого значения для печати даты, связанной с аутентификацией. Есть большой раздел об устранении ошибки

Тот факт, что он дошел до запроса, означает, что у него есть некоторые учетные данные, только дальнему концу они не нравятся

Возможности

  • ваша роль IAM не имеет разрешений для s3: ListBucket. См. IAM. разрешения ролей для работы с s3a
  • у вас неправильное название ведра
  • Есть некоторые настройки в переменных fs.s3a или AWS_ env, которые имеют приоритет над ролью IAM, и они неверны.

Вы должны автоматически иметь аутентификацию IAM в качестве механизма аутентификации с соединителем S3A; это тот, который проверяется последним после: config & env vars.

  1. Посмотрите, что установлено в fs.s3a.aws.credentials.provider - оно должно быть отключено или содержать параметр com.amazonaws.auth.InstanceProfileCredentialsProvider
  2. предполагая, что у вас также есть hadoop в командной строке, возьмите storediag
hadoop jar cloudstore-0.1-SNAPSHOT.jar storediag s3a://testmys3/

он должен сбросить информацию об аутентификации.

Обновить

Как отмечалось на оригинальном плакате, это произошло из-за того, что на конкретной конечной точке S3 требуется проверка подлинности v4. Это можно включить в версии 2.7.x клиента s3a, но только через свойства системы Java. Для 2.8+ есть какие-то fs.s3a. параметры, которые вы можете установить вместо

person stevel    schedule 17.01.2019
comment
спасибо, он работал с приведенной ниже конфигурацией $. / spark-shell --packages com.amazonaws: aws-java-sdk: 1.7.4, org.apache.hadoop: hadoop-aws: 2.7.3 --conf spark.hadoop. fs.s3a.endpoint = s3.us-east-2.amazonaws.com --conf spark.hadoop.fs.s3a.impl = org.apache.hadoop.fs.s3a.S3AFileSystem --conf spark.hadoop.fs. s3a.aws.credentials.provider = com.amazonaws.auth.InstanceProfileCredentialsProvider --conf spark.executor.extraJavaOptions = -Dcom.amazonaws.services.s3.enableV4 = true --conf spark.driver.extraJavaOptions = -Dcom.amazonaws. services.s3.enableV4 = true - person kcoder; 17.01.2019
comment
Я понял. Конечная точка V4, такая как франкфурт, лондон, корея. Как вы обнаружили, в версии 2.7.x hadoop для этого требуются усилия. Есть явная поддержка в 2.8+ - person stevel; 18.01.2019

эта конфигурация работала

    ./spark-shell \
        --packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3 \
        --conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com \
spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.InstanceProfileCredentialsProvider \
        --conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true \
        --conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true  

person kcoder    schedule 17.01.2019
comment
Спасибо, это мне помогло. Небольшое примечание: мне удалось заставить это работать с зашифрованным KMS ведром S3, используя пакеты AWS из Hadoop 2.9.2: aws-java-sdk-bundle-1.11.199.jar и hadoop-aws-2.9.2 .банка - person vertigokidd; 07.05.2019
comment
Спасибо, это сработало. Я внес здесь некоторые изменения, ссылка - person Pranjal Gharat; 08.06.2020

  • шаг 1. для настройки фреймворка искрового контейнера, такого как Yarn core-site.xml. Затем перезапустите Yarn.

fs.s3a.aws.credentials.provider-- com.cloudera.com.amazonaws.auth.InstanceProfileCredentialsProvider

fs.s3a.endpoint-- s3-ap-northeast-2.amazonaws.com

fs.s3.impl-- org.apache.hadoop.fs.s3a.S3AFileSystem

  • шаг 2. искровую оболочку для проверки следующим образом.

val rdd=sc.textFile("s3a://path/file")
 rdd.count()
 rdd.take(10).foreach(println)

Меня устраивает

person peterpan    schedule 29.09.2020