Настройка разрешений корзины S3 при записи между 2 учетными записями AWS при запуске из Glue

#amazon-web-services #apache-spark #amazon-s3 #aws-glue

#amazon-веб-сервисы #apache-spark #amazon-s3 #aws-glue

Вопрос:

У меня есть scala jar, который я вызываю из задания AWS Glue. Мой jar пишет, чтобы записать фрейм данных в корзину S3 в другой учетной записи AWS, в которой включено шифрование KMS. Я могу выполнять запись в корзину, но не могу добавить разрешение владельца целевой корзины на доступ к файлам. Я могу добиться этого, если просто использую Glue Writer, но с прямой искрой это просто не работает. Я прочитал всю документацию и устанавливаю следующие политики корзины в конфигурации hadoop.

определение writeDataFrameInTargetLocation(SparkContext:SparkContext = null, DataFrame: DataFrame, местоположение: Строка, Формат файла: строка, Режим сохранения: строка, ключ шифрования:Опция[Строка] = Option.empty,kms_region:опция[Строка]=Опция («us-west-2»)): Единица измерения = {

if(EncryptionKey.IsDefined) { val region = if(kms_region.Определено) kms_region.getOrElse(«us-west-2») иначе «us-west-2»

     sparkContext.hadoopConfiguration.set("fs.s3.enableServerSideEncryption", "false")
    sparkContext.hadoopConfiguration.set("fs.s3.cse.enabled", "true")
    sparkContext.hadoopConfiguration.set("fs.s3.cse.encryptionMaterialsProvider", "com.amazon.ws.emr.hadoop.fs.cse.KMSEncryptionMaterialsProvider")
    sparkContext.hadoopConfiguration.set("fs.s3.cse.kms.keyId", encryptionKey.get) // KMS key to encrypt the data with
      sparkContext.hadoopConfiguration.set("fs.s3.cse.kms.region", region) // the region for the KMS key
    sparkContext.hadoopConfiguration.set("fs.s3.canned.acl", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl.default", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "bucket-owner-full-control")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "BucketOwnerFullControl")
  }
  else {
    sparkContext.hadoopConfiguration.set("fs.s3.canned.acl", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl.default", "BucketOwnerFullControl")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "bucket-owner-full-control")
    sparkContext.hadoopConfiguration.set("fs.s3.acl", "BucketOwnerFullControl")
  }

    val writeDF = dataFrame
      .repartition(5)
      .write

    
      writeDF
        .mode(saveMode)
        .option(Header, true)
        .format(fileFormat)
        .save(location)
    }
  

Комментарии:

1. с какой ошибкой вы столкнулись?

2. добавьте источник данных, а не просто добавьте информацию s3 в код.

3. Не получаю никаких ошибок, но владелец учетной записи, в которую я записываю данные, не может получить доступ. В нем говорится, что доступ запрещен. Я читал в документации, чтобы добавить их, но, похоже, это не работает. SparkContext.hadoopConfiguration.set(«fs.s3.canned.acl», «BucketOwnerFullControl») SparkContext.hadoopConfiguration.set(«fs.s3.acl.default», «BucketOwnerFullControl») SparkContext.hadoopConfiguration.set(«fs.s3.acl», «полный владелец корзины-control») SparkContext.hadoopConfiguration.set («fs.s3.acl», «BucketOwnerFullControl»)

Ответ №1:

Вероятно, вы используете реализацию S3AFileSystem для схемы « s3 » (т.Е. URL-адреса формы « s3://... «). Вы можете проверить это, просмотрев sparkContext.hadoopConfiguration.get("fs.s3.impl") . Если это так, то вам действительно нужно установить для свойств hadoop fs.s3a.* значение «не fs.s3.* «.

Тогда правильные настройки будут:

 sparkContext.hadoopConfiguration.set("fs.s3a.canned.acl", "BucketOwnerFullControl")
sparkContext.hadoopConfiguration.set("fs.s3a.acl.default", "BucketOwnerFullControl")
  

S3AFileSystem Реализация не использует ни одно из свойств в разделе « fs.s3 «. Вы можете убедиться в этом, изучив код, связанный со следующей ссылкой на исходный код hadoop:
https://github.com/apache/hadoop/blob/43e8ac60971323054753bb0b21e52581f7996ece/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Constants.java#L268