Я пишу приложение для потоковой передачи искр с использованием pyspark, которое в основном обрабатывает данные.
Краткий обзор упаковки: это приложение содержит несколько модулей и некоторые файлы конфигурации, которые не являются файлами .py (например, .yaml или .json).
Я упаковываю все это приложение в файл package.zip и отправляю этот package.zip в Spark.
Теперь проблема в том, что я запускаю команду spark-submit в режиме кластера пряжи. Я получаю IOError. Ниже - трассировка стека
Traceback (most recent call last):
File "main/main.py", line 10, in <module>
import logger.logger
File "package.zip/logger/logger.py", line 36, in get_logger
IOError: [Errno 2] No such file or directory: 'logger/config.yaml'
Spark-Command: spark-submit --master yarn-cluster --py-files package.zip main / main.py
Но когда я отправляю задание в режиме пряжи-клиента, приложение работает так, как ожидалось.
Мое понимание:
- Когда я отправляю задание в клиентском режиме, искровый драйвер запускается на том же компьютере, на котором я отправил команду. И пакет распространяется по всем узлам.
- И когда я запускаю команду в кластерном режиме, и драйвер искры, и мастер приложения работают на одном узле (который не является клиентом, отправившим код), и все же пакет распространяется на все узлы в кластере.
В обоих случаях package.zip доступен для всех узлов, тогда почему загружаются только файлы py, а файлы, отличные от py, не загружаются в режиме кластера.
Может ли кто-нибудь помочь мне разобраться в ситуации и решить проблему?
Обновлено -
Наблюдения
В режиме клиента. Заархивированный пакет распаковывается по пути, по которому выполняется сценарий драйвера. Где, как в режиме кластера, zip-пакет используется для всех узлов, но не разархивирован. Здесь мне нужно распаковать пакет во всех узлах? Есть ли способ указать Spark разархивировать пакет в рабочем узле?