使用適用於 IntelliJ 的 Azure 工具組建立 HDInsight 叢集的 Apache Spark 應用程式

本文示範如何使用 IntelliJ IDE 的 Azure 工具組外掛程式,在 Azure HDInsight 上開發 Apache Spark 應用程式。 Azure HDInsight 是雲端中的受控開放原始碼分析服務。 服務可讓您使用開放原始碼架構,例如 Hadoop、Apache Spark、Apache Hive 和 Apache Kafka。

您可以透過幾種方式使用 Azure 工具元件

  • 開發和提交 Scala Spark 應用程式至 HDInsight Spark 叢集。
  • 存取您的 Azure HDInsight Spark 叢集資源。
  • 在本機開發並執行 Scala Spark 應用程式。

在本文中,您將學會如何:

  • 使用適用於 IntelliJ 的 Azure 工具元件
  • 開發 Apache Spark 應用程式
  • 將應用程式提交至 Azure HDInsight 叢集

必要條件

安裝 IntelliJ IDEA 的 Scala 外掛程式

安裝 Scala 外掛程式的步驟:

  1. 開啟 IntelliJ IDEA。

  2. 在歡迎畫面上,流覽至 [設定>外掛程式] 以開啟 [外掛程式] 視窗。

    IntelliJ IDEA enables scala plugin.

  3. 針對新視窗中精選的 Scala 外掛程式,選取 [安裝 ]。

    IntelliJ IDEA installs scala plugin.

  4. 外掛程式安裝成功之後,您必須重新啟動 IDE。

建立 HDInsight Spark 叢集的 Spark Scala 應用程式

  1. 啟動 IntelliJ IDEA,然後選取 [ 建立新專案 ] 以開啟 [ 新增專案 ] 視窗。

  2. 從左窗格中選取 [Azure Spark/HDInsight ]。

  3. 從主視窗中選取 [Spark 專案] [Scala ]。

  4. 從 [ 建置工具 ] 下拉式清單中,選取下列其中一個選項:

    • 適用於 Scala 專案建立精靈的 Maven 支援。

    • 用於管理 Scala 專案的相依性和建置的 SBT

      IntelliJ IDEA New Project dialog box.

  5. 選取 [下一步]。

  6. 在 [ 新增專案] 視窗中,提供下列資訊:

    屬性 說明
    專案名稱 輸入名稱。 本文使用 myApp
    專案位置 輸入儲存專案的位置。
    專案 SDK 第一次使用 IDEA 時,此欄位可能空白。 選取 [ 新增... ],然後瀏覽至您的 JDK。
    Spark 版本 建立精靈會整合 Spark SDK 和 Scala SDK 的適當版本。 如果 Spark 叢集版本早於 2.0,請選取 [Spark 1.x] 。 否則,請選取 [Spark 2.x] 。 此範例使用Spark 2.3.0 (Scala 2.11.8)。

    Selecting the Apache Spark SDK.

  7. 選取 [完成]。 可能需要幾分鐘的時間,專案才會可供使用。

  8. Spark 專案會自動為您建立成品。 若要檢視該成品,請執行下列步驟:

    a. 從功能表欄,流覽至 [檔案>項目結構...]。

    b. 從 [ 項目結構] 視窗中,選取 [ 成品]。

    c. 檢視成品之後,選取 [ 取消 ]。

    Artifact info in the dialog box.

  9. 執行下列步驟來新增應用程式原始碼:

    a. 從 Project,流覽至 myApp>src>主要>Scala。

    b. 以滑鼠右鍵按兩下 scala,然後流覽至[新增>Scala 類別]。

    Commands for creating a Scala class from Project.

    c. 在 [建立新的 Scala 類別] 對話框中,提供名稱、在 [種類] 下拉式清單中選取 [物件],然後選取 [確定]。

    Create New Scala Class dialog box.

    d. myApp.scala 檔案接著會在主要檢視中開啟。 將預設程式代碼取代為下列程式代碼:

    import org.apache.spark.SparkConf
    import org.apache.spark.SparkContext
    
    object myApp{
        def main (arg: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("myApp")
        val sc = new SparkContext(conf)
    
        val rdd = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
        //find the rows that have only one digit in the seventh column in the CSV file
        val rdd1 =  rdd.filter(s => s.split(",")(6).length() == 1)
    
        rdd1.saveAsTextFile("wasbs:///HVACOut")
        }
    
    }
    

    程序代碼會從 HVAC.csv 讀取資料(適用於所有 HDInsight Spark 叢集),擷取 CSV 檔案中第七個數據行中只有一位數的數據列,並將輸出 /HVACOut 寫入叢集的預設記憶體容器底下。

