2015-05-22 4 views
28

Я очень новичок в искры, и мне просто хотелось бы пошаговое узнать, как отлаживать искровое приложение локально? Может ли кто-нибудь объяснить детали, необходимые для этого?Как я могу отлаживать искровое приложение локально?

Я могу запустить simpleApp на сайте искры локально из командной строки, но мне просто нужно пройти через код и посмотреть, как он работает. Любая помощь очень ценится. Спасибо.

+0

I не знаю, что вы подразумеваете под «обучением отладке». Вы можете посмотреть на этот учебник, как настроить искру локально в IntelliJ ide https://docs.sigmoidanalytics.com/index.php/Step_by_Step_instructions_on_how_to_build_Spark_App_with_IntelliJ_IDEA. – abalcerek

+1

Я имею в виду «как я могу пройти через приложение SimpleApp на искровом сайте. Существует файл SimpleApp.java и файл pom.xml (как указано на сайте искры). Как я могу использовать Intellij IDE для шага по строкам Я хочу, чтобы это можно было сделать без отправки задания в кластер. Я просто хочу выполнить код на моем ноутбуке локально. Ссылка, которую вы указали, дает шаги по созданию приложения Spark с IntelliJ IDEA. Как насчет перехода по коду по строкам? Любая помощь очень ценится. Спасибо. – eugenerory

+0

Я не знаю о scala, но, по крайней мере, в java вы можете использовать стандартный отладчик IDEA (в локальном режиме). Одна вещь, которую вы должны помнить, если у вас есть большая коллекция, вам придется перешагнуть все элементы. – abalcerek

ответ

7

Пожар оболочки искр. Это прямо из Spark documentation:

./bin/spark-shell --master local[2] 

Вы также увидите скорлупу Спарк именуемую REPL. Это, безусловно, лучший способ узнать Spark. Я трачу 80% своего времени в оболочке Spark, а остальные 20% переводят код в мое приложение.

+2

Что делать, если приложение написано на Java? – MFARID

+0

Искра-оболочка Scala может загружать Java-банки, тогда вы можете запустить свой pp и/или методы от Scala. –

+0

Это не очень полезно, если вы создаете (большую) функцию, которую вы все время меняете, и которую вам нужно протестировать в оболочке. Вам нужно повторно импортировать эту функцию каждый раз после того, как вы ее улучшили. Но это требует остановки и запуска оболочки (каждый раз!), Что не является быстрым способом построения кода.OP запрашивает (python) ipdb-подобную функциональность (очевидно, только полезную в локальном режиме), которая, по-видимому, не существует. –

7

Просто передайте параметры java, чтобы открыть порт отладки. Вот хорошая статья адресации вопрос - http://danosipov.com/?p=779 Я использую его как

$ SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 spark-shell 

(да, SPARK_JAVA_OPTS осуждается, но он отлично работает)

+3

Я также наткнулся на упомянутую вами статью, однако SPARK_JAVA_OPTS не работал для меня в такой форме. Мне пришлось изменить его и что это для меня было: 'export SPARK_JAVA_OPTS = -agentlib: jdwp = transport = dt_socket, server = y, address = 5005, suspend = y, onuncaught = n' –

7

Как уже упоминалось Дэвид Гриффин, используя spark-shell может быть очень полезным , Тем не менее, я считаю, что выполнение фактической локальной отладки, установка точек останова, проверка переменных и т. Д. Является незаменимым. Вот как я это делаю, используя IntelliJ.

Во-первых, убедитесь, что вы можете запускать искровое приложение локально, используя 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 Debug Wire Protocol, а затем разделенный запятыми список подвариантов:

  • transport определяет протокол соединения, используемого между отладчиком и отлаживаемым - eithe r socket или «shared memory» - вы почти всегда хотите сокет (dt_socket), за исключением того, что я верю в некоторых случаях в Microsoft Windows
  • server должен ли этот процесс быть сервером при разговоре с отладчиком (или, наоборот, клиентом) - - вам всегда нужен один сервер и один клиент. В этом случае мы собираемся быть сервером и ждать подключения от отладчика
  • 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, а затем откройте «Run -> Edit Configurations ...». Затем нажмите «+», чтобы добавить новую конфигурацию запуска/отладки, и выберите «Remote». Дайте ему имя, например. «SparkLocal» и выберите «Socket» для Transport, «Attach» для режима Debugger и введите «localhost» для Host и порт, который вы использовали выше для порта, в данном случае «5005». Нажмите «ОК» для сохранения.

В моей версии IntelliJ вы найдете предложения по командной строке отладки, которые будут использоваться для отладочного процесса, и использует «suspend = n» - мы игнорируем это и используем «suspend = y» (как указано выше), потому что мы хотим, чтобы приложение подождало, пока мы не подключимся к запуску.

Теперь вы должны быть готовы к отладке. Просто запустите искру с помощью приведенной выше команды, затем выберите конфигурацию запуска IntelliJ, которую вы только что создали, и нажмите «Отладка». IntelliJ должен подключиться к вашему приложению Spark, которое должно теперь запускаться. Вы можете установить точки останова, проверить переменные и т. Д.

+0

Отредактировано для исправления опечатки путем добавления" - «до« agentlib », как упоминалось в других ответах –

2

@ Ответ Джейсона Эванса не работает для меня. Но

--conf spark.driver.extraJavaOptions=-Xrunjdwp:transport=dt_socket,server=y,address=8086,suspend=n 

работал

+0

Да, было« - »отсутствует перед« agentlib », как указано @ryan, теперь исправлено –

0

только одно незначительное изменение необходимо для ответа @Jason Эвана. Она нуждается в '-' перед строкой "agentlib ...."

--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 

вы можете также использовать опцию "--driver-Java-параметры" для достижения той же цели

--driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 
+0

Да, вы правы @ryan о отсутствующих« - », Спасибо! –

Смежные вопросы