Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何为pyspark中的s3指定服务器端加密?_Python 2.7_Apache Spark_Amazon S3_Pyspark - Fatal编程技术网

Python 2.7 如何为pyspark中的s3指定服务器端加密?

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存储桶中。正如下

多亏了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参数传递相同的内容,但没有成功


谢谢

希望您已经使用访问密钥、密钥、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上设置安全选项相关的所有内容在这两种情况下都是有效的,这也是验证选项是否被拾取的最佳方法。如果无法写入存储桶,则表示加密设置失败