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

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

必要條件

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

啟動 Apache Zeppelin 筆記本

  1. 從 Spark 叢集概觀中,從 [叢集儀錶板] 選取 [Zeppelin Notebook]。 輸入叢集的管理員認證。

    注意

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

    https://CLUSTERNAME.azurehdinsight.net/zeppelin

  2. 建立新的 Notebook。 從頁首窗格中,流覽至 [Notebook>建立新記事]。

    Create a new Zeppelin notebook.

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

  3. 確定筆記本標頭會顯示連線狀態。 其以右上角的綠色點表示。

    Zeppelin notebook status.

  4. 將範例數據載入臨時表。 當您在 HDInsight 中建立 Spark 叢集時,範例數據檔 hvac.csv會複製到 下 \HdiSamples\SensorSampleData\hvac相關聯的記憶體帳戶。

    在新筆記本中預設建立的空白段落中,貼上下列代碼段。

    %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 ,或選取 段落的 [播放 ] 按鈕以執行代碼段。 段落右上角的狀態應該從 READY、PENDING、RUNNING 到 FINISHED 進行。 輸出會顯示在相同段落底部。 螢幕快照看起來像下圖:

    Create a temporary table from raw data.

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

    注意

    所有 HDInsight 版本的 Zeppelin 筆記本都不支援 %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 語句會告訴筆記本使用 Livy Scala 解釋器。

  6. 選取 條形圖 圖示以變更顯示。 設定 會出現在您選取 條形圖之後,可讓您選擇 [索引鍵] 和 [值]。 下列螢幕快照顯示輸出。

    Run a Spark SQL statement using the notebook1.

  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。 然後從 [暫存] 下拉式清單中選取 65

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

    • 群組: 新增 targettemp

    • 值: 1。 拿掉 日期。 2. 新增 temp_diff。 3. 將匯總工具從 SUM 變更為 AVG

      下列螢幕快照顯示輸出。

      Run a Spark SQL statement using the notebook2.

如何? 搭配筆記本使用外部套件?

HDInsight 上 Apache Spark 叢集中的 Zeppelin Notebook 可以使用未包含在叢集中的外部社群參與套件。 搜尋 Maven 存放 以取得可用套件的完整清單。 您也可以從其他來源取得可用套件清單。 例如,從 Spark 套件可以取得社群提供套件的完整清單。

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

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

    Launch interpreter.

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

    Change interpreter settings1.

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

    Change interpreter settings2.

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

  4. 如果您想要瞭解如何到達上面輸入的索引鍵值,以下說明方式。

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

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

    Use external packages with Jupyter Notebook.

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

    com.databricks:spark-csv_2.10:1.4.0
    

Zeppelin 筆記本儲存在哪裡?

Zeppelin 筆記本會儲存至叢集前端節點。 因此,如果您刪除叢集,也會刪除筆記本。 如果您想要保留筆記本以供稍後在其他叢集上使用,您必須在完成執行作業之後加以匯出。 若要匯出筆記本,請選取 [導出 ] 圖示,如下圖所示。

Download notebook.

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

注意

  • 在 HDI 4.0 中,zeppelin Notebook 目錄路徑為, /usr/hdp/<version>/zeppelin/notebook/<notebook_session_id>/

    例如: /usr/hdp/4.1.17.10/zeppelin/2JMC9BZ8X/

    如 HDI 5.0 和上述路徑不同 /usr/hdp/<version>/zeppelin/notebook/<Kernel_name>/

    例如: /usr/hdp/5.1.4.5/zeppelin/notebook/Scala/

  • 儲存在 HDI 5.0 中的檔名不同。 儲存為 <notebook_name>_<sessionid>.zpln

    例如: testzeppelin_2JJK53XQA.zzo

    在 HDI 4.0 中,檔名只會note.json儲存在 session_id 目錄中。

    例如: /2JMC9BZ8X/note.json

  • HDI Zeppelin 一律會將筆記本儲存在 hn0 本機磁碟的路徑 /usr/hdp/<version>/zeppelin/notebook/ 中。

    如果您想要即使在叢集刪除之後,仍可使用筆記本,您可以嘗試使用 Azure 檔案記憶體(使用 SMB 通訊協定),並將它連結至本機路徑。 如需詳細資訊,請參閱 在Linux上掛接SMB Azure檔案共用

    掛接之後,您可以將 zeppelin 設定 zeppelin.notebook.dir 修改為 ambari UI 中掛接的路徑。

  • zeppelin 0.10.1 版不建議使用 SMB 檔案共享作為 GitNotebookRepo 記憶體

用來 Shiro 設定企業安全性套件 (ESP) 叢集中 Zeppelin 解釋器的存取

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

特殊許可權網域使用者可以使用 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 Notebook 中共用。 如果 Livy 會話因任何原因而終止,作業將不會從 Zeppelin 筆記本執行。

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

  1. 從 Zeppelin 筆記本重新啟動 Livy 解釋器。 若要這樣做,請選取右上角登入的使用者名稱,然後選取 [解釋器],以開啟解釋器設定。

    Launch interpreter.

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

    Restart the Livy interpreter.

  3. 從現有的 Zeppelin 筆記本執行程式代碼數據格。 此程式代碼會在 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。

記錄位置

服務 路徑
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. 流覽至 CONFIGS>進階 zeppelin-log4j-properties>log4j_properties_content。

  3. 變更 log4j.appender.dailyfile.Threshold = INFOlog4j.appender.dailyfile.Threshold = DEBUG

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

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

下一步