Hadoop distcp Учетные данные AWS не предоставлены

У меня есть огромное количество файлов S3, которые я хочу поместить в HDFS. Учитывая количество задействованных файлов, я предпочитаю использовать «распределенную копию». Однако по какой-то причине я не могу заставить hadoop distcp использовать мои учетные данные Amazon S3. Я использую команду:

hadoop distcp -update s3a://[bucket]/[folder]/[filename] hdfs:///some/path/ -D fs.s3a.awsAccessKeyId=[keyid] -D fs.s3a.awsSecretAccessKey=[secretkey] -D fs.s3a.fast.upload=true

Однако это действует так же, как если бы аргументов «-D» не было.

ERROR tools.DistCp: Exception encountered
java.io.InterruptedIOException: doesBucketExist on [bucket]: com.amazonaws.AmazonClientException: No AWS Credentials provided by BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider : com.amazonaws.SdkClientException: Unable to load credentials from service endpoint

Я просмотрел документацию по Hadoop distcp, но не нашел там решения, почему это не работает. Я пробовал -Dfs.s3n.awsAccessKeyId в качестве флага, который тоже не работал. Я читал, что явная передача учетных данных не является хорошей практикой, так что, может быть, это просто какое-то джентльменское предложение сделать это по-другому?

Как предполагается передавать учетные данные S3 с помощью distcp? Кто-нибудь знает?


person Koen De Couck    schedule 23.11.2017    source источник
comment
Вы не должны использовать пробелы после -D, но вы также не должны передавать их через командную строку. Почему они не указаны в вашем файле core-site.xml или определены как переменные среды?   -  person OneCricketeer    schedule 23.11.2017


Ответы (3)


Похоже, формат флагов учетных данных изменился по сравнению с предыдущей версией. Работает следующая команда:

hadoop distcp \
  -Dfs.s3a.access.key=[accesskey] \
  -Dfs.s3a.secret.key=[secretkey] \
  -Dfs.s3a.fast.upload=true \
  -update \
  s3a://[bucket]/[folder]/[filename] hdfs:///some/path
person Koen De Couck    schedule 23.11.2017
comment
Что вы имеете в виду под форматом? -D — это стандартный флаг Java, а пробелы рассматриваются как отдельные аргументы. - person OneCricketeer; 23.11.2017
comment
Не обращайте внимания на флаг -D, я взял его с какого-то плохого сайта с документацией, и это явно был отвлекающий маневр. Формат старых флагов был Dfs.s3n.awsAccessKeyId и Dfs.s3n.awsSecretAccessKey. Видимо теперь это Dfs.s3a.access.key и Dfs.s3a.secret.key - person Koen De Couck; 24.11.2017

В случае, если кто-то пришел с той же ошибкой, используя -D hadoop.security.credential.provider.path, убедитесь, что ваше хранилище учетных данных (файл jceks) находится в распределенной файловой системе (hdfs), поскольку distcp запускается с одного из узлов диспетчера узлов, чтобы он мог получить к нему доступ.

person Bhargav Kosaraju    schedule 19.12.2018

Мне помог ответ Коэна, вот моя версия.

hadoop distcp \
  -Dfs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider \
  -Dfs.s3a.access.key=[accesskey] \
  -Dfs.s3a.secret.key=[secretkey] \
  -Dfs.s3a.session.token=[sessiontoken] \
  -Dfs.s3a.fast.upload=true \
  hdfs:///some/path s3a://[bucket]/[folder]/[filename] 
person Pavan_Obj    schedule 01.03.2021