2017-02-20 30 views
3

Я использую команду RunJobFlow, чтобы развернуть кластер Spark EMR. Эта команда устанавливает JobFlowRole в роль IAM, которая имеет политики AmazonElasticMapReduceforEC2Role и AmazonRedshiftReadOnlyAccess. Первая политика содержит действие, разрешающее все разрешения s3.EMR Spark не удалось сохранить DataFrame в S3

Когда экземпляры EC2 разворачиваются, они принимают эту роль IAM и генерируют временные учетные данные через STS.

Первое, что я делаю, - это прочитать таблицу из моего кластера Redshift в Spark Dataframe с использованием формата com.databricks.spark.redshift и использовать ту же самую роль IAM, чтобы выгрузить данные из красного смещения, как это было сделано для EMR JobFlowRole.

Насколько я понимаю, это запускает команду UNLOAD на Redshift для сбрасывания в ведро S3, которое я указываю. Затем Spark загружает вновь выгруженные данные в Dataframe. Я использую рекомендуемый протокол s3n:// для опции tempdir.

Эта команда отлично работает и всегда успешно загружает данные в Dataframe.

Затем я запускаю некоторые преобразования и пытаюсь сохранить данные в формате csv в том же ведро S3. Красное смещение Unloaded в.

Однако, когда я пытаюсь сделать это, он бросает следующую ошибку

java.lang.IllegalArgumentException: AWS Access Key ID and Secret Access Key must be specified as the username or password (respectively) of a s3n URL, or by setting the fs.s3n.awsAccessKeyId or fs.s3n.awsSecretAccessKey properties (respectively)

Хорошо. Поэтому я не знаю, почему это происходит, но я попытался взломать его, установив рекомендуемые параметры конфигурации приложения. Затем я использовал DefaultAWSCredentialsProviderChain загрузить AWSAccessKeyID и AWSSecretKey и установить через

spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", <CREDENTIALS_ACCESS_KEY>) spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", <CREDENTIALS_SECRET_ACCESS_KEY>)

Когда я запускаю его снова выдает следующее сообщение об ошибке:

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId;

Хорошо. Так что это не сработало. Затем я удалил настройки конфигурации Hadoop и зашиты учетные данные СИА пользователя в s3 URL через s3n://ACCESS_KEY:[email protected]/KEY

Когда я побежал этого выплюнуть следующее сообщение об ошибке:

java.lang.IllegalArgumentException: Bucket name should be between 3 and 63 characters long

Так он пытался создать ведро .. Это, безусловно, не то, что мы хотим.

Я действительно застрял на этом и был бы очень признателен за любую помощь здесь! Он отлично работает, когда я запускаю его локально, но полностью не работает на EMR.

ответ

0

На Amazon EMR попробуйте использовать префикс s3: // для ссылки на объект в S3.

Это a long story.

1

Проблема заключалась в следующем:

  • EC2 Instance Сформирован Временные учетные данные на ЭМИ Bootstrap фазы
  • Когда переспросила я RedShift, я передал aws_iam_role водителю theDatabricks. Затем драйвер повторно создал временные учетные данные для той же самой роли IAM. Это аннулирует учетные данные экземпляра EC2.
  • Затем я попытался загрузить на S3, используя старые учетные данные (и учетные данные, которые были сохранены в метаданных экземпляра)

Он потерпел неудачу, потому что он пытается использовать неприменяющееся полномочие.

Решение было удалить красное смещение разрешения через aws_iam_role и заменить его следующим:

val credentials = EC2MetadataUtils.getIAMSecurityCredentials ... .option("temporary_aws_access_key_id", credentials.get(IAM_ROLE).accessKeyId) .option("temporary_aws_secret_access_key", credentials.get(IAM_ROLE).secretAccessKey) .option("temporary_aws_session_token", credentials.get(IAM_ROLE).token)