Удаленная отладка приложений 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 и его удаленной отладки с настольного компьютера. Чтобы выполнить эти задачи, необходимо выполнить перечисленные ниже общие шаги.

  1. Создание виртуальной сети Azure типа "сеть — сеть" или "точка — сеть". В инструкциях в этом документе предполагается, что вы используете тип "сеть — сеть".
  2. Создание в HDInsight кластера Spark, который является частью виртуальной сети типа "сеть — сеть".
  3. Проверка подключения между головным узлом кластера и компьютером.
  4. Создание приложения Scala в IntelliJ IDEA и его настройка для удаленной отладки.
  5. Запуск и отладка приложения.

Необходимые компоненты

Шаг 1. Создание виртуальной сети Azure

Следуйте инструкциям по созданию виртуальной сети Azure по ссылкам ниже. Затем проверьте сетевое подключение между своим компьютером и этой виртуальной сетью.

Шаг 2. Создание кластера HDInsight Spark

Рекомендуется создать в Azure HDInsight кластер Apache Spark в составе созданной вами виртуальной сети Azure. Воспользуйтесь сведениями из статьи Создание кластеров Hadoop под управлением Linux в HDInsight. На этапе дополнительной настройки выберите виртуальную сеть Azure, созданную на предыдущем шаге.

Шаг 3. Проверка подключения между головным узлом кластера и компьютером

  1. Прежде всего необходимо получить IP-адрес головного узла. Откройте пользовательский интерфейс Ambari для кластера. В колонке кластера щелкните Панель мониторинга.

    Select Dashboard in Apache Ambari.

  2. В пользовательском интерфейсе Ambari выберите Hosts (Узлы).

    Select Hosts in Apache Ambari.

  3. Отобразится список головных узлов, рабочих узлов и узлов zookeeper. Головные узлы отличаются наличием префикса hn\*. Выберите первый головной узел.

    Find the head node in Apache Ambari.

  4. В области Summary (Сводка) в нижней части открывшейся страницы скопируйте значения IP Address (IP-адрес) и Hostname (Имя узла) для головного узла.

    Find the IP address in Apache Ambari.

  5. Добавьте 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
    
  6. На компьютере, подключенном к виртуальной сети Azure и используемом кластером HDInsight, проверьте связь с головными узлами при помощи IP-адреса и имени узла.

  7. Установите SSH-подключение к головному узлу кластера, следуя инструкциям из раздела Подключение к кластеру HDInsight на основе Linux. Проверьте связь головного узла кластера с компьютером при помощи IP-адреса. Проверьте подключение к обоим IP-адресам, назначенным компьютеру:

    • IP-адресу сетевого подключения и
    • IP-адресу виртуальной сети Azure.
  8. Повторите эти действия на другом головном узле.

