Как импортировать модуль Python, который я добавил в кластер, через --py-файлы? - PullRequest
1 голос
/ 22 октября 2019

У меня есть несколько пользовательских драйверов jdbc, которые я хочу использовать в приложении. Я включаю их как --py-файлы, когда я отправляю запрос в кластер искр Kubernetes:

spark-submit --py-files s3a://bucket/pyfiles/pyspark_jdbc.zip my_application.py

Это дает мне:

java.io.FileNotFoundException: File file:/opt/spark/work-dir/pyspark_jdbc.zip does not exist

Как другие ответы мне сказали, что мне нужно добавить этот zip-файл в PYTHONPATH. Теперь я считаю, что это больше не так, по крайней мере, с Spark 2.3+, но давайте сделаем это с:

spark.sparkContext.addPyFile("pyspark_jdbc.zip")

Просматривая журналы кластера, я вижу:

19/10/21 22:40:56 INFO Utils: Fetching s3a://bucket/pyfiles/pyspark_jdbc.zip to 
/var/data/spark-52e390f5-85f4-41c4-9957-ff79f1433f64/spark-402e0a00-6806-40a7-a17d-5adf39a5c2d4/userFiles-680c1bce-ad5f-4a0b-9160-2c3037eefc29/fetchFileTemp5609787392859819321.tmp

Итак, пифайлы были импортированы точно, но в /var/data/..., а не в мой рабочий каталог. Поэтому, когда я иду, чтобы добавить местоположение моего файла .zip в путь к Python, я не знаю, где он находится. Некоторая диагностика в кластере прямо перед попыткой добавления файлов python:

> print(sys.path)
[..., 
 '/var/data/spark-52e390f5-85f4-41c4-9957-ff79f1433f64/spark-402e0a00-6806-40a7-a17d-5adf39a5c2d4/userFiles-680c1bce-ad5f-4a0b-9160-2c3037eefc29', 
 '/opt/spark/work-dir/s3a', 
 '//bucket/pyfiles/pyspark_jdbc.zip'
...]
> print(os.getcwd())
/opt/spark/work-dir
> subprocess.run(["ls", "-l"])
total 0

Итак, мы видим, что pyspark попытался добавить файл s3a://, который я добавил через --py-files в PYTHONPATH, за исключением того, что он неправильно-интерпретировал : и неправильно добавил путь. Каталог /var/data/... находится в PYTHONPATH, но нет конкретного файла .zip, поэтому я не могу импортировать из него.

Как я могу решить эту проблему в будущем? Файл .zip не был правильно добавлен к пути, но в моей программе я не знаю ни

a. путь к s3a: //, который pyspark попытался добавить к PYTHONPATH

b. путь к локальному расположению файла .zip `var / data /.../. Я знаю, что он где-то находится на пути, и, полагаю, я мог бы разобрать его, но это было бы грязно.

Что такое элегантное решение для этого?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

(лучшее) решение - использовать объект SparkFiles в pyspark для определения местоположения импортируемых файлов.

from pyspark import SparkFiles

spark.sparkContext.addPyFile(SparkFiles.get("pyspark_jdbc.zp"))
0 голосов
/ 22 октября 2019

(Плохое) решение - просто разобрать пути, которые выглядят так, как будто они могут содержать файл .zip, и добавить их в sys.path.

for pth in [p for p in sys.path if p.startswith("/var/data/spark-")]:
    try:
        sys.path.append("{}/pyspark_jdbc.zip".format(pth))
    except:
        passed

Это решение сработало, что позволило намприступим к тестированию нашего настоящего искрового приложения, но я не считаю это готовым решением.

...