AWS доступ к S3 от искры с использованием роли IAM - PullRequest
0 голосов
/ 16 января 2019

Я хочу получить доступ к s3 из спарка, я не хочу настраивать секретные ключи и ключи доступа, я хочу получить доступ к настройке роли 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)

Ответы [ 2 ]

0 голосов
/ 17 января 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 \
    --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  
0 голосов
/ 17 января 2019

«400 Bad Request» довольно бесполезен, и S3A не только мало что дает, но и S3A-соединитель не печатает даты, связанные с аутентификацией. * * * * * * * * * * * * * * * * * * * * * * * * * *.

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

Возможности

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

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

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

он должен сбросить данные о проверке подлинности.

Обновление

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

...