Путь классов Apache Spark построен динамически (для размещения кода пользователя для каждого приложения), что делает его уязвимым для таких проблем. @ user7337271 ответ правильный, но есть еще несколько проблем, в зависимости от используемого вами менеджера кластера («мастер»).
Во-первых, приложение Spark состоит из из этих компонентов (каждый из них является отдельным JVM, поэтому потенциально содержит разные классы в его пути к классам):
SparkSession
(или SparkContext
) и подключение к диспетчеру кластера для выполнения фактической работы Соотношение между ними описано на этой диаграмме из обзора режима кластера Apache Spark :
Теперь - какие классы должны находиться в каждом из этих компонентов?
На это может ответить следующая диаграмма:
Давайте разберем это медленно:
Теперь, когда мы получили это прямо, как мы получаем, чтобы классы правильно загружались в каждом компоненте, и какими правилами они должны следовать?
spark.yarn.archive
или spark.yarn.jars
параметры при использовании YARN). Банки / архив, которые вы предоставляете, должны включать все зависимости Spark (включая транзитивные зависимости), и они будут отправляться диспетчером кластера каждому исполнителю при запуске приложения. spark.jars
. Подводя итог, рассмотрим предлагаемый подход к созданию и развертыванию Spark Application (в данном случае - с использованием YARN):
spark.jars
при запуске SparkSession
lib/
загруженных двоичных файлов Spark в качестве значения spark.yarn.archive
Добро пожаловать в мир параллелизма (в некоторой степени)!
Просто представьте, что ваша программа работает: инструкции выполняются одна за другой в том порядке, в котором они написаны, в соответствии с потоком выполнения, который они выполняют. определить за исключением из shutterPressed
, которое выполняется асинхронно ( может быть ).
Поэтому, представьте, что мы входим в цикл и находимся на первой строке, <here>
:
while True:
global shutterHasBeenPressed
shutterHasBeenPressed = False # <here>
#Stay in loop until button is pressed
if shutterHasBeenPressed is False:
i += 1
if i == blink_speed:
overlay_2.alpha = 255
elif i == (2 * blink_speed):
overlay_2.alpha = 0
i = 0
#Restart while loop
sleep(0.1)
continue
#button has been pressed!
print("Button Pressed!")
Теперь shutterHasBeenPressed
был установлен на False
, и следующее условие проверяется так что мы входим в if
.
Программа продолжает работать, пока неожиданно не будет нажата кнопка. Скажем, он достиг <here>
:
while True:
global shutterHasBeenPressed
shutterHasBeenPressed = False
#Stay in loop until button is pressed
if shutterHasBeenPressed is False:
i += 1
if i == blink_speed:
overlay_2.alpha = 255 # <here>
elif i == (2 * blink_speed):
overlay_2.alpha = 0
i = 0
#Restart while loop
sleep(0.1)
continue
#button has been pressed!
print("Button Pressed!")
На данный момент, shutterPressed
работает, устанавливает shutterHasBeenPressed
в True
. Затем, снова в нашем цикле, итерация заканчивается, мы continue
в начале цикла и ... что там?!
shutterHasBeenPressed = False
и нажатие кнопки просто осталось незамеченным!
Я считаю, что это отвечает на ваш вопрос, спрашивая, в чем вы ошиблись. [+1121]