在 Azure HDInsight 上搭配使用 Apache Zeppelin Notebook 和 Apache Spark 叢集

HDInsight Spark 叢集包含 Apache Zeppelin 筆記本。 使用筆記本來執行 Apache Spark 作業。 在本文中,您將學習如何在 HDInsight 叢集上使用 Zeppelin Notebook。

Prerequisites

  • HDInsight 上的 Apache Spark 叢集。 如需指示,請參閱在 Azure HDInsight 中建立 Apache Spark 叢集
  • 您叢集主要儲存體的 URI 配置。 此配置在 Azure Blob 儲存體中為 wasb://,在 Azure Data Lake Storage Gen2 中為 abfs://,而在 Azure Data Lake Storage Gen1 中為 adl://。 如果已對 Blob 儲存體啟用安全傳輸,URI 會是 wasbs://。 如需詳細資訊,請參閱在 Azure 儲存體中需要安全傳輸

啟動 Apache Zeppelin Notebook

  1. 在 Spark 叢集 [概觀] 中,從 [叢集儀表板] 中選取 [Zeppelin 筆記本]。 輸入叢集的管理員認證。

    注意

    您也可以在瀏覽器中開啟下列 URL,來連接到您叢集的 Zeppelin Notebook。 使用您叢集的名稱取代 CLUSTERNAME

    https://CLUSTERNAME.azurehdinsight.net/zeppelin

  2. 建立新的 Notebook。 從標題窗格中,瀏覽至 [筆記本]>[建立新記事]。

    建立新的 Zeppelin Notebook

    輸入筆記本的名稱,然後選取 [建立記事]。

  3. 請確定筆記本標題顯示的是已連線狀態。 右上角的綠點即表示此狀態。

    Zeppelin Notebook 狀態

  4. 將範例資料載入暫存資料表。 當您在 HDInsight 中建立 Spark 叢集時,範例資料檔案 hvac.csv 會複製到相關聯的儲存體帳戶的 \HdiSamples\SensorSampleData\hvac 下。

    將以下程式碼片段貼入新 Notebook 中預設建立的空白段落。

    %livy2.spark
    //The above magic instructs Zeppelin to use the Livy Scala interpreter
    
    // Create an RDD using the default Spark context, sc
    val hvacText = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
    // Define a schema
    case class Hvac(date: String, time: String, targettemp: Integer, actualtemp: Integer, buildingID: String)
    
    // Map the values in the .csv file to the schema
    val hvac = hvacText.map(s => s.split(",")).filter(s => s(0) != "Date").map(
        s => Hvac(s(0),
                s(1),
                s(2).toInt,
                s(3).toInt,
                s(6)
        )
    ).toDF()
    
    // Register as a temporary table called "hvac"
    hvac.registerTempTable("hvac")
    

    按下 SHIFT + ENTER,或選取 [執行] 按鈕讓段落執行程式碼片段。 段落右上角的狀態應該會從「準備就緒」逐一轉變成「擱置」、「執行中」及「已完成」。 輸出會顯示在同一個段落的底部。 螢幕擷取畫面如下圖所示:

    從原始資料建立暫存資料表

    您也可以為每個段落提供標題。 從段落的右側,選取設定圖示 (鏈輪),然後選取 [顯示標題]。

    注意

    所有 HDInsight 版本的 Zeppelin Notebook 中都不支援 %spark2 解譯器,而 HDInsight 4.0 以後的版本不支援 %sh 解譯器。

  5. 現在,您可以對 hvac 資料表執行 Spark SQL 陳述式。 將以下查詢貼入新段落。 此查詢會擷取建築物識別碼。 還有在某一天每棟建築物的目標溫度與實際溫度之間的差異。 按下 SHIFT + ENTER

    %sql
    select buildingID, (targettemp - actualtemp) as temp_diff, date from hvac where date = "6/1/13"
    

    開頭的 %Sql 陳述式會告訴 Notebook 使用 Livy Scala 解譯器。

  6. 選取長條圖圖示以變更顯示。 您選取長條圖之後出現的 [設定] 可讓您選擇 [索引鍵] 和 [值]。 以下螢幕擷取畫面顯示輸出。

    使用筆記本執行 Spark SQL 陳述式 1

  7. 您也可以在查詢中使用變數來執行 Spark SQL 陳述式。 下一個程式碼片段示範如何在查詢中以您要查詢的可能值來定義 Temp 變數。 當您第一次執行查詢時,下拉式清單會自動填入您指定的變數值。

    %sql  
    select buildingID, date, targettemp, (targettemp - actualtemp) as temp_diff from hvac where targettemp > "${Temp = 65,65|75|85}"
    

    將此程式碼片段貼到新的段落中,然後按下 SHIFT + ENTER。 然後從 [Temp] 下拉式清單中選取 [65]。

  8. 選取長條圖圖示以變更顯示。 然後選取 [設定],並進行下列變更:

    • 群組:新增 targettemp

    • 值:1。 移除 date。 2. 新增 temp_diff。 3. 將彙總工具從 SUM 變更為 AVG

      以下螢幕擷取畫面顯示輸出。

      使用筆記本執行 Spark SQL 陳述式 2

如何搭配 Notebook 使用外部套件?

在 HDInsight 上的 Apache Spark 叢集,Zeppelin 筆記本可以使用社群貢獻的外部套件 (不在叢集內)。 請在 Maven 存放庫中搜尋可用套件的完整清單。 您也可以從其他來源取得可用套件清單。 例如,從 Spark 套件可以取得社群提供套件的完整清單。

