У меня есть несколько пользовательских драйверов 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 /.../. Я знаю, что он где-то находится на пути, и, полагаю, я мог бы разобрать его, но это было бы грязно.
Что такое элегантное решение для этого?