【问题标题】:Issues while reading and writing a KMS encrypted spark data-frame to a S3 bucket with pyspark使用 pyspark 将 KMS 加密的 spark 数据帧读取和写入到 S3 存储桶时出现问题
【发布时间】:2023-03-08 18:00:01
【问题描述】:

我正在尝试使用 Pyspark 将 Spark 数据帧写入 AWS S3 存储桶,并收到不支持指定的加密方法的异常。存储桶具有服务器端加密设置。

我正在从 spark-default.conf 运行以下软件包: spark.jars.packages com.amazonaws:aws-java-sdk:1.9.5, org.apache.hadoop:hadoop-aws:3.2.0

查看了这个现有线程:Doesn't Spark/Hadoop support SSE-KMS encryption on AWS S3,并提到上述版本应支持 SSE-KMS 加密。

我还包含了 core-site.xml 以拥有该属性 'fs.s3a.server-side-encryption-algorithm' 设置为 'SSE-KMS'

但是,我仍然得到错误。 请注意,对于没有 SSE-KMS 的存储桶,这可以正常工作。

错误消息:AmazonS3Exception:状态代码:400,AWS 服务:Amazon S3,AWS 错误代码:InvalidArgument,AWS 错误消息:不支持指定的加密方法

【问题讨论】:

    标签: pyspark


    【解决方案1】:

    Hadoop 3.2.0 绝对支持 SSE-KMS,所以无论出现什么问题:配置中使用的 SSE-KMS 密钥、您的访问权限或其他一些怪癖(例如,密钥不是与存储桶位于同一区域)。

    但是:该版本是针对 AWS 1.11.375 mvnrepo hadoop-aws 构建的。混合 JAR 通常注定要失败。这可能是一个因素,也可能不是。

    你从远端收到了 400,这意味着那里有东西被拒绝了。

    推荐

    1. 你看troubleshooting s3a page
    2. 下载 cloudstore 并运行其存储的诊断程序以引导连接诊断
    3. 尝试使用 AWS CLI 以使用相同设置处理数据

    注意:当您尝试读取数据时,fs.s3a.encryption 设置无关紧要 - S3 知道所使用的 KMS 密钥,如果您有权限,它将自动使用它来解密。这是检查您是否对密钥具有读取权限的好方法

    【讨论】:

    • 感谢您的建议。我将 java-sdk 切换到 1.11.375。我在存储桶上运行了 storageiag,可以看到它能够读取文件。但是从 spark 控制台,当我尝试读取:spark.read.parquet('s3a://') 时,我收到 AWS 错误消息:请求使用 AWS KMS 托管密钥指定服务器端加密需要 AWS 签名版本 4。我确实运行了 aws cli 命令将版本设置为 s3v4,并且还从 cloudstore storediag 验证了正在获取正确的存储桶区域。对此还有什么想法吗?
    • 关于该签名设置的最佳文档是:docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.1.0/…,它说“AWS4SignerType”应该是正确的。在不设置加密的情况下尝试一下,看看会发生什么
    【解决方案2】:

    感谢史蒂夫的所有意见。将以下内容添加到 spark-defaults.conf 解决了我们的问题:

    spark.hadoop.fs.s3a.server-side-encryption-algorithm AES256

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-17
      • 2017-06-10
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多