Предоставление AWS_PROFILE при чтении файлов S3 с помощью Spark
Я хочу, чтобы мое приложение Spark (Scala) могло читать файлы S3
spark.read.parquet("s3://my-bucket-name/my-object-key")
На моей машине разработчика я мог получить доступ к файлам S3, используя предварительно настроенный профиль awscli в
~/.aws/config
или же
~/.aws/credentials
, нравиться:
aws --profile my-profile s3 ls s3://my-bucket-name/my-object-key
Но при попытке прочитать эти файлы из Spark с aws_profile, предоставленным как переменная env (AWS_PROFILE), я получил следующую ошибку:
doesBucketExist на my-bucket-name: com.amazonaws.AmazonClientException: учетные данные AWS не предоставлены BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider: com.amazonaws.SdkClientException: невозможно загрузить учетные данные конечной точки из службы
Также пытался предоставить профиль как вариант JVM (
-Daws.profile=my-profile
), но безуспешно.
Спасибо за прочтение.
3 ответа
Решение состоит в том, чтобы обеспечить свойство искры:
fs.s3a.aws.credentials.provider
, установив его на
com.amazonaws.auth.profile.ProfileCredentialsProvider
. Если бы я мог изменить код для создания Spark Session, то что-то вроде:
SparkSession
.builder()
.config("fs.s3a.aws.credentials.provider","com.amazonaws.auth.profile.ProfileCredentialsProvider")
.getOrCreate()
Другой способ - предоставить опцию JVM
-Dspark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.profile.ProfileCredentialsProvider
.
* ОБРАТИТЕ ВНИМАНИЕ на префикс
spark.hadoop
У меня было две проблемы, связанные с совместимостью Spark+AWS.
Во-первых, pyspark не видел профили, указанные в~/.aws/config
файл. Мне пришлось переместить его в~/.aws/credentials
чтобы искра хотя бы признала, что профиль существует. По крайней мере изнутриjupyter
и использованиеpyspark
.
Что еще более важно, sso/identity server является рекомендуемым способом доступа к AWS с локальных компьютеров, но настройка аутентификации на основе sso не поддерживаетсяs3a
цепь связи. Это объяснено в ответе на другой вопрос.
Если проблемы возникают еще после установки
fs.s3a.aws.credentials.provider
к
com.amazonaws.auth.profile.ProfileCredentialsProvider
и правильно настроить
AWS_PROFILE
, это может быть связано с тем, что вы используете Hadoop 2, для которого указанная выше конфигурация не поддерживается.
Поэтому единственным обходным решением, которое я нашел, было обновление до Hadoop 3.
Проверьте этот пост идокументы Hadoop для получения дополнительной информации.