Pyspark не смог найти подходящий сертификат TLS CA после архивации пакета - PullRequest
0 голосов
/ 19 мая 2018

Я создал приложение Pyspark из этого pyspark-example-project .В примере проекта dependencies.zip представляет собой пакет зависимостей, который содержит мой фактический код.Я использую requests для отправки метаданных задания spark-submit в конечную точку с поддержкой 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 голосов
/ 05 февраля 2019

Проблема здесь в том, что requests попытается прочитать сертификаты CA в рамках своих шагов проверки SSL, ожидая, что эти сертификаты будут обычными файлами.В вашем случае сертификаты заархивированы, как подсказывает звонок на certifi.where().

Обратите внимание, что запросов # 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)
...