在本文中,您將了解如何搭配 Jupyter Notebook 使用 spark-csv 套件。

  1. 開啟解譯器設定。 從右上角選取已登入的使用者名稱,然後選取 [解譯器]。

    啟動解譯器

  2. 捲動至 [livy2],然後選取 [編輯]。

    變更解譯器設定 1

  3. 瀏覽至索引鍵 livy.spark.jars.packages,並以格式 group:id:version 來設定值。 因此,如果您想要使用 spark-csv 套件,您必須將金鑰值設為 com.databricks:spark-csv_2.10:1.4.0

    變更解譯器設定 2

    選取 [儲存],然後選取 [確定],以重新啟動 Livy 解譯器。

  4. 如果您想要了解如何得出上面所輸入的金鑰值,其方法如下。

    a. 在「Maven 儲存機制」中找出套件。 在本文中,我們使用 spark-csv

    b. 從儲存機制收集 [GroupId]、[ArtifactId] 及 [版本] 的值。

    搭配 Jupyter Notebook 使用外部套件

    c. 串連三個值,其中以冒號分隔 (:)。

    com.databricks:spark-csv_2.10:1.4.0
    

Zeppelin Notebook 儲存在哪裡?

Zeppelin Notebook 會儲存到叢集前端節點。 因此,如果您刪除叢集,Notebook 會一併刪除。 如果您想要保留 Notebook 以供稍後用於其他叢集上,您必須在作業執行完成後將 Notebook 匯出。 若要匯出筆記本,請選取匯出圖示,如下圖所示。

下載 Notebook

此動作會將筆記本儲存為 JSON 檔案放在您的下載位置中。

在企業安全性套件 (ESP) 叢集上使用 Shiro 來設定對 Zeppelin 解譯器的存取權

如上所述,自 HDInsight 4.0 起不支援 %sh 解譯器。 此外,由於 %sh 解譯器引起潛在的安全性問題,例如使用殼層命令存取金鑰表,因此也已從 HDInsight 3.6 ESP 叢集移除。 這表示按一下 [建立新記事] 時,或在解譯器 UI 中,預設無法使用解譯器 %sh

特殊權限網域使用者可以使用 Shiro.ini 檔案來控制對解譯器 UI 的存取權。 只有這些使用者可以建立新的 %sh 解譯器,並在每個新的 %sh 解譯器上設定權限。 若要使用 shiro.ini 檔案來控制存取權,請使用下列步驟:

  1. 使用現有的網域群組名稱來定義新的角色。 在下列範例中,adminGroupName 是 AAD 中的一組特殊權限使用者。 請勿在群組名稱中使用特殊字元或空白字元。 = 後面的字元將權限授與此角色。 * 表示群組具有完整權限。

    [roles]
    adminGroupName = *
    
  2. 新增角色以存取 Zeppelin 解譯器。 在下列範例中,adminGroupName 中的所有使用者都有權限存取 Zeppelin 解譯器,還可以建立新的解譯器。 您可以在 roles[] 中的方括弧之間放入多個角色,並以逗號分隔。 具有必要權限的使用者就可以存取 Zeppelin 解譯器。

    [urls]
    /api/interpreter/** = authc, roles[adminGroupName]
    

多個網域群組的範例 shiro.ini:

[main]
anyofrolesuser = org.apache.zeppelin.utils.AnyOfRolesUserAuthorizationFilter

[roles]
group1 = *
group2 = *
group3 = *

[urls]
/api/interpreter/** = authc, anyofrolesuser[group1, group2, group3]

Livy 工作階段管理

Zeppelin 筆記本中的執行第一個程式碼段落在叢集上建立新的 Livy 工作階段。 您稍後建立的所有 Zeppelin 筆記本會共用此工作階段。 如果 Livy 工作階段出於任何原因而終止,則不會從 Zeppelin 筆記本執行作業。

在這種情況下,您必須先執行下列步驟,才能開始從 Zeppelin 筆記本執行作業。

  1. 從 Zeppelin Notebook 重新啟動 Livy 解譯器。 作法是從右上角選取已登入的使用者名稱,以開啟解譯器設定,然後選取 [解譯器]。

    啟動解譯器

  2. 捲動至 [livy2],然後選取 [重新啟動]。

    重新啟動 Livy 解譯器

  3. 從現有的 Zeppelin Notebook 執行程式碼單元。 此程式碼在 HDInsight 叢集上建立新的 Livy 工作階段。

一般資訊

驗證服務

若要從 Ambari 驗證服務,請瀏覽至 https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary,其中 CLUSTERNAME 是叢集的名稱。

若要從命令列驗證服務,請透過 SSH 連線到前端節點。 使用 sudo su zeppelin 命令將使用者切換至 zeppelin。 狀態命令:

Command 描述
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh status 服務狀態。
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh --version 服務版本。
ps -aux | grep zeppelin 識別 PID。

記錄位置

服務 Path
zeppelin-server /usr/hdp/current/zeppelin-server/
伺服器記錄 /var/log/zeppelin
設定解譯器、 Shiro、site.xml、log4j /usr/hdp/current/zeppelin-server/conf 或 /etc/zeppelin/conf
PID 目錄 /var/run/zeppelin

啟用偵錯記錄

  1. 瀏覽至 https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary,其中 CLUSTERNAME 是叢集的名稱。

  2. 流覽至 [設定]>[進階 zeppelin-log4j-properties]>[log4j_properties_content]。

  3. log4j.appender.dailyfile.Threshold = INFO 修改為 log4j.appender.dailyfile.Threshold = DEBUG

  4. 加入 log4j.logger.org.apache.zeppelin.realm=DEBUG

  5. 儲存變更並重新啟動服務。

後續步驟