次の方法で共有


Azure Toolkit for IntelliJ を使用して VPN 経由で HDInsight で Apache Spark アプリケーションをリモートでデバッグする

SSH を使用して Apache Spark アプリケーションをリモートでデバッグすることをお勧めします。 手順については、SSH 経由で Azure Toolkit for IntelliJ を使用して HDInsight クラスター上の Apache Spark アプリケーションをリモートでデバッグする方法に関するページを参照してください。

この記事では、Azure Toolkit for IntelliJ の HDInsight ツールを使用して HDInsight Spark クラスターで Spark ジョブを送信し、デスクトップ コンピューターからリモートでデバッグする方法について詳しく説明します。 これらのタスクを完了するには、次の大まかな手順を実行する必要があります。

  1. サイト間またはポイント対サイトの Azure 仮想ネットワークを作成します。 このドキュメントの手順では、サイト間ネットワークを使用することを前提としています。
  2. サイト間仮想ネットワークの一部である SPARK クラスターを HDInsight に作成します。
  3. クラスター ヘッド ノードとデスクトップの間の接続を確認します。
  4. IntelliJ IDEA で Scala アプリケーションを作成し、リモート デバッグ用に構成します。
  5. アプリケーションを実行してデバッグします。

[前提条件]

手順 1. Azure 仮想ネットワークを作成する

次のリンクの手順に従って Azure 仮想ネットワークを作成し、デスクトップ コンピューターと仮想ネットワークの間の接続を確認します。

手順 2: HDInsight Spark クラスターを作成する

また、作成した Azure 仮想ネットワークの一部である Apache Spark クラスターを Azure HDInsight に作成することをお勧めします。 HDInsight での Linux ベースのクラスターの作成に関する記事で入手できる情報を使用します。 オプションの構成の一部として、前の手順で作成した Azure 仮想ネットワークを選択します。

手順 3: クラスター ヘッド ノードとデスクトップの間の接続を確認する

  1. ヘッド ノードの IP アドレスを取得します。 クラスターの Ambari UI を開きます。 クラスター ブレードで、[ダッシュボード] を選択 します

    Apache Ambari で [ダッシュボード] を選択します。

  2. Ambari UI から [ホスト] を選択 します

    Apache Ambari のホストを選択します。

  3. ヘッド ノード、ワーカー ノード、および Zookeeper ノードの一覧が表示されます。 ヘッド ノードには hn* プレフィックスがあります。 最初のヘッド ノードを選択します。

    Apache Ambari でヘッド ノードを見つけます。

  4. 開いたページの下部にある [概要 ] ウィンドウから、ヘッド ノードの IP アドレスホスト名をコピーします。

    Apache Ambari で IP アドレスを見つけます。

  5. Spark ジョブを実行してリモートでデバッグするコンピューター上の hosts ファイルに、ヘッド ノードの IP アドレスと ホスト 名を追加します。 これにより、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. HDInsight クラスターで使用される Azure 仮想ネットワークに接続したコンピューターから、IP アドレスとホスト名を使用してヘッド ノードに ping できることを確認します。

  7. SSH を使用してクラスター ヘッド ノードに接続するには、SSH を使用した HDInsight クラスターへの接続に関する記事の手順に従ってください。 クラスター ヘッド ノードから、デスクトップ コンピューターの IP アドレスに ping を実行します。 コンピューターに割り当てられている両方の IP アドレスへの接続をテストします。

    • ネットワーク接続用の 1 つ
    • Azure 仮想ネットワーク用の 1 つ
  8. もう一方のヘッド ノードの手順を繰り返します。

