Доступ к двум учетным записям s3 в одном и том же сеансе spark с использованием Dynami c имел oop conf, получение доступа запрещено (403) - PullRequest
0 голосов
/ 11 января 2020

Это дополнительный вопрос по вопросу , который я задал, и этот вопрос более конкретно c о том, как получить доступ к двум учетным записям s3, используя один и тот же сеанс spark, путем динамического изменения конфигурации oop.

У меня есть две учетные записи s3, то есть A и B, и я использую конвейер EMR в учетной записи B, который будет читать csv из учетной записи A, записывать файл партера в корзину s3 в учетной записи B. Я не могу добавить политику роли / корзины для учетной записи А в ЭМИ. поэтому я использую учетные данные для доступа к учетной записи A и чтения файла CSV. Это я достиг, используя oop конфигурацию

    sc = SparkContext(appName="parquet_ingestion").getOrCreate()
    hadoop_config = sc._jsc.hadoopConfiguration()
    hadoop_config.set("fs.s3.awsAccessKeyId", dl_access_key)
    hadoop_config.set("fs.s3.awsSecretAccessKey", dl_secret_key)
    hadoop_config.set("fs.s3.awsSessionToken", dl_session_key)
    hadoop_config.set("fs.s3.path.style.access", "true");
    hadoop_config.set("mapreduce.fileoutputcommitter.algorithm.version", "2")

и запись в s3 учетной записи B с использованием динамически изменяемой конфигурации oop с использованием приведенной ниже конфигурации.

hadoop_config = sc._jsc.hadoopConfiguration()
hadoop_config.unset("fs.s3.awsAccessKeyId")
hadoop_config.unset("fs.s3.awsSecretAccessKey")
hadoop_config.unset("fs.s3.awsSessionToken")

Это прекрасно работает для ограниченное количество файлов, но когда я запускаю 50 заданий одновременно, то для некоторых 4/5 заданий он получает 403 Ошибка отказа в доступе. Остальная часть работы смогла создать файл паркета в s3-хранилище учетной записи B. При анализе я обнаружил, что во время записи файла паркета произошел сбой.

Я попросил команду поддержки AWS об этой ошибке в доступе, они сказал, что это не удалось при попытке выполнить операцию ListBukcet для учетной записи A во время write.so задание пытается получить доступ к учетной записи A с использованием роли EMR по умолчанию, поскольку учетные данные сброшены и не удалось.

С этой информацией я пришел к выводу, что oop unset не работает должным образом для некоторых заданий. В идеале он должен иметь запасной вариант для учетной записи B при написании паркета после того, как я сбросил ключ доступа и учетные данные.

py4j.GatewayConnection.run (GatewayConnection. java: 238) \ n at java .lang.Thread.run (Thread. java: 748) \ nОтзывается: org. apache .spark.SparkException: Задание прервано из-за сбоя этапа: Задача 0 на этапе Ошибка 1.0 4 раза, последняя ошибка: потерянная задача 0.3 на этапе 1.0 (TID 4, ip-172-31-31-212.ap-south-1.compute.internal, исполнитель 23): java .io.IOException : com.amazon.ws.emr.had oop .fs.shaded.com.amazon aws .services.s3.model.AmazonS3Exception: доступ запрещен (Сервис: Amazon S3; Код статуса: 403; Код ошибки: AccessDenied; Идентификатор запроса:

Вопрос: Как преодолеть эту ситуацию с помощью какой-либо конфигурации, чтобы установить для нее учетную запись по умолчанию (B)?

1 Ответ

0 голосов
/ 15 января 2020

unset странно в том случае, если происходит перезагрузка свойств по умолчанию, тогда unset переопределяется. Это ПИТА. если вы можете принудительно загрузить HDFS и конфигурации пряжи (новая HdfsConfiguration (); новая YarnConfiguration ()), то это должно вызвать больше загрузок, хотя Hive может играть в эту игру тоже

Если у вас есть разъем S3A на вашем CP, вы Можно установить данные для входа в систему отдельно для каждого сегмента - см. «Конфигурация каждого сегмента» в документации

...