首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为每个从Amazon应用程序上传到S3的请求设置用户代理(前缀)

如何为每个从Amazon应用程序上传到S3的请求设置用户代理(前缀)
EN

Stack Overflow用户
提问于 2019-09-06 21:33:43
回答 2查看 665关注 0票数 1

AWS已经要求我正在开发的产品识别它代表他们向我们的用户的S3资源发出的请求,以便他们能够评估其影响。

为了实现这一点,我们必须为针对来自EMR应用程序的S3桶完成的每个上传请求设置用户代理头。我想知道这是怎么实现的?

Hadoop的文档提到了fs.s3a.user.agent.prefix属性(core-default.xml)。但是,协议s3a似乎被否决了(使用存储和文件系统),所以我不确定这个属性是否能工作。

为了提供更多的上下文,我需要使用AWS,可以设置用户代理头的前缀,例如:

代码语言:javascript
复制
AWSCredentials credentials;
ClientConfiguration conf = new ClientConfiguration()
    .withUserAgentPrefix("APN/1.0 PARTNER/1.0 PRODUCT/1.0");
AmazonS3Client client = new AmazonS3Client(credentials, conf);

然后,每个请求的用户代理http报头都有一个类似于: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应用程序上传文件时,我需要实现类似的目标。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-17 17:02:26

在我的例子中,解决方案是在提交给EMR作业的JAR中包含一个awssdk_config_default.json文件。此文件由AWS使用,允许开发人员覆盖某些自定义设置。

我在提交给EMR的JAR中添加了这个json文件,内容如下:

代码语言:javascript
复制
{
  "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的S3中的文件时,AWS使用EMRFS。我意识到这是因为在AWS EMR中引发的异常,有时我会看到,它的堆栈跟踪的一部分是:

代码语言:javascript
复制
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)

我把答案发到将来的推荐信上。一些利益联系:

票数 0
EN

Stack Overflow用户

发布于 2019-09-07 13:52:48

S3A在ahead中不受欢迎;我将争辩说,它现在领先于EMR自己的连接器。如果您正在使用EMR,您可能可以使用它,否则您就可以使用它们实现的内容。

在S3A中,我们将研究如何动态地更改特定查询的标头,因此您将超越特定用户,使用共享集群中的特定单元格/火花查询。但是,要做到这一点相当复杂,因为您需要在每个请求设置上这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57828760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档