手順 4: Azure Toolkit for IntelliJ で HDInsight ツールを使用して Apache Spark Scala アプリケーションを作成し、リモート デバッグ用に構成する

  1. IntelliJ IDEA を開き、新しいプロジェクトを作成します。 [新しいプロジェクト ] ダイアログ ボックスで、次の操作を行います。

    IntelliJ IDEA で新しいプロジェクト テンプレートを選択します。

    a. [HDInsight>Spark on HDInsight (Scala)] を選択します。

    b。 [次へ] を選択します。

  2. 次の [ 新しいプロジェクト ] ダイアログ ボックスで、次の操作を行い、[ 完了] を選択します。

    • プロジェクトの名前と場所を入力します。

    • [Project SDK]\(プロジェクト SDK\) ドロップダウン リストで、Spark 2.x クラスターの場合は [Java 1.8] を選択し、Spark 1.x クラスターの場合は [Java 1.7] を選択します。

    • Spark バージョンのドロップダウン リストでは、Scala プロジェクト作成ウィザードによって、Spark SDK と Scala SDK の適切なバージョンが統合されます。 Spark クラスターのバージョンが 2.0 より前の場合は、[Spark 1.x] を選択します。 それ以外の場合は、[Spark2.x] を選択します。 この例では、[Spark 2.0.2 (Scala 2.11.8)] を使用します。

    プロジェクト SDK と Spark のバージョンを選択します。

  3. Spark プロジェクトによって自動的に成果物が作成されます。 成果物を表示するには、次の操作を行います。

    a. [ ファイル ] メニューの [ プロジェクト構造] を選択します。

    b。 [Project Structure]\(プロジェクト構造\) ダイアログ ボックスで、[Artifacts]\(成果物\) を選択して、作成された既定の成果物を表示します。 プラス記号 (+) を選択して、独自の成果物を作成することもできます。

    IntelliJ IDEA アーティファクトによって jar が作成されます。

  4. プロジェクトにライブラリを追加します。 ライブラリを追加するには、次の操作を行います。

    a. プロジェクト ツリーでプロジェクト名を右クリックし、[ モジュール設定を開く] を選択します。

    b。 [ プロジェクト構造 ] ダイアログ ボックスで、[ ライブラリ] を選択し、(+) シンボルを選択して、[ Maven から] を選択します。

    IntelliJ IDEA ダウンロード ライブラリ。

    c. [ Maven リポジトリからライブラリをダウンロード する] ダイアログ ボックスで、次のライブラリを検索して追加します。

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. クラスター ヘッド ノードから yarn-site.xmlcore-site.xml をコピーし、プロジェクトに追加します。 次のコマンドを使用してファイルをコピーします。 Cygwin を使用して、次のscp コマンドを実行して、クラスター ヘッド ノードからファイルをコピーできます。

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

    デスクトップ上の hosts ファイルのクラスター ヘッド ノードの 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>
    

    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. アプリケーションのメイン クラスを追加します。 プロジェクト エクスプローラーでsrc を右クリックし、[新規] をポイントして Scala クラスを選択します。

    IntelliJ IDEA メイン クラスを選択します。

  8. [新しい Scala クラスの作成] ダイアログ ボックスで、名前を指定し、[種類] ボックスで [オブジェクト] を選択し、[OK] を選択します

    IntelliJ IDEA 新しい Scala クラスを作成します。

  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 を繰り返して、 *SparkSampleという新しい Scala オブジェクトを追加します。 以下のコードをこのクラスに追加します。 このコードは、HVAC.csv (すべての HDInsight Spark クラスターで使用可能) からデータを読み取ります。 CSV ファイルの 7 番目の列に 1 桁しかない行を取得し、クラスターの既定のストレージ コンテナーの下の /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")の場合は、指定したパスにあるクラスター ストレージで Spark アセンブリ JAR を使用できることを確認します。
    • setJarsの場合は、アーティファクト JAR が作成される場所を指定します。 通常は、 <Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jarです。
  12. クラスで*RemoteClusterDebuggingtest キーワードを右クリックし、[ RemoteClusterDebugging 構成の作成] を選択します。

    IntelliJ IDEA リモート構成を作成します。

  13. [ RemoteClusterDebugging 構成の作成 ] ダイアログ ボックスで、構成の名前を指定し、テスト名として [ テストの種類 ] を選択 します。 その他の値はすべて既定の設定のままにします。 [Apply](適用) を選択し、次に [OK] を選択します。

    RemoteClusterDebugging 構成を作成します。

  14. これで、メニュー バーに [リモート実行 構成] ドロップダウン リストが表示されます。

    IntelliJ [Remote run]\(リモート実行\) ドロップダウン リスト。

手順 5: デバッグ モードでアプリケーションを実行する

  1. IntelliJ IDEA プロジェクトで、 SparkSample.scala を開き、 val rdd1の横にブレークポイントを作成します。 [Create Breakpoint for]\(ブレークポイントの作成対象\) ポップアップ メニューで [line in function executeJob]\(executeJob 関数内の行\) を選択します。

    IntelliJ IDEA ブレークポイントを追加します。

  2. アプリケーションを実行するには、[リモート実行構成] ドロップダウン リストの横にある [デバッグ実行] ボタンを選択します。

    IntelliJ IDEA [デバッグの実行] ボタンを選択します。

  3. プログラムの実行がブレークポイントに達すると、下部のウィンドウに [デバッガー ] タブが表示されます。

    IntelliJ IDEA デバッガー タブを表示します。

  4. ウォッチを追加するには、(+) アイコンを選択します。

    IntelliJ debug-add-watch-variable。

    この例では、変数 rdd1 が作成される前にアプリケーションが中断されました。 このウォッチを使用すると、変数 rddの最初の 5 行を確認できます。 「を選択し、を入力します。」

    IntelliJ デバッグ モードでプログラムを実行します。

    前の図に示されているのは、実行時にテラバイト単位のデータに対してクエリを実行し、アプリケーションの進行状況をデバッグできることです。 たとえば、前の図に示した出力では、出力の最初の行がヘッダーであることがわかります。 この出力に基づいて、必要に応じて、ヘッダー行をスキップするようにアプリケーション コードを変更できます。

  5. [ プログラムの再開 ] アイコンを選択して、アプリケーションの実行を続行できるようになりました。

    IntelliJ IDEA プログラムの再開を選択します。

  6. アプリケーションが正常に完了すると、次のような出力が表示されます。

    IntelliJ IDEA デバッガー コンソールの出力。

次のステップ

シナリオ

アプリケーションの作成と実行

ツールと拡張機能

リソースの管理