Python 2.7 如何为pyspark中的s3指定服务器端加密?
多亏了stackoverflow,我成功地将hadoop-aws-2.7.3.jar和aws-java-sdk-1.7.4.jar从maven repo复制到$SPARK_HOME/jars/中,以便在ec2 linux实例上使用pyspark(SPARK 2.2.0)从S3存储桶读取s3a://数据 df=spark.read.option(“header”、“true”).csv(“s3a://bucket/csv_文件”) 但我一直在将转换后的数据写入启用服务器端加密的s3存储桶中。正如下面所预期的,操作抛出“拒绝访问”,因为我没有指定在pyspark执行环境中启用服务器端加密的标志 df.write.parquet(“s3a://s3_bucket/output.parquet”) 为了验证,我编写了一个本地文件,并使用-sse将其上传到s3 bucket,这样就可以了 aws s3 cp本地路径s3://s3\U bucket/--sse 如何在类似于上述内容的pyspark中启用服务器端加密 注意:我确实尝试将“fs.s3a.enableServerSideEncryption true”添加到spark-default.conf中,并在开始时通过pyspark的--conf参数传递相同的内容,但没有成功Python 2.7 如何为pyspark中的s3指定服务器端加密?,python-2.7,apache-spark,amazon-s3,pyspark,Python 2.7,Apache Spark,Amazon S3,Pyspark,多亏了stackoverflow,我成功地将hadoop-aws-2.7.3.jar和aws-java-sdk-1.7.4.jar从maven repo复制到$SPARK_HOME/jars/中,以便在ec2 linux实例上使用pyspark(SPARK 2.2.0)从S3存储桶读取s3a://数据 df=spark.read.option(“header”、“true”).csv(“s3a://bucket/csv_文件”) 但我一直在将转换后的数据写入启用服务器端加密的s3存储桶中。正如下
谢谢希望您已经使用访问密钥、密钥、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")
强制服务器端加密
--emrfs Encryption=ServerSide,Args=[fs.s3.serverSideEncryptionAlgorithm=AES256].
命令:
./bin/spark submit--verbose-jars lib/app.jar\
--master spark://master-amazonaws.com:7077 \
--class com.elsevier.spark.SparkSync \
--conf "spark.executor.extraJavaOptions=-Ds3service.server-side-encryption=AES256"
使用服务器端加密和Amazon S3托管加密密钥(SSE-S3)保护数据
服务器端加密是关于保护静止数据的。使用Amazon S3托管加密密钥(SSE-S3)的服务器端加密采用强多因素加密。AmazonS3使用唯一的密钥加密每个对象。作为额外的保护措施,它使用主密钥加密密钥本身,主密钥定期旋转。Amazon S3服务器端加密使用可用的最强块密码之一,256位高级加密标准(AES-256),对数据进行加密
AmazonS3支持bucket策略,如果需要对存储在bucket中的所有对象进行服务器端加密,可以使用这些策略。例如,如果请求不包括请求服务器端加密的x-amz-server-side-encryption标头,则以下bucket策略将拒绝向所有人授予upload object(s3:PutObject)权限
{
"Version": "2012-10-17",
"Id": "PutObjPolicy",
"Statement": [
{
"Sid": "DenyIncorrectEncryptionHeader",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YourBucket/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
},
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YourBucket/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption": "true"
}
}
}
]
}
在经历了Hadoop JIRAs之后,我理解了Hadoop-10675、Hadoop-10400、Hadoop-10568 由于fs/s3是Hadoop的一部分,如果您的财产中的所有s3 bucket put都受SSE保护,则需要将以下内容添加到spark-default.conf中
spark.hadoop.fs.s3a.server-side-encryption-algorithm AES256
在添加此选项后,我能够成功地写入受SSE(服务器端加密)保护的S3存储桶。注意,此处列出的配置选项仅适用于EMR及其S3连接器;ASF hadoop的fs.s3a是不同的。与在bucket上设置安全选项相关的所有内容在这两种情况下都是有效的,这也是验证选项是否被拾取的最佳方法。如果无法写入存储桶,则表示加密设置失败