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

标签 hadoop encryption amazon-s3 apache-spark emr

我正在运行 AWS EMR 集群来运行 spark 作业。为了使用 s3 存储桶,hadoop 配置设置了访问 key 、 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")

在上面的配置下,spark程序可以从s3 bucket中读取数据,进行处理。但是当它尝试将结果保存到 s3 时失败,这强制要求必须对数据进行加密。如果桶允许未加密的数据,那么它被成功保存未加密。

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

从 emr 上的 hdfs 到 s3 的 hadoop distcp 也失败了。但是,当使用 --s3ServerSideEncryption 选项设置时,s3-dist-copy(aws 版本 hdfs distcp)可以成功运行。

但是,ec2 实例具有所需的角色权限,可以在不使用任何用户访问 key 的情况下通过服务器端加密将数据上传到同一存储桶。请参阅下面的示例命令。如果在下面的命令中省略了 -sse,它将抛出“访问被拒绝错误”。

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

如果有人可以帮助进行 spark/hadoop 中所需的配置以使用服务器端加密将数据保存到 aws s3,这将很有帮助。

最佳答案

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

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

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

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

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

关于hadoop - Spark/Hadoop - 无法使用服务器端加密保存到 s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35549694/

相关文章:

Hadoop mapreduce 程序失败,退出代码为 127

go - 如何为golang实现32字节 key 的TripleDES DESede/ECB/PKCS5Padding加密?

java - Spring Cloud AWS SQS 监听器不工作

security - 如何在Hadoop中进行数据加密?

encryption - 连续的 OpenSSL PKCS12 生成产生不同的私钥内容

amazon-web-services - 通过 AWS Glue Crawler 识别并存储在数据目录中的表异常

java - 我想如何管理 Amazon S3 上的不同用户文件?

java - Hadoop MapReduce RecordReader 实现是否必要?

java - 无法从 HDFS 复制到 S3A

hadoop - Ganglia 无法与 Apache HBase 通信