Я использую команду 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.