連線 至 HDInsight 叢集

用戶可以登入您的 Azure 訂用帳戶,或連結 HDInsight 叢集。 使用Ambari使用者名稱/密碼或已加入網域的認證來連線到您的 HDInsight 叢集。

登入您的 Azure 訂用帳戶

  1. 從功能表欄,流覽至 [檢視>工具][Windows>Azure 總管]。

    IntelliJ IDEA shows azure explorer.

  2. 在 [Azure 總管] 中 ,以滑鼠右鍵按兩下 Azure 節點,然後選取 [ 登入]。

    IntelliJ IDEA explorer right-click azure.

  3. 在 [Azure 登入] 對話框中,選擇 [裝置登入],然後選取 [登入]。

    `IntelliJ IDEA azure sign-in device login`.

  4. 在 [ Azure 裝置登入] 對話框中,按兩下 [ 複製與開啟]。

    `IntelliJ IDEA azure device login`.

  5. 在瀏覽器介面中,貼上程式代碼,然後按 [ 下一步]。

    `Microsoft enter code dialog for HDI`.

  6. 輸入您的 Azure 認證,然後關閉瀏覽器。

    `Microsoft enter e-mail dialog for HDI`.

  7. 登入之後,[ 選取訂用帳戶 ] 對話框會列出與認證相關聯的所有 Azure 訂用帳戶。 選取您的訂用帳戶,然後選取 [ 選取 ] 按鈕。

    The Select Subscriptions dialog box.

  8. Azure 檔案總管,展開 [HDInsight ] 以檢視訂用帳戶中的 HDInsight Spark 叢集。

    IntelliJ IDEA Azure Explorer main view.

  9. 若要檢視與叢集相關聯的資源(例如記憶體帳戶),您可以進一步展開叢集名稱節點。

    Azure Explorer storage accounts.

您可以使用 Apache Ambari 受控使用者名稱連結 HDInsight 叢集。 同樣地,針對已加入網域的 HDInsight 叢集,您可以使用網域和使用者名稱連結,例如 user1@contoso.com。 您也可以連結 Livy 服務叢集。

  1. 從功能表欄,流覽至 [檢視>工具][Windows>Azure 總管]。

  2. 從 Azure 檔案總管,以滑鼠右鍵按兩下 HDInsight 節點,然後選取 [ 連結叢集]。

    Azure Explorer link cluster context menu.

  3. [ 鏈接 A 叢集 ] 視窗中的可用選項會根據您從 [鏈接資源類型 ] 下拉式清單中選取的值而有所不同。 輸入您的值,然後選取 [ 確定]。

    • HDInsight 叢集

      屬性
      鏈接資源類型 從下拉式清單中選取 [HDInsight 叢集 ]。
      叢集名稱/URL 輸入叢集名稱。
      驗證類型 保留為 基本身份驗證
      使用者名稱 輸入叢集使用者名稱,預設值為admin。
      密碼 輸入使用者名稱的密碼。

      IntelliJ IDEA link a cluster dialog.

    • Livy 服務

      屬性
      鏈接資源類型 從下拉式清單中選取 [Livy 服務 ]。
      Livy 端點 輸入 Livy 端點
      叢集名稱 輸入叢集名稱。
      Yarn 端點 選擇性。
      驗證類型 保留為 基本身份驗證
      使用者名稱 輸入叢集使用者名稱,預設值為admin。
      密碼 輸入使用者名稱的密碼。

      IntelliJ IDEA link Livy cluster dialog.

  4. 您可以從 HDInsight 節點看到連結的叢集。

    Azure Explorer linked cluster1.

  5. 您也可以從 Azure Explorer 取消連結叢集。

    Azure Explorer unlinked cluster.

