如何为amazon emr应用程序向s3的每个上传请求设置用户代理(前缀)

knpiaxh1  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(465)

aws要求我正在开发的产品能够识别它代表用户向s3资源发出的请求,以便他们能够评估它的影响。
为了实现这一点,我们必须为针对来自emr应用程序的s3 bucket执行的每个上传请求设置user-agent头。我想知道如何才能做到这一点?
hadoop的医生提到 fs.s3a.user.agent.prefix 属性(core default.xml)。然而,协议 s3a 似乎已弃用(用于存储和文件系统),因此我不确定此属性是否有效。
为了给我需要做的更多的上下文,使用aws java sdk,可以设置用户代理头的前缀,例如:

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 . 我需要实现类似的东西时,上传文件从电子病历应用程序。

yrdbyhpb

yrdbyhpb1#

s3a在asf hadoop中没有被弃用;我要说的是,它现在领先于emr自己的连接器。如果您使用的是emr,您可能可以使用它,否则您就可以使用它们实现的内容。
fwiw在s3a中,我们正在研究如何动态地更改特定查询的头,这样您就可以超越特定用户,在共享集群中实现特定的hive/spark查询。但要做到这一点相当复杂,因为您需要在每个请求设置上进行。

ws51t4hk

ws51t4hk2#

在我的案例中,解决方案是包括 awssdk_config_default.json 提交给emr作业的jar中的文件。aws sdk使用此文件来允许开发人员覆盖某些自定义设置。
我在提交给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 emr在处理存储在使用aws sdk的s3中的文件时使用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)

我把答案贴在这里以备将来参考。一些兴趣链接:
aws sdk中使用此配置文件的类:internalconfig.java
https://stackoverflow.com/a/31173739/1070393
电子病历

相关问题