Предоставление 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 для получения дополнительной информации.

Другие вопросы по тегам