如何使用服务器端加密将spark rdd写入S3

时间:2017-09-08 09:29:46

标签: apache-spark encryption amazon-s3

我正在尝试使用服务器端加密将RDD写入S3。 以下是我的一段代码。

val sparkConf = new SparkConf().
  setMaster("local[*]").
  setAppName("aws-encryption")
val sc = new SparkContext(sparkConf)
sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", AWS_ACCESS_KEY)
sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", AWS_SECRET_KEY)
sc.hadoopConfiguration.setBoolean("fs.s3n.sse.enabled", true)
sc.hadoopConfiguration.set("fs.s3n.enableServerSideEncryption", "true")
sc.hadoopConfiguration.setBoolean("fs.s3n.enableServerSideEncryption", true)
sc.hadoopConfiguration.set("fs.s3n.sse", "SSE-KMS")
sc.hadoopConfiguration.set("fs.s3n.serverSideEncryptionAlgorithm", "SSE-KMS")
sc.hadoopConfiguration.set("fs.s3n.server-side-encryption-algorithm", "SSE-KMS")
sc.hadoopConfiguration.set("fs.s3n.sse.kms.keyId", KMS_ID)
sc.hadoopConfiguration.set("fs.s3n.serverSideEncryptionKey", KMS_ID)

val rdd = sc.parallelize(Seq("one", "two", "three", "four"))
rdd.saveAsTextFile(s"s3n://$bucket/$objKey")

此代码在S3上编写RDD但没有加密。 [我已经检查了写入对象的属性,它显示服务器端加密的是"没有"。] 我在这里跳过任何东西或者错误地使用任何属性吗?

任何建议都将不胜感激。

P.S。我设置了不同名称的相同属性,原因是我不知道何时使用哪个名称,例如

sc.hadoopConfiguration.setBoolean("fs.s3n.sse.enabled", true)
sc.hadoopConfiguration.set("fs.s3n.enableServerSideEncryption", "true")
sc.hadoopConfiguration.setBoolean("fs.s3n.enableServerSideEncryption", true)

谢谢。

1 个答案:

答案 0 :(得分:1)

  1. 停止使用s3n,切换到s3a。我不记得s3n对加密的作用,但你应该单独进行性能和扩展。
  2. 从SSE-S3开始,通过SSE-KMS,因为它更容易设置
  3. 通过相关的s3a属性(见下文)
  4. 在客户端启用加密
  5. 添加存储桶策略以强制执行加密。这可以确保所有客户端始终设置正确。
  6. 示例政策 xml <property> <name>fs.s3a.server-side-encryption-algorithm</name> <value>AES256</value> </property>

    Working with Encrypted Amazon S3 Data;这些是目前(2017年9月)使用s3a和amp;加密S3的最佳文档。 hadoop,spark&amp;蜂房

    AWS EMR读者:这些都不适用于您。切换到Apache Hadoop或查找EMR文档。