AWS已经要求我正在开发的产品识别它代表他们向我们的用户的S3资源发出的请求,以便他们能够评估其影响。
为了实现这一点,我们必须为针对来自EMR应用程序的S3桶完成的每个上传请求设置用户代理头。我想知道这是怎么实现的?
Hadoop的文档提到了fs.s3a.user.agent.prefix属性(core-default.xml)。但是,协议s3a似乎被否决了(使用存储和文件系统),所以我不确定这个属性是否能工作。
为了提供更多的上下文,我需要使用AWS,可以设置用户代理头的前缀,例如:
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应用程序上传文件时,我需要实现类似的目标。
发布于 2019-09-17 17:02:26
在我的例子中,解决方案是在提交给EMR作业的JAR中包含一个awssdk_config_default.json文件。此文件由AWS使用,允许开发人员覆盖某些自定义设置。
我在提交给EMR的JAR中添加了这个json文件,内容如下:
{
"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中引发的异常,有时我会看到,它的堆栈跟踪的一部分是:
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)我把答案发到将来的推荐信上。一些利益联系:
发布于 2019-09-07 13:52:48
S3A在ahead中不受欢迎;我将争辩说,它现在领先于EMR自己的连接器。如果您正在使用EMR,您可能可以使用它,否则您就可以使用它们实现的内容。
在S3A中,我们将研究如何动态地更改特定查询的标头,因此您将超越特定用户,使用共享集群中的特定单元格/火花查询。但是,要做到这一点相当复杂,因为您需要在每个请求设置上这样做。
https://stackoverflow.com/questions/57828760
复制相似问题