Scala 如何在AWS EMR上设置Hadoop fs.s3a.acl.default?

Scala 如何在AWS EMR上设置Hadoop fs.s3a.acl.default?,scala,apache-spark,hadoop,amazon-s3,amazon-emr,Scala,Apache Spark,Hadoop,Amazon S3,Amazon Emr,我有一个在AWS EMR上运行的map reduce应用程序,它将一些输出写入不同的(AWS帐户)s3存储桶。我有权限设置,作业可以写入外部bucket,但所有者仍然是运行Hadoop作业的帐户的root。我想将此更改为拥有bucket的外部帐户 我发现我可以将fs.s3a.acl.default设置为bucket owner-full-control,但这似乎不起作用。这就是我正在做的: conf.set("fs.s3a.acl.default", "bucket-owner-full-con

我有一个在AWS EMR上运行的map reduce应用程序,它将一些输出写入不同的(AWS帐户)s3存储桶。我有权限设置,作业可以写入外部bucket,但所有者仍然是运行Hadoop作业的帐户的
root
。我想将此更改为拥有bucket的外部帐户

我发现我可以将
fs.s3a.acl.default
设置为
bucket owner-full-control
,但这似乎不起作用。这就是我正在做的:

conf.set("fs.s3a.acl.default", "bucket-owner-full-control");
FileSystem fileSystem = FileSystem.get(URI.create(s3Path), conf);
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path(filePath));
PrintWriter writer  = new PrintWriter(fsDataOutputStream);
writer.write(contentAsString);
writer.close();
fsDataOutputStream.close();
感谢您的帮助

conf.set("fs.s3a.acl.default", "bucket-owner-full-control");
是您正在设置的正确属性

因此,可以使用core-site.xml中的属性来完全控制bucket所有者

<property>
  <name>fs.s3a.acl.default</name>
  <description>Set a canned ACL for newly created and copied objects. Value may be private,
     public-read, public-read-write, authenticated-read, log-delivery-write,
     bucket-owner-read, or bucket-owner-full-control.</description>
</property>

我建议将
fs.s3.canned.acl
也设置为value
BucketOwnerFullControl

为了进行调试,您可以使用下面的代码段来了解实际传递的参数

for (Entry<String, String> entry: conf) {
      System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
    }
如果这可以通过api实现,那么它也可以

Spark奖励积分,对Spark scala用户有用: 让Spark访问s3文件系统并设置正确的配置,如下面的示例

val hadoopConf = spark.sparkContext.hadoopConfiguration
    hadoopConf.set("fs.s3a.fast.upload","true")
    hadoopConf.set("mapreduce.fileoutputcommitter.algorithm.version","2")
    hadoopConf.set("fs.s3a.server-side-encryption-algorithm", "AES256")
    hadoopConf.set("fs.s3a.canned.acl","BucketOwnerFullControl")
    hadoopConf.set("fs.s3a.acl.default","BucketOwnerFullControl")

如果您使用的是EMR,那么您必须使用AWS团队的S3连接器和“S3://”URL,并使用其记录的配置选项。它们不支持ApacheOne,因此在开始时带有“fs.s3a”的任何选项都不会产生任何效果。

正如Stevel在回答中提到的,对于使用pyspark的EMR,请使用此选项

sc=spark.sparkContext
hadoop_conf=sc._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3.canned.acl","BucketOwnerFullControl")
罐装ACL说明

BucketOwnerFullControl指定授予存储桶的所有者 权限。完全控制。桶的所有者不一定是 与对象的所有者相同


确定这是您需要发送的属性是否有任何异常?没有异常,但所有者仍然是编写帐户,而不是保存存储桶的帐户。只需做一件事,为(Entry-Entry:conf){System.out.printf(“%s=%s\n”,Entry.getKey(),Entry.getValue());}打印所有道具还确认这是正确的道具。我想还有其他地方是打电话的谢谢,让我试试看道具。谢谢,看起来像是
fs.s3.canted.acl
to
BucketOwnerFullControl
成功了!奇怪的是,一个需要
bucket owner完全控制
,而另一个
BucketOwnerFullControl
如果您试图为其他人提供帮助,请删除fs.s3a.impl行;这只是一种堆栈溢出迷信,实际上并不需要。谢谢你的留言!!
val hadoopConf = spark.sparkContext.hadoopConfiguration
    hadoopConf.set("fs.s3a.fast.upload","true")
    hadoopConf.set("mapreduce.fileoutputcommitter.algorithm.version","2")
    hadoopConf.set("fs.s3a.server-side-encryption-algorithm", "AES256")
    hadoopConf.set("fs.s3a.canned.acl","BucketOwnerFullControl")
    hadoopConf.set("fs.s3a.acl.default","BucketOwnerFullControl")
sc=spark.sparkContext
hadoop_conf=sc._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3.canned.acl","BucketOwnerFullControl")