我正在运行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,将会很有帮助.