spark+emrfs/s3-有没有一种方法可以读取客户端加密数据并使用服务器端加密将其写回?

o2gm4chl  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(589)

我在spark中有一个用例,我必须从使用客户端加密的s3中读取数据,处理数据,然后仅使用服务器端加密将其写回。我想知道在spark有没有办法?
目前,我设置了以下选项:

spark.hadoop.fs.s3.cse.enabled=true
spark.hadoop.fs.s3.enableServerSideEncryption=true
spark.hadoop.fs.s3.serverSideEncryption.kms.keyId=<kms id here>

但很明显,它在编写数据时同时使用了cse和sse。所以,我想知道有没有可能在阅读时只将spark.hadoop.fs.s3.cse.enabled设置为true,然后将其设置为false或者其他替代方法。
谢谢你的帮助。

iyzzxitl

iyzzxitl1#

使用编程配置定义多个s3文件系统:

spark.hadoop.fs.s3.cse.enabled=true
spark.hadoop.fs.s3sse.impl=foo.bar.S3SseFilesystem

然后为添加自定义实现 s3sse :

package foo.bar

import java.net.URI

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.s3a.S3AFileSystem

class S3SseFilesystem extends S3AFileSystem {
  override def initialize(name: URI, originalConf: Configuration): Unit = {
    val conf = new Configuration()
    // NOTE: no prefix spark.hadoop here
    conf.set("fs.s3.enableServerSideEncryption", "true")
    conf.set("fs.s3.serverSideEncryption.kms.keyId", "<kms id here>")
    super.initialize(name, conf)
  }
}

在此之后,自定义文件系统可以与spark一起使用 read 方法

spark.read.json("s3sse://bucket/prefix")

相关问题