我已经从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
答案 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)