在 HDInsight Spark 叢集上執行 Spark Scala 應用程式

建立 Scala 應用程式之後,您可以將它提交至叢集。

  1. 在 [Project] \(專案\) 中,瀏覽至 [myApp] >[src] >[main] >[scala] >[myApp] 。 以滑鼠右鍵按下 myApp,然後選取 [提交 Spark 應用程式 ] (可能位於清單底部)。

    The Submit Spark Application to HDInsight command.

  2. 在 [ 提交 Spark 應用程式 ] 對話框視窗中,選取 [1]。HDInsight 上的Spark。

  3. 在 [ 編輯組態 ] 視窗中,提供下列值,然後選取 [ 確定]:

    屬性
    Spark clusters (Linux only) (Spark 叢集 (僅限 Linux)) 選取您要在其中執行應用程式的 HDInsight Spark 叢集。
    選取要提交的成品 保留預設設定。
    Main class name (主要類別名稱) 預設值是所選取檔案中的主要類別。 您可以選取省略號 ( ... ) 並選擇另一個類別來變更類別。
    作業組態 您可以變更預設索引鍵和 或 值。 如需詳細資訊,請參閱 Apache Livy REST API
    命令列引數 如有需要,您可以輸入以空格分隔的主類別自變數。
    參考的 Jar 和參考的檔案 如果有的話,您可以輸入所參考 Jar 和檔案的路徑。 您也可以流覽 Azure 虛擬檔案系統中的檔案,其目前僅支援 ADLS Gen 2 叢集。 如需詳細資訊: Apache Spark 組態。 另 請參閱如何將資源上傳至叢集
    作業上傳 儲存體 展開以顯示其他選項。
    儲存區類型 從下拉式清單中選取 [使用 Azure Blob 上傳 ]。
    儲存體帳戶 輸入您的記憶體帳戶。
    儲存體金鑰 輸入您的記憶體金鑰。
    儲存體 容器 從下拉式清單中選取記憶體容器,一旦 儲存體 帳戶輸入 儲存體 密鑰

    The Spark Submission dialog box.

  4. 選取 [SparkJobRun ],將您的專案提交至選取的叢集。 [Remote Spark Job in Cluster] \(叢集中的遠端 Spark 作業\) 索引標籤在底部顯示作業執行進度。 您可以按一下紅色按鈕來停止應用程式。

    Apache Spark Submission window.

在本機或遠端對 HDInsight 叢集上的 Apache Spark 應用程式進行偵錯

我們也建議將Spark應用程式提交至叢集的另一種方式。 您可以在執行/偵錯組態 IDE 中設定參數來執行此動作。 請參閱 使用 Azure Toolkit for IntelliJ 透過 SSH 在本機或遠端對 HDInsight 叢集上的 Apache Spark 應用程式進行偵錯。

使用適用於 IntelliJ 的 Azure 工具組存取和管理 HDInsight Spark 叢集

您可以使用適用於 IntelliJ 的 Azure 工具組來執行各種作業。 大部分作業都是從 Azure Explorer 啟動。 從功能表欄,流覽至 [檢視>工具][Windows>Azure 總管]。

存取作業檢視

  1. 從 Azure 檔案總管,流覽至 HDInsight><您的叢集>>作業。

    IntelliJ Azure Explorer Job view node.

  2. 在右窗格中,[ Spark 作業檢視 ] 索引卷標會顯示叢集上執行的所有應用程式。 選取您想要查看詳細資料的應用程式名稱。

    Spark Job View Application details.

  3. 若要顯示基本的執行中作業資訊,請將滑鼠停留在作業圖形上。 若要檢視每個作業產生的階段圖形和資訊,請選取作業圖形上的節點。

    Spark Job View Job stage details.

  4. 若要檢視常用記錄檔,例如 Driver StderrDriver Stdout目錄資訊,請選取 [ 記錄] 索引標籤。

    Spark Job View Log details.

  5. 您可以檢視 Spark 歷程記錄 UI 和 YARN UI(在應用層級)。 選取視窗頂端的連結。

