Spark/Hadoop - 无法使用服务器端加密保存到s3

sta*_*ash 6 encryption hadoop amazon-s3 emr apache-spark

我正在运行AWS EMR Cluster来运行spark作业.为了使用s3存储桶,hadoop配置设置了access-keys,secret-key,enableServerSideEncryption和用于加密的算法.请参阅下面的代码

val hadoopConf = sc.hadoopConfiguration; hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem") hadoopConf.set("fs.s3.awsAccessKeyId", "xxx") hadoopConf.set("fs.s3.awsSecretAccessKey", "xxx") hadoopConf.set("fs.s3.enableServerSideEncryption", "true") hadoopConf.set("fs.s3.serverSideEncryptionAlgorithm","AES256")

在上述配置下,火花程序能够从s3桶读取,执行处理.但是当它试图将结果保存到s3时失败,这强制了数据必须加密.如果存储桶允许未加密的数据,则保存成功未加密.

即使使用强制执行服务器端加密的选项构建群集,也会发生这种情况--emrfs Encryption=ServerSide,Args=[fs.s3.serverSideEncryptionAlgorithm=AES256].

从emr到s3的hdfs的hadoop distcp也失败了.但是,当使用--s3ServerSideEncryption选项设置时,s3-dist-copy(aws版本hdfs distcp)工作成功.

但是,ec2实例具有必需的角色权限,可以使用服务器端加密将数据上载到同一个存储桶,而无需使用任何用户访问密钥.请参阅下面的示例命令.如果在下面的命令中省略了-sse,它将抛出"访问被拒绝错误".

aws s3 cp test.txt s3://encrypted-bucket/ —sse

如果有人可以帮助解决spark/hadoop中所需的配置以将数据保存到具有服务器端加密的aws s3,将会很有帮助.

sta*_*ash 4

现在这个问题已经解决了。--emrfs没有正确应用配置。但下面的选项适用aws emr create-cluster于 Spark 和hadoop distcp.

--configurations '[{"Classification":"emrfs-site","Properties":{"fs.s3.enableServerSideEncryption":"true"},"Configurations":[]}]'

由于 ec2 实例已使用角色配置文件设置为从存储桶读取/写入,因此我的 Spark 代码无需提供 aws 访问密钥即可运行。

更多 emr 配置选项可用,可与http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-configure-apps.html--configuration的选项一起使用emr create-cluster

我不确定为什么 aws emr 提供了 2 个选项来完成同样的事情。一种有效,另一种无效。