Как установить User-Agent (префикс) для каждого запроса на загрузку на S3 из приложения Amazon EMR

AWS потребовал, чтобы продукт, над которым я работаю, определял запросы, которые он отправляет к ресурсам S3 наших пользователей от их имени, чтобы они могли оценить их влияние.

Для этого мы должны установить заголовок User-Agent для каждого запроса на загрузку, выполняемого для корзины S3 из приложения EMR. Мне интересно, как этого можно добиться?

В документе Hadoop упоминается свойство fs.s3a.user.agent.prefix (core-default.xml). Однако протокол s3a кажется устаревшим (Работа с хранилищем и файловыми системами), поэтому я не уверен, что это свойство будет работать.

Чтобы дать немного больше контекста, что мне нужно сделать, с помощью AWS Java SDK можно установить префикс заголовка User-Agent, например:

AWSCredentials credentials;
ClientConfiguration conf = new ClientConfiguration()
    .withUserAgentPrefix("APN/1.0 PARTNER/1.0 PRODUCT/1.0");
AmazonS3Client client = new AmazonS3Client(credentials, conf);

Затем HTTP-заголовок User-Agent каждого запроса будет иметь значение, подобное: APN/1.0 PARTNER/1.0 PRODUCT/1.0, aws-sdk-java/1.11.234 Linux/4.15.0-58-generic Java_HotSpot(TM)_64-Bit_Server_VM/25.201-b09 java/1.8.0_201. Мне нужно добиться чего-то подобного при загрузке файлов из приложения EMR.


person RemeR    schedule 06.09.2019    source источник


Ответы (2)


S3A не считается устаревшим в ASF Hadoop; Я утверждаю, что теперь он опережает возможности собственного разъема EMR. Если вы используете EMR, вы можете использовать его, в противном случае вам придется работать с тем, что они реализуют.

FWIW в S3A мы смотрим на то, что потребуется для фактического динамического изменения заголовка для определенного запроса, поэтому вы выходите за рамки конкретных пользователей для конкретных запросов hive/spark в общих кластерах. Однако сделать это довольно сложно, так как вам нужно сделать это для каждого запроса.

person stevel    schedule 07.09.2019
comment
Привет @steve-loughran, спасибо за ответ, но это не сработало. Свойство fs.s3a.user.agent.prefix не использовалось EMR для установки User-Agent при загрузке файлов на S3. Наконец, я заставил его работать, включив файл awssdk_config_default.json в JAR, отправленный в EMR. - person RemeR; 17.09.2019

Решение в моем случае состояло в том, чтобы включить файл awssdk_config_default.json в JAR, отправленный на задание EMR. Этот файл используется AWS SDK, чтобы позволить разработчикам переопределять некоторые пользовательские настройки.

Я добавил этот файл json в JAR, отправленный в EMR, с таким содержимым:

{
  "userAgentTemplate": "APN/1.0 PARTNER/1.0 PRODUCT/1.0 aws-sdk-{platform}/{version} {os.name}/{os.version} {java.vm.name}/{java.vm.version} java/{java.version}{language.and.region}{additional.languages} vendor/{java.vendor}"
}

Примечание: передача свойства fs.s3a.user.agent.prefix в задание EMR не сработала. AWS EMR использует EMRFS при обработке файлов, хранящихся в хранилище S3, в котором используется AWS SDK. Я понял это из-за исключения, генерируемого в AWS EMR, которое я иногда вижу, часть его трассировки стека была:

Caused by: java.lang.ExceptionInInitializerError: null
    at com.amazon.ws.emr.hadoop.fs.files.TemporaryDirectoriesGenerator.createAndTrack(TemporaryDirectoriesGenerator.java:144)
    at com.amazon.ws.emr.hadoop.fs.files.TemporaryDirectoriesGenerator.createTemporaryDirectories(TemporaryDirectoriesGenerator.java:93)
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.create(S3NativeFileSystem.java:616)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:932)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:825)
    at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.create(EmrFileSystem.java:217)
    at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:135)

Я публикую ответ здесь для будущих ссылок. Ссылки на некоторые интересы:

person RemeR    schedule 17.09.2019