Поделиться через


Использование Набора средств Azure для IntelliJ для удаленной отладки приложений Apache Spark в HDInsight с помощью VPN

Рекомендуется удаленно выполнять отладку приложений Apache Spark с помощью SSH. См. инструкции в статье удаленной отладки приложений Apache Spark в кластере HDInsight с помощью Azure Toolkit для IntelliJ по протоколу SSH.

В этой статье приводятся пошаговые инструкции по использованию средств HDInsight в Наборе средств Azure для IntelliJ для отправки задания Spark в кластере HDInsight Spark, а затем удаленной отладки с классического компьютера. Чтобы выполнить эти задачи, необходимо выполнить следующие высокоуровневые действия.

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

Предпосылки

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

Следуйте инструкциям из следующих ссылок, чтобы создать виртуальную сеть Azure, а затем проверить подключение между настольным компьютером и виртуальной сетью:

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

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

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

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

    Выберите панель мониторинга в Apache Ambari.

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

    Выберите хосты в Apache Ambari.

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

    Найдите головной узел в Apache Ambari.

  4. В области сводки в нижней части открывающейся страницы скопируйте IP-адрес головного узла и имя узла.

    Найдите IP-адрес в Apache Ambari.

  5. Добавьте IP-адрес и сетевое имя главного узла в файл hosts на компьютере, где вы хотите выполнять и удаленно отлаживать задание Spark. Это позволяет взаимодействовать с головным узлом с помощью IP-адреса, а также имени узла.

    a. Откройте файл Блокнота с повышенными разрешениями. В меню "Файл" выберите "Открыть", а затем найдите расположение файла hosts. На компьютере Windows расположение — C:\Windows\System32\Drivers\etc\hosts.

    б. Добавьте следующие сведения в файл 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 с помощью SSH". Из головного узла кластера выполните ping IP-адреса настольного компьютера. Проверьте подключение к обоим IP-адресам, назначенным компьютеру:

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

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

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

    Выберите новый шаблон проекта в IntelliJ IDEA.

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

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

  2. В следующем диалоговом окне "Создать проект " выполните указанные ниже действия и нажмите кнопку "Готово".

    • Введите имя и расположение проекта.

    • В раскрывающемся списке пакета SDK для Project выберите Java 1.8 для кластера Spark 2.x или выберите Java 1.7 для кластера Spark 1.x.

    • В раскрывающемся списке версий Spark мастер создания проекта Scala интегрирует правильную версию пакета SDK Spark и пакета SDK Scala. Если используется версия кластера Spark более ранняя, чем 2.0, выберите Spark 1.x. В противном случае выберите Spark2.x. В этом примере используется Spark 2.0.2 (Scala 2.11.8).

    Выберите пакет SDK проекта и версию Spark.

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

    a. В меню "Файл" выберите "Структура проекта".

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

    Артефакты IntelliJ IDEA создают jar-файл.

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

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

    б. В диалоговом окне "Структура проекта " выберите библиотеки, выберите символ (+) и выберите "Из Maven".

    Загрузка библиотеки для IntelliJ IDEA.

    с. В диалоговом окне "Скачать библиотеку из репозитория Maven" найдите и добавьте следующие библиотеки:

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Скопируйте yarn-site.xml и core-site.xml из головного узла кластера и добавьте их в проект. Чтобы скопировать файлы, используйте следующие команды. С помощью Cygwin можно выполнить следующие scp команды, чтобы скопировать файлы из головного узла кластера:

    scp <ssh user name>@<headnode IP address or host name>://etc/hadoop/conf/core-site.xml .
    

    Так как мы уже добавили IP-адрес головного узла кластера и имена узлов для файла узлов на рабочем столе, мы можем использовать 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>
    

    б. Удалите следующие записи из 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>
    

    с. Сохраните файл.

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

    IntelliJ IDEA Выберите основной класс.

  8. В диалоговом окне "Создание класса Scala" укажите имя, выберите "Объект " в поле "Тип " и нажмите кнопку "ОК".

    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, чтобы добавить новый объект *SparkSampleScala. Добавьте следующий код в этот класс. Этот код считывает данные из 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, затем выберите "Создать конфигурацию RemoteClusterDebugging".

    IntelliJ IDEA Создает удаленную конфигурацию.

  13. В диалоговом окне "Создание конфигурации RemoteClusterDebugging " укажите имя конфигурации, а затем выберите тип теста в качестве имени теста. Оставьте все остальные значения параметрами по умолчанию. Выберите Применить, а затем выберите ОК.

    Создайте конфигурацию RemoteClusterDebugging.

  14. Теперь в строке меню появится раскрывающийся список конфигурации удаленного запуска .

    IntelliJ: панель выбора удаленного запуска.

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

  1. В проекте IntelliJ IDEA откройте SparkSample.scala и создайте точку останова рядом val rdd1с ним. В всплывающем меню "Создать точку останова" выберите строку в функции executeJob.

    IntelliJ IDEA Добавляет точку останова.

  2. Чтобы запустить приложение, нажмите кнопку "Выполнить отладку " рядом с раскрывающимся списком конфигурации удаленного запуска .

    IntelliJ IDEA Нажмите кнопку

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

    Посмотрите вкладку Отладчика в IntelliJ IDEA.

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

    IntelliJ debug-add-watch-variable.

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

    IntelliJ запускает программу в режиме отладки.

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

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

    IntelliJ IDEA: выберите программу возобновления.

  6. Если приложение завершится успешно, вы увидите следующие выходные данные:

    Выходные данные консоли отладчика IntelliJ IDEA.

Дальнейшие действия

Сценарии

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

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

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