存取 Spark 歷程記錄伺服器

  1. 從 Azure Explorer 展開 [HDInsight],以滑鼠右鍵按兩下您的 Spark 叢集名稱,然後選取 [ 開啟 Spark 歷程記錄 UI]。

  2. 出現提示時,請輸入您設定叢集時所指定的叢集管理員認證。

  3. 在 Spark 歷程記錄伺服器儀錶板上,您可以使用應用程式名稱來尋找您剛完成執行的應用程式。 在上述程式代碼中,您會使用 val conf = new SparkConf().setAppName("myApp")來設定應用程式名稱。 您的Spark應用程式名稱是 myApp

啟動Ambari入口網站

  1. 從 [Azure 總管] 展開 [HDInsight],以滑鼠右鍵按兩下您的Spark 叢集名稱,然後選取 [開啟叢集管理入口網站][Ambari]。

  2. 出現提示時,請輸入叢集的管理員認證。 您在叢集設定程式期間指定了這些認證。

管理 Azure 訂用帳戶

根據預設,適用於 IntelliJ 的 Azure 工具組會列出您所有 Azure 訂用帳戶中的 Spark 叢集。 如有必要,您可以指定您想要存取的訂用帳戶。

  1. 從 Azure Explorer,以滑鼠右鍵按兩下 Azure 根節點,然後選取 [選取 訂用帳戶]。

  2. 從 [ 選取訂用帳戶 ] 視窗中,清除您不想存取之訂用帳戶旁的複選框,然後選取 [ 關閉]。

Spark 主控台

您可以執行 Spark 本機主控台 (Scala) 或執行 Spark Livy 互動式工作階段主控台 (Scala)。

Spark 本機主控台 (Scala)

請確定您已滿足WINUTILS.EXE必要條件。

  1. 從功能表列,瀏覽至 [Run] \(執行\)>[Edit Configurations] \(編輯設定\)。

  2. 從 [執行/偵錯組態] 視窗的左窗格中,流覽至 HDInsight 上的 Apache Spark[HDInsight> 上的 Spark] myApp。

  3. 從主視窗中,選取索引 Locally Run 標籤。

  4. 提供下列值,然後選取 [OK] \(確定\):

    屬性
    作業主要類別 預設值是所選取檔案中的主要類別。 您可以選取省略號 ( ... ) 並選擇另一個類別來變更類別。
    環境變數 請確定 HADOOP_HOME 的值是正確的。
    WINUTILS.exe 位置 請確定路徑是正確的。

    Local Console Set Configuration.

  5. 在 [Project] \(專案\) 中,瀏覽至 [myApp] >[src] >[main] >[scala] >[myApp] 。

  6. 在功能表列中,瀏覽至 [Tools] \(工具\)>[Spark Console] \(Spark 主控台\)>[Run Spark Local Console(Scala)] \(執行 Spark 本機主控台 (Scala)\)。

  7. 然後可能會出現兩個對話方塊,詢問您是否要自動修正相依性。 如果需要,請選取 [Auto Fix] \(自動修正\)。

    IntelliJ IDEA Spark Auto Fix dialog1.

    IntelliJ IDEA Spark Auto Fix dialog2.

  8. 主控台看起來應該類似下面的圖片。 在主控台視窗中,輸入 sc.appName,然後按 Ctrl+Enter。 系統將會顯示結果。 您可以按下紅色按鈕來結束本機控制台。

    IntelliJ IDEA local console result.

