Удаленная отладка приложений Apache Spark в HDInsight через VPN с помощью Azure Toolkit for IntelliJ
Для удаленной отладки приложений Apache Spark мы рекомендуем использовать протокол SSH. Инструкции см. в статье об удаленной отладке приложений Apache Spark в кластере HDInsight через SSH с помощью Azure Toolkit for IntelliJ.
В этой статье приводятся пошаговые инструкции по использованию средств HDInsight в наборе средств Azure для IntelliJ для отправки задания Spark в кластер HDInsight Spark и его удаленной отладки с настольного компьютера. Чтобы выполнить эти задачи, необходимо выполнить перечисленные ниже общие шаги.
- Создание виртуальной сети Azure типа "сеть — сеть" или "точка — сеть". В инструкциях в этом документе предполагается, что вы используете тип "сеть — сеть".
- Создание в HDInsight кластера Spark, который является частью виртуальной сети типа "сеть — сеть".
- Проверка подключения между головным узлом кластера и компьютером.
- Создание приложения Scala в IntelliJ IDEA и его настройка для удаленной отладки.
- Запуск и отладка приложения.
Необходимые компоненты
- Подписка Azure. Чтобы узнать больше, ознакомьтесь с получением бесплатной пробной учетной записи Azure.
- Кластер Apache Spark в HDInsight. Инструкции см. в статье Начало работы. Создание кластера Apache Spark в HDInsight на платформе Linux и выполнение интерактивных запросов с помощью SQL Spark.
- Комплект разработчика Oracle Java. Его можно установить с веб-сайта Oracle.
- IntelliJ IDEA. В этой статье используется версия 2017.1. Ее можно установить с веб-сайта JetBrains.
- Средства HDInsight из набора средств Azure для IntelliJ. Средства HDInsight для IntelliJ доступны в составе набора средств Azure для IntelliJ. Инструкции по установке набора средств Azure см. в статье Установка набора средств Azure для IntelliJ.
- Войдите в подписку Azure из IntelliJ IDEA. Следуйте указаниям в разделе Создание приложений Apache Spark для кластера HDInsight с помощью набора средств Azure Toolkit for IntelliJ.
- Обработка исключений. При запуске приложения Spark Scala для удаленной отладки на компьютере Windows может возникнуть исключение. Это исключение описывается в SPARK-2356 и порождается из-за отсутствия файла WinUtils.exe в Windows. Чтобы обойти эту ошибку, нужно скачать файл Winutils.exe, например в папку C:\WinUtils\bin. Добавьте переменную среды HADOOP_HOME и присвойте ей значение C\WinUtils.
Шаг 1. Создание виртуальной сети Azure
Следуйте инструкциям по созданию виртуальной сети Azure по ссылкам ниже. Затем проверьте сетевое подключение между своим компьютером и этой виртуальной сетью.
- Создание виртуальной сети с VPN-подключением типа "сеть — сеть" с помощью портала Azure
- Создание виртуальной сети с VPN-подключением типа "сеть — сеть" с помощью PowerShell
- Настройка подключения к виртуальной сети типа "точка — сеть" с помощью PowerShell
Шаг 2. Создание кластера HDInsight Spark
Рекомендуется создать в Azure HDInsight кластер Apache Spark в составе созданной вами виртуальной сети Azure. Воспользуйтесь сведениями из статьи Создание кластеров Hadoop под управлением Linux в HDInsight. На этапе дополнительной настройки выберите виртуальную сеть Azure, созданную на предыдущем шаге.
Шаг 3. Проверка подключения между головным узлом кластера и компьютером
Прежде всего необходимо получить IP-адрес головного узла. Откройте пользовательский интерфейс Ambari для кластера. В колонке кластера щелкните Панель мониторинга.
В пользовательском интерфейсе Ambari выберите Hosts (Узлы).
Отобразится список головных узлов, рабочих узлов и узлов zookeeper. Головные узлы отличаются наличием префикса hn\*. Выберите первый головной узел.
В области Summary (Сводка) в нижней части открывшейся страницы скопируйте значения IP Address (IP-адрес) и Hostname (Имя узла) для головного узла.
Добавьте IP-адрес и имя головного узла в файл hosts на компьютер, на котором вы собираетесь выполнять и удаленно отлаживать задание Spark. Это обеспечит обмен данными с головным узлом с помощью IP-адреса и имени узла.
a. Откройте Блокнот с повышенным уровнем разрешений. В меню Файл выберите Открыть и найдите папку с файлом hosts. На компьютере Windows это папка C:\Windows\System32\Drivers\etc\hosts.
b. Добавьте в файл hosts следующие данные.
# For headnode0 192.xxx.xx.xx nitinp 192.xxx.xx.xx nitinp.lhwwghjkpqejawpqbwcdyp3.gx.internal.cloudapp.net # For headnode1 192.xxx.xx.xx nitinp 192.xxx.xx.xx nitinp.lhwwghjkpqejawpqbwcdyp3.gx.internal.cloudapp.net
На компьютере, подключенном к виртуальной сети Azure и используемом кластером HDInsight, проверьте связь с головными узлами при помощи IP-адреса и имени узла.
Установите SSH-подключение к головному узлу кластера, следуя инструкциям из раздела Подключение к кластеру HDInsight на основе Linux. Проверьте связь головного узла кластера с компьютером при помощи IP-адреса. Проверьте подключение к обоим IP-адресам, назначенным компьютеру:
- IP-адресу сетевого подключения и
- IP-адресу виртуальной сети Azure.
Повторите эти действия на другом головном узле.
Шаг 4. Создание приложения Apache Spark Scala при помощи средств HDInsight в Azure Toolkit for IntelliJ и его настройка для удаленной отладки
Откройте IntelliJ IDEA и создайте проект. В диалоговом окне Новый проект сделайте следующее:
a. Выберите HDInsight>Spark on HDInsight (Scala) (Spark в HDInsight (Scala)).
b. Выберите Далее.
В следующем диалоговом окне New Project (Новый проект) выполните приведенные ниже действия, после чего щелкните Finish (Готово).
Введите имя и расположение проекта.
В раскрывающемся списке Project SDK (Пакет SDK проекта) выберите Java 1.8 для кластера Spark 2.x или Java 1.7 для кластера Spark 1.x.
В раскрывающемся списке Spark version (Версия Spark) мастер создания проекта Scala интегрирует правильную версию пакета SDK для Spark и пакета SDK для Scala. Если используется версия кластера Spark более ранняя, чем 2.0, выберите Spark 1.x. В противном случае выберите Spark 2.x. В этом примере используется Spark 2.0.2 (Scala 2.11.8).
Проект Spark автоматически создает артефакт. Чтобы просмотреть артефакт, сделайте следующее:
a. В меню File (Файл) выберите Project Structure (Структура проекта).
b. В диалоговом окне Project Structure (Структура проекта) выберите Artifacts (Артефакты), чтобы просмотреть созданный артефакт по умолчанию. Можно также создать собственный артефакт, нажав на знак "плюс" (+).
Добавьте библиотеки в проект. Чтобы добавить библиотеку, выполните следующее.
a. Щелкните правой кнопкой мыши имя проекта в дереве проектов и выберите Open Module Settings (Открыть параметры модуля).
b. В диалоговом окне Project Structure (Структура проекта) выберите Libraries (Библиотеки), щелкните символ (+), а затем выберите From Maven (Из Maven).
c. В диалоговом окне Download Library from Maven Repository (Скачивание библиотеки из репозитория Maven) найдите и добавьте перечисленные ниже библиотеки.
org.scalatest:scalatest_2.10:2.2.1
org.apache.hadoop:hadoop-azure:2.7.1
Скопируйте файлы
yarn-site.xml
иcore-site.xml
с головного узла кластера и добавьте их в проект. Выполните указанные ниже команды, чтобы скопировать файлы. Для выполнения приведенных далее командscp
можно использовать Cygwin. Это позволит копировать файлы с головных узлов кластера.scp <ssh user name>@<headnode IP address or host name>://etc/hadoop/conf/core-site.xml .
Так как мы уже добавили IP-адреса и имена головных узлов кластера в файл hosts на компьютере, можно использовать команды
scp
, как показано ниже.scp sshuser@nitinp:/etc/hadoop/conf/core-site.xml . scp sshuser@nitinp:/etc/hadoop/conf/yarn-site.xml .
Чтобы добавить эти файлы в проект, скопируйте их в папку /src дерева проектов, например
<your project directory>\src
.Обновите файл
core-site.xml
, чтобы внести описанные ниже изменения.a. Замените зашифрованный ключ. Файл
core-site.xml
содержит зашифрованный ключ учетной записи хранения, связанной с кластером. В файлеcore-site.xml
, добавленном в проект, замените зашифрованный ключ фактическим ключом к хранилищу данных, связанным с учетной записью хранения, используемой по умолчанию. См. сведения о том, как управлять ключами доступа к учетной записи хранения.<property> <name>fs.azure.account.key.hdistoragecentral.blob.core.windows.net</name> <value>access-key-associated-with-the-account</value> </property>
b. Удалите из файла
core-site.xml
указанные ниже записи.<property> <name>fs.azure.account.keyprovider.hdistoragecentral.blob.core.windows.net</name> <value>org.apache.hadoop.fs.azure.ShellDecryptionKeyProvider</value> </property> <property> <name>fs.azure.shellkeyprovider.script</name> <value>/usr/lib/python2.7/dist-packages/hdinsight_common/decrypt.sh</value> </property> <property> <name>net.topology.script.file.name</name> <value>/etc/hadoop/conf/topology_script.py</value> </property>
c. Сохраните файл.
Добавьте класс main для своего приложения. В обозревателе проектов щелкните правой кнопкой мыши src, наведите указатель мыши на пункт New (Создать) и выберите Scala Class (Класс Scala).
В диалоговом окне Create New Scala Class (Создание класса Scala) введите имя, в поле Kind (Вид) выберите Object (Объект) и нажмите кнопку ОК.
Скопируйте приведенный ниже код и вставьте его в файл
MyClusterAppMain.scala
. Этот код создает контекст Spark и открывает методexecuteJob
из объектаSparkSample
.import org.apache.spark.{SparkConf, SparkContext} object SparkSampleMain { def main (arg: Array[String]): Unit = { val conf = new SparkConf().setAppName("SparkSample") .set("spark.hadoop.validateOutputSpecs", "false") val sc = new SparkContext(conf) SparkSample.executeJob(sc, "wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv", "wasb:///HVACOut") } }
Повторите шаги 8 и 9, чтобы добавить новый объект Scala с именем
*SparkSample
. Добавьте в этот класс следующий код. Этот код считывает данные из файла HVAC.csv (доступного для всех кластеров HDInsight Spark). Он извлекает строки, содержащие только одну цифру в седьмом столбце CSV-файла, и записывает результат в /HVACOut в используемом по умолчанию контейнере хранилища для кластера.import org.apache.spark.SparkContext object SparkSample { def executeJob (sc: SparkContext, input: String, output: String): Unit = { val rdd = sc.textFile(input) //find the rows which have only one digit in the 7th column in the CSV val rdd1 = rdd.filter(s => s.split(",")(6).length() == 1) val s = sc.parallelize(rdd.take(5)).cartesian(rdd).count() println(s) rdd1.saveAsTextFile(output) //rdd1.collect().foreach(println) } }
Повторите шаги 8 и 9, чтобы добавить новый класс
RemoteClusterDebugging
. Этот класс реализует платформу тестирования Spark, которая используется для отладки приложений. Добавьте в классRemoteClusterDebugging
следующий код.import org.apache.spark.{SparkConf, SparkContext} import org.scalatest.FunSuite class RemoteClusterDebugging extends FunSuite { test("Remote run") { val conf = new SparkConf().setAppName("SparkSample") .setMaster("yarn-client") .set("spark.yarn.am.extraJavaOptions", "-Dhdp.version=2.4") .set("spark.yarn.jar", "wasb:///hdp/apps/2.4.2.0-258/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar") .setJars(Seq("""C:\workspace\IdeaProjects\MyClusterApp\out\artifacts\MyClusterApp_DefaultArtifact\default_artifact.jar""")) .set("spark.hadoop.validateOutputSpecs", "false") val sc = new SparkContext(conf) SparkSample.executeJob(sc, "wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv", "wasb:///HVACOut") } }
Необходимо обратить внимание на несколько важных моментов.
- Для
.set("spark.yarn.jar", "wasb:///hdp/apps/2.4.2.0-258/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar")
убедитесь, что JAR-файл сборки Spark доступен в хранилище кластера по указанному пути. - Для
setJars
укажите расположение, в котором будет создан JAR-файл артефакта. Обычно это<Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jar
.
- Для
В классе
*RemoteClusterDebugging
щелкните правой кнопкой мыши ключевое словоtest
и выберите Create RemoteClusterDebugging Configuration (Создать конфигурацию RemoteClusterDebugging).В диалоговом окне Create RemoteClusterDebugging Configuration (Создание конфигурации RemoteClusterDebugging) введите имя конфигурации, а затем выберите Test kind (Тестовая) для параметра Test name (Имя теста). Оставьте значения всех остальных параметров по умолчанию. Нажмите кнопку Apply (Применить), а затем нажмите кнопку ОК.
В строке меню должен отобразиться раскрывающийся список конфигурации Remote Run (Удаленный запуск).
Шаг 5. Запуск приложения в режиме отладки
В проекте IntelliJ IDEA откройте
SparkSample.scala
и создайте точку останова рядом сval rdd1
. В контекстном меню Create Breakpoint for (Создание точки останова для) выберите line in function executeJob (Встроенная функция executeJob).Нажмите кнопку Debug Run (Запуск отладки) рядом с раскрывающимся списком конфигурации Remote Run (Удаленный запуск), чтобы запустить приложение.
Когда выполнение программы достигнет точки останова, на нижней панели отобразится вкладка Debugger (Отладчик).
Чтобы добавить контрольное значение, щелкните значок (+).
В этом примере выполнение приложения было прервано до создания переменной
rdd1
. С помощью этого контрольного значения можно просмотреть первые пять строк в переменнойrdd
. Выберите ВВОД.Как видно на предыдущем рисунке, во время выполнения можно создавать запросы на терабайты данных и отлаживать работу приложения. Например, в результатах на предыдущем рисунке можно увидеть, что первая строка выходных данных является заголовком. На основе этих выходных данных можно изменить код приложения, чтобы пропустить строку заголовка, если требуется.
Теперь можно щелкнуть значок Resume Program (Возобновить выполнение программы), чтобы продолжить выполнение приложения.
Если работа приложения завершится успешно, отобразится результат, подобный приведенному ниже.
Следующие шаги
Сценарии
- Руководство. Анализ данных Apache Spark с использованием Power BI в HDInsight
- Apache Spark и Машинное обучение. Анализ температуры в здании на основе данных системы кондиционирования с помощью Spark в HDInsight
- Apache Spark и Машинное обучение. Прогнозирование результатов проверки пищевых продуктов с помощью Spark в HDInsight
- Анализ журналов веб-сайтов с помощью Apache Spark в HDInsight
Создание и запуск приложений
- Создание автономного приложения с использованием Scala
- Удаленный запуск заданий с помощью Apache Livy в кластере Apache Spark
Инструменты и расширения
- Создание приложений Apache Spark для кластера HDInsight с помощью Azure Toolkit for IntelliJ
- Удаленная или локальная отладка приложений Spark в кластере HDInsight с помощью Azure Toolkit for IntelliJ через SSH
- Использование средств HDInsight в Azure Toolkit for Eclipse для создания приложений Apache Spark
- Использование записных книжек Zeppelin с кластером Apache Spark в Azure HDInsight
- Ядра для записной книжки Jupyter в кластере Apache Spark для HDInsight
- Использование внешних пакетов с Jupyter Notebook
- Установка записной книжки Jupyter на компьютере и ее подключение к кластеру Apache Spark в Azure HDInsight (предварительная версия)