Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何为Amazon EMR应用程序向S3发送的每个上传请求设置用户代理(前缀)_Hadoop_Amazon Emr - Fatal编程技术网

Hadoop 如何为Amazon EMR应用程序向S3发送的每个上传请求设置用户代理(前缀)

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

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

为了实现这一点,我们必须为针对来自EMR应用程序的S3 bucket执行的每个上载请求设置用户代理头。我想知道如何才能做到这一点

Hadoop的文档提到了
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中使用此配置文件的类:

Hi@steve loughran谢谢你的回答,但它不起作用。将文件上载到S3时,EMR未使用属性
fs.s3a.user.agent.prefix
设置用户代理。最后,通过在提交给EMR的JAR中包含
awssdk\u config\u default.json
文件,我使它能够工作