Spark Livy 互動式工作階段主控台 (Scala)

  1. 從功能表列,瀏覽至 [Run] \(執行\)>[Edit Configurations] \(編輯設定\)。

  2. 從 [執行/偵錯組態] 視窗的左窗格中,流覽至 HDInsight 上的 Apache Spark[HDInsight> 上的 Spark] myApp。

  3. 從主視窗中,選取索引 Remotely Run in Cluster 標籤。

  4. 提供下列值,然後選取 [OK] \(確定\):

    屬性
    Spark clusters (Linux only) (Spark 叢集 (僅限 Linux)) 選取您要在其中執行應用程式的 HDInsight Spark 叢集。
    Main class name (主要類別名稱) 預設值是所選取檔案中的主要類別。 您可以選取省略號 ( ... ) 並選擇另一個類別來變更類別。

    Interactive Console Set Configuration.

  5. 在 [Project] \(專案\) 中,瀏覽至 [myApp] >[src] >[main] >[scala] >[myApp] 。

  6. 在功能表列中,瀏覽至 [Tools] \(工具\)>[Spark Console] \(Spark 主控台\)>[Run Spark Livy Interactive Session Console(Scala)] \(執行 Spark Livy 互動式工作階段主控台 (Scala)\)。

  7. 主控台看起來應該類似下面的圖片。 在主控台視窗中,輸入 sc.appName,然後按 Ctrl+Enter。 系統將會顯示結果。 您可以按下紅色按鈕來結束本機控制台。

    IntelliJ IDEA Interactive Console Result.

將選取專案傳送至 Spark 控制台

您可以藉由將某些程式代碼傳送至本機控制台或 Livy 互動式會話主控台(Scala)來預測腳本結果,這很方便。 您可以將 Scala 檔案中的某些程式碼反白顯示,然後以滑鼠右鍵按一下 [Send Selection To Spark Console] \(傳送所選項目至 Spark 主控台\)。 選取的程式代碼將會傳送至主控台。 結果會在主控台中顯示於程式碼之後。 主控台會檢查錯誤 (如果有的話)。

Send Selection to Spark Console.

與 HDInsight Identity Broker 整合 (HIB)

使用 ID Broker 連線 HDInsight ESP 叢集 (HIB)

您可以遵循一般步驟來登入 Azure 訂用帳戶,以使用 ID Broker (HIB) 連線到 HDInsight ESP 叢集。 登入之後,您會在 Azure Explorer 中看到叢集清單。 如需詳細資訊,請參閱 連線 HDInsight 叢集

在具有 ID Broker 的 HDInsight ESP 叢集上執行 Spark Scala 應用程式 (HIB)

您可以遵循一般步驟,將作業提交至具有ID Broker(HIB) 的 HDInsight ESP 叢集。 如需 更多指示,請參閱在 HDInsight Spark 叢集 上執行 Spark Scala 應用程式。

我們會使用您的登入帳戶,將必要的檔案上傳至名為 的資料夾,您可以在組態檔中看到上傳路徑。

upload path in the configuration.

HDInsight ESP 叢集上的 Spark 控制台與 ID Broker (HIB)

您可以在具有 ID Broker (HIB) 的 HDInsight ESP 叢集上執行 Spark Local Console(Scala)或執行 Spark Livy 互動式會話控制台(Scala)。 如需更多指示, 請參閱Spark控制台

注意

針對具有Id Broker的 HDInsight ESP 叢集(HIB), 目前不支援從遠端連結叢集 錯 Apache Spark 應用程式。

僅限讀者角色

當使用者將作業提交至具有唯讀角色許可權的叢集時,需要Ambari認證。

  1. 使用僅限讀取者角色帳戶登入。

  2. Azure Explorer 展開 [HDInsight ] 以檢視訂用帳戶中的 HDInsight 叢集。 標示 為「角色:讀取者」的 叢集只有讀者專用角色許可權。

    `IntelliJ Azure Explorer Role:Reader`.

  3. 以滑鼠右鍵按兩下具有唯讀角色許可權的叢集。 從操作功能表選取 [ 連結此叢集 ] 以連結叢集。 輸入Ambari使用者名稱和密碼。

    IntelliJ Azure Explorer link this cluster.

  4. 如果叢集已成功連結,則會重新整理 HDInsight。 叢集的階段將會連結。

    IntelliJ Azure Explorer linked dialog.

  1. 按兩下 [作業] 節點、[叢集作業存取遭拒] 視窗彈出視窗。

  2. 按兩下 [ 連結此叢集] 連結叢集

    cluster job access denied dialog.

  1. 建立 HDInsight 組態。 然後選取 [ 在叢集中遠端執行]。

  2. 選取叢集,其具有Spark叢集(僅限Linux)唯讀角色許可權。 警告訊息顯示出來。您可以按下 [ 連結此叢集 ] 來連結叢集。

    IntelliJ IDEA run/debug configuration create.

