Ответ 1
Как отметил Дэвид Гриффин, использование spark-shell
может быть очень полезным. Однако я считаю, что выполнение локальной отладки, установка точек останова, проверка переменных и т.д. Абсолютно необходимы. Вот как я это делаю, используя IntelliJ.
Во-первых, убедитесь, что вы можете запустить ваше приложение spark локально, используя spark-submit
, например что-то вроде:
spark-submit --name MyApp --class MyMainClass --master local[2] myapplication.jar
Затем скажите локальному драйверу искры приостановить и дождаться соединения от отладчика при запуске, добавив параметр, подобный следующему:
--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
где agentlib:jdwp
- это параметр протокола отладки Java, за которым следует разделенный запятыми список agentlib:jdwp
:
-
transport
определяет протокол соединения, используемый между отладчиком и debuggee - либо сокетом, либо "разделяемой памятью", - вы почти всегда хотите использовать сокет (dt_socket
), за исключением некоторых случаев в Microsoft Windows. -
server
, должен ли этот процесс быть сервером при общении с отладчиком (или, наоборот, с клиентом) - вам всегда нужен один сервер и один клиент. В этом случае мы собираемся быть сервером и ждать подключения от отладчика. -
suspend
,suspend
ли выполнение до тех пор, пока отладчик не подключится успешно. Мы включаем это, чтобы драйвер не запустился, пока отладчик не подключится -
address
здесь, это порт для прослушивания (для входящих запросов подключения отладчика). Вы можете установить его на любой доступный порт (вам просто нужно убедиться, что отладчик настроен на подключение к этому же порту)
Итак, теперь ваша командная строка spark-submit
должна выглядеть примерно так:
spark-submit --name MyApp --class MyMainClass --master local[2] --conf spark.driver.extraJavaOptions=agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
Теперь, если вы запустите выше, вы должны увидеть что-то вроде
Listening for transport dt_socket at address: 5005
и ваше искровое приложение ожидает подключения отладчика.
Затем откройте проект IntelliJ, содержащий ваше приложение Spark, а затем откройте "Выполнить → Редактировать конфигурации...", затем нажмите "+", чтобы добавить новую конфигурацию запуска/отладки, и выберите "Удаленный". Дайте ему имя, например, "SparkLocal", и выберите "Socket" для транспорта, "Attach" для режима отладчика и введите "localhost" для хоста и порт, который вы использовали выше для порта, в данном случае "5005". Нажмите "ОК", чтобы сохранить.
В моей версии IntelliJ он дает вам советы по использованию командной строки отладки для отлаживаемого процесса и использует "suspend = n" - мы игнорируем это и используем "suspend = y" (как указано выше), потому что мы хотим приложение, чтобы ждать, пока мы не подключиться, чтобы начать.
Теперь вы должны быть готовы к отладке. Просто запустите spark с помощью приведенной выше команды, затем выберите конфигурацию запуска IntelliJ, которую вы только что создали, и нажмите Отладка. IntelliJ должен подключиться к вашему приложению Spark, которое теперь должно запуститься. Вы можете установить точки останова, проверить переменные и т.д.