压缩包后,Pyspark找不到合适的TLS CA证书

时间:2018-05-19 12:49:49

标签: python apache-spark ssl pyspark python-requests

我已经从pyspark-example-project创建了一个Pyspark应用程序。在示例项目中, dependencies.zip 是一个依赖包,其中包含我的实际代码。我使用requests将spark提交作业的元数据发布到https启用的端点。

我按如下方式提交工作: spark-submit --master local[*] --py-files dependencies.zip job.py

这导致

OSError: Could not find a suitable TLS CA certificate bundle, while running spark-submit,
File "/private/var/folders/_2/4jk9zwf11yx6h93v9nyv284r0000gn/T/spark-2604a272-4da7-45e9-98a4-02110c71f4db/userFiles-1b562995-6006-47a1-8d98-5102449063fa/dependencies.zip/requests/adapters.py", line 407, in send
    self.cert_verify(conn, request.url, verify, cert)
  File "/private/var/folders/_2/4jk9zwf11yx6h93v9nyv284r0000gn/T/spark-2604a272-4da7-45e9-98a4-02110c71f4db/userFiles-1b562995-6006-47a1-8d98-5102449063fa/dependencies.zip/requests/adapters.py", line 226, in cert_verify
    "invalid path: {0}".format(cert_loc))
OSError: Could not find a suitable TLS CA certificate bundle, invalid path: /private/var/folders/_2/4jk9zwf11yx6h93v9nyv284r0000gn/T/spark-2604a272-4da7-45e9-98a4-02110c71f4db/userFiles-1b562995-6006-47a1-8d98-5102449063fa/dependencies.zip/certifi/cacert.pem

虽然boto3在压缩存档的依赖项中工作正常,但 dependencies.zip/boto3

更新1

我已尝试记录certifi.where(),它提供了日志中提到的相同路径,即

/private/var/folders/_2/4jk9zwf11yx6h93v9nyv284r0000gn/T/spark-2604a272-4da7-45e9-98a4-02110c71f4db/userFiles-1b562995-6006-47a1-8d98-5102449063fa/dependencies.zip/certifi/cacert.pem

1 个答案:

答案 0 :(得分:0)

这里的问题是requests将尝试读取CA证书作为其SSL验证步骤的一部分,并期望这些证书是常规文件。对于您而言,证书的压缩如对certifi.where()的调用所暗示。

请注意,requests#4371是为解决此类情况而设计的。在您撰写文章时,此修复程序应该已经掌握,因此您可能使用的是旧版本的requests

一种变通方法是在需要SSL验证时指定未压缩证书的路径。使用boto3,您可以应用类似于requests的解决方案:

import certifi
from requests.utils import extract_zipped_paths

cert_path = extract_zipped_paths(certifi.where())
ssm = boto3.client("ssm", verify=cert_path)