檢視 儲存體 帳戶

  • 針對具有唯讀角色許可權的叢集,按兩下 [儲存體 帳戶] 節點,儲存體 [拒絕存取] 視窗彈出視窗。 您可以按兩下 [開啟 Azure 儲存體 總管] 來開啟 儲存體總管。

    `IntelliJ IDEA Storage Access Denied`.

    IntelliJ IDEA Storage Access Denied button.

  • 針對連結的叢集,按兩下 [儲存體 帳戶] 節點,儲存體 [拒絕存取] 視窗彈出視窗。 您可以按兩下 [開啟 Azure 儲存體],以開啟 儲存體總管。

    `IntelliJ IDEA Storage Access Denied2`.

    IntelliJ IDEA Storage Access Denied2 button.

將現有的 IntelliJ IDEA 應用程式轉換為使用適用於 IntelliJ 的 Azure 工具組

您可以將您在 IntelliJ IDEA 中建立的現有 Spark Scala 應用程式轉換為與適用於 IntelliJ 的 Azure 工具組相容。 接著,您可以使用外掛程式將應用程式提交至 HDInsight Spark 叢集。

  1. 針對透過 IntelliJ IDEA 建立的現有 Spark Scala 應用程式,請開啟相關聯的 .iml 檔案。

  2. 在根層級,是 類似下列文字的模組 專案:

    <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
    

    編輯 要加入 UniqueKey="HDInsightTool" 的 元素,讓 模組 元素看起來像下列文字:

    <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4" UniqueKey="HDInsightTool">
    
  3. 儲存變更。 您的應用程式現在應該與適用於 IntelliJ 的 Azure 工具組相容。 您可以用滑鼠右鍵按下 Project 中的項目名稱來測試它。 彈出視窗現在有 [將Spark 應用程式提交至 HDInsight] 選項

清除資源

如果您不打算繼續使用此應用程式,請使用下列步驟刪除您所建立的叢集:

  1. 登入 Azure 入口網站

  2. 在頂端的 [搜尋] 方塊中,輸入 HDInsight

  3. 在 [服務] 底下,選取 [HDInsight 叢集]

  4. 在出現的 HDInsight 叢集清單中,選取 您為此文章建立的叢集旁的 ...

  5. 選取 [刪除]。 選取 [是]

Azure portal deletes HDInsight cluster.

錯誤和解決方案

如果您收到組建失敗錯誤,請取消將 src 資料夾標示為 Sources ,如下所示:

Screenshot showing the build failed.

將 src 資料夾取消標示為 來源 ,以解決此問題:

  1. 流覽至 [ 檔案 ],然後選取 [項目結構]。

  2. 選取 [專案] 設定 底下的 [模組]。

  3. 選取 src 檔案,並取消標示為 [來源]。

  4. 按兩下 [套用] 按鈕,然後按下 [確定] 按鈕以關閉對話框。

    Screenshot showing the unmark the src as sources.

下一步

在本文中,您已瞭解如何使用 Azure Toolkit for IntelliJ 外掛程式來開發以 Scala 撰寫的 Apache Spark 應用程式。 然後將它們直接從 IntelliJ 集成開發環境 (IDE) 提交至 HDInsight Spark 叢集。 前進到下一篇文章,以瞭解您在Apache Spark中註冊的數據如何提取到Bi分析工具,例如Power BI。