Шаг 4. Создание приложения Apache Spark Scala при помощи средств HDInsight в Azure Toolkit for IntelliJ и его настройка для удаленной отладки

  1. Откройте IntelliJ IDEA и создайте проект. В диалоговом окне Новый проект сделайте следующее:

    Select the new project template in IntelliJ IDEA.

    a. Выберите HDInsight>Spark on HDInsight (Scala) (Spark в HDInsight (Scala)).

    b. Выберите Далее.

  2. В следующем диалоговом окне 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).

    Select the project SDK and Spark version.

  3. Проект Spark автоматически создает артефакт. Чтобы просмотреть артефакт, сделайте следующее:

    a. В меню File (Файл) выберите Project Structure (Структура проекта).

    b. В диалоговом окне Project Structure (Структура проекта) выберите Artifacts (Артефакты), чтобы просмотреть созданный артефакт по умолчанию. Можно также создать собственный артефакт, нажав на знак "плюс" (+).

    IntelliJ IDEA artifacts create jar.

  4. Добавьте библиотеки в проект. Чтобы добавить библиотеку, выполните следующее.

    a. Щелкните правой кнопкой мыши имя проекта в дереве проектов и выберите Open Module Settings (Открыть параметры модуля).

    b. В диалоговом окне Project Structure (Структура проекта) выберите Libraries (Библиотеки), щелкните символ (+), а затем выберите From Maven (Из Maven).

    IntelliJ IDEA download library.

    c. В диалоговом окне Download Library from Maven Repository (Скачивание библиотеки из репозитория Maven) найдите и добавьте перечисленные ниже библиотеки.

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Скопируйте файлы 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.

  6. Обновите файл 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. Сохраните файл.

  7. Добавьте класс main для своего приложения. В обозревателе проектов щелкните правой кнопкой мыши src, наведите указатель мыши на пункт New (Создать) и выберите Scala Class (Класс Scala).

    IntelliJ IDEA Select the main class.

  8. В диалоговом окне Create New Scala Class (Создание класса Scala) введите имя, в поле Kind (Вид) выберите Object (Объект) и нажмите кнопку ОК.

    IntelliJ IDEA Create new Scala class.

  9. Скопируйте приведенный ниже код и вставьте его в файл 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")
        }
    }
    
  10. Повторите шаги 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)
         }
    }
    
  11. Повторите шаги 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.
  12. В классе *RemoteClusterDebugging щелкните правой кнопкой мыши ключевое слово test и выберите Create RemoteClusterDebugging Configuration (Создать конфигурацию RemoteClusterDebugging).

    IntelliJ IDEA Create a remote configuration.

  13. В диалоговом окне Create RemoteClusterDebugging Configuration (Создание конфигурации RemoteClusterDebugging) введите имя конфигурации, а затем выберите Test kind (Тестовая) для параметра Test name (Имя теста). Оставьте значения всех остальных параметров по умолчанию. Нажмите кнопку Apply (Применить), а затем нажмите кнопку ОК.

    Create RemoteClusterDebugging Configuration.

  14. В строке меню должен отобразиться раскрывающийся список конфигурации Remote Run (Удаленный запуск).

    IntelliJ The Remote run drop-down list.

Шаг 5. Запуск приложения в режиме отладки

  1. В проекте IntelliJ IDEA откройте SparkSample.scala и создайте точку останова рядом с val rdd1. В контекстном меню Create Breakpoint for (Создание точки останова для) выберите line in function executeJob (Встроенная функция executeJob).

    IntelliJ IDEA Add a breakpoint.

  2. Нажмите кнопку Debug Run (Запуск отладки) рядом с раскрывающимся списком конфигурации Remote Run (Удаленный запуск), чтобы запустить приложение.

    IntelliJ IDEA Select the Debug Run button.

  3. Когда выполнение программы достигнет точки останова, на нижней панели отобразится вкладка Debugger (Отладчик).

    IntelliJ IDEA View the Debugger tab.

  4. Чтобы добавить контрольное значение, щелкните значок (+).

    IntelliJ debug-add-watch-variable.

    В этом примере выполнение приложения было прервано до создания переменной rdd1. С помощью этого контрольного значения можно просмотреть первые пять строк в переменной rdd. Выберите ВВОД.

    IntelliJ Run the program in debug mode.

    Как видно на предыдущем рисунке, во время выполнения можно создавать запросы на терабайты данных и отлаживать работу приложения. Например, в результатах на предыдущем рисунке можно увидеть, что первая строка выходных данных является заголовком. На основе этих выходных данных можно изменить код приложения, чтобы пропустить строку заголовка, если требуется.

  5. Теперь можно щелкнуть значок Resume Program (Возобновить выполнение программы), чтобы продолжить выполнение приложения.

    IntelliJ IDEA Select Resume Program.

  6. Если работа приложения завершится успешно, отобразится результат, подобный приведенному ниже.

    IntelliJ IDEA debugger console output.

Следующие шаги

Сценарии

Создание и запуск приложений

Инструменты и расширения

Управление ресурсами