Hadoop 如何为Amazon EMR应用程序向S3发送的每个上传请求设置用户代理(前缀)
AWS要求我正在开发的产品识别它代表用户向S3资源发出的请求,以便他们能够评估其影响 为了实现这一点,我们必须为针对来自EMR应用程序的S3 bucket执行的每个上载请求设置用户代理头。我想知道如何才能做到这一点 Hadoop的文档提到了Hadoop 如何为Amazon EMR应用程序向S3发送的每个上传请求设置用户代理(前缀),hadoop,amazon-emr,Hadoop,Amazon Emr,AWS要求我正在开发的产品识别它代表用户向S3资源发出的请求,以便他们能够评估其影响 为了实现这一点,我们必须为针对来自EMR应用程序的S3 bucket执行的每个上载请求设置用户代理头。我想知道如何才能做到这一点 Hadoop的文档提到了fs.s3a.user.agent.prefix属性()。但是,协议s3a似乎已被弃用(),因此我不确定此属性是否有效 为了给我需要做的更多的上下文,使用AWS Java SDK,可以设置用户代理头的前缀,例如: AWSCredentials凭证; Clien
fs.s3a.user.agent.prefix
属性()。但是,协议s3a
似乎已被弃用(),因此我不确定此属性是否有效
为了给我需要做的更多的上下文,使用AWS Java SDK,可以设置用户代理头的前缀,例如:
AWSCredentials凭证;
ClientConfiguration=newclientconfiguration()
.使用UserAgentPrefix(“APN/1.0合作伙伴/1.0产品/1.0”);
AmazonS3Client客户端=新的AmazonS3Client(凭证,配置);
然后,每个请求的用户代理http头将有一个类似的值:APN/1.0 PARTNER/1.0 PRODUCT/1.0,aws sdk java/1.11.234 Linux/4.15.0-58-generic java\u HotSpot(TM)\u 64位服务器\u VM/25.201-b09 java/1.8.0\u 201
。在从EMR应用程序上载文件时,我需要实现类似的功能。在ASF hadoop中,S3A并不是不受欢迎的;我会争辩说,它现在领先于EMR自己的连接器。如果您使用的是EMR,您可能能够使用它,否则您就可以使用它们实现的内容
FWIW在S3A中,我们正在研究如何实际动态地更改特定查询的头,以便您超越特定用户,在共享集群中执行特定的配置单元/火花查询。但是,这样做相当复杂,因为您需要在每个请求设置上执行此操作。在我的案例中,解决方案是在提交给EMR作业的JAR中包含一个
awssdk\u config\u default.json
文件。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中使用此配置文件的类:
fs.s3a.user.agent.prefix
设置用户代理。最后,通过在提交给EMR的JAR中包含awssdk\u config\u default.json
文件,我使它能够工作