在 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 筆記本
從 Spark 叢集概觀中,從 [叢集儀錶板] 選取 [Zeppelin Notebook]。 輸入叢集的管理員認證。
注意
您也可以在瀏覽器中開啟下列 URL,以連線到叢集的 Zeppelin Notebook。 使用您叢集的名稱取代 CLUSTERNAME :
https://CLUSTERNAME.azurehdinsight.net/zeppelin
建立新的 Notebook。 從頁首窗格中,流覽至 [Notebook>建立新記事]。
輸入筆記本的名稱,然後選取 [ 建立附注]。
確定筆記本標頭會顯示連線狀態。 其以右上角的綠色點表示。
將範例數據載入臨時表。 當您在 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 進行。 輸出會顯示在相同段落底部。 螢幕快照看起來像下圖:
您也可以為每個段落提供標題。 從段落的右側,選取 設定 圖示 (sprocket),然後選取 [顯示標題]。
注意
所有 HDInsight 版本的 Zeppelin 筆記本都不支援 %spark2 解釋器,而且從 HDInsight 4.0 以後,不支援 %sh 解釋器。
您現在可以在
hvac
數據表上執行 Spark SQL 語句。 將下列查詢貼到新的段落中。 查詢會擷取建置標識碼。 此外,每個建築物在指定日期的目標和實際溫度之間的差異。 按 SHIFT + ENTER。%sql select buildingID, (targettemp - actualtemp) as temp_diff, date from hvac where date = "6/1/13"
開頭的 %sql 語句會告訴筆記本使用 Livy Scala 解釋器。
選取 條形圖 圖示以變更顯示。 設定 會出現在您選取 條形圖之後,可讓您選擇 [索引鍵] 和 [值]。 下列螢幕快照顯示輸出。
您也可以使用查詢中的變數來執行 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。
選取 條形圖 圖示以變更顯示。 然後選取 [設定 ],並進行下列變更:
群組: 新增 targettemp。
值: 1。 拿掉 日期。 2. 新增 temp_diff。 3. 將匯總工具從 SUM 變更為 AVG。
下列螢幕快照顯示輸出。
如何? 搭配筆記本使用外部套件?
HDInsight 上 Apache Spark 叢集中的 Zeppelin Notebook 可以使用未包含在叢集中的外部社群參與套件。 搜尋 Maven 存放 庫 以取得可用套件的完整清單。 您也可以從其他來源取得可用套件清單。 例如,從 Spark 套件可以取得社群提供套件的完整清單。
在本文中,您將瞭解如何搭配 Jupyter Notebook 使用 spark-csv 套件。
開啟解釋器設定。 從右上角選取登入的用戶名稱,然後選取 [ 解釋器]。
捲動至 livy2,然後選取 [編輯]。
流覽至索引鍵
livy.spark.jars.packages
,並以 格式group:id:version
設定其值。 因此,如果您想要使用 spark-csv 套件,您必須將索引鍵的值設定為com.databricks:spark-csv_2.10:1.4.0
。選取 [儲存],然後選取 [確定] 以重新啟動 Livy 解釋器。
如果您想要瞭解如何到達上面輸入的索引鍵值,以下說明方式。
a. 在「Maven 儲存機制」中找出套件。 在本文中,我們使用 spark-csv。
b. 從儲存機制收集 [GroupId]、[ArtifactId] 及 [版本] 的值。
c. 串連三個值,其中以冒號分隔 (:)。
com.databricks:spark-csv_2.10:1.4.0
Zeppelin 筆記本儲存在哪裡?
Zeppelin 筆記本會儲存至叢集前端節點。 因此,如果您刪除叢集,也會刪除筆記本。 如果您想要保留筆記本以供稍後在其他叢集上使用,您必須在完成執行作業之後加以匯出。 若要匯出筆記本,請選取 [導出 ] 圖示,如下圖所示。
此動作會將筆記本儲存為下載位置中的 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
檔案控制存取權,請使用下列步驟:
使用現有的功能變數名稱定義新的角色。 在下列範例中,
adminGroupName
是 AAD 中具特殊許可權的使用者群組。 請勿在組名中使用特殊字元或空格符。 之後=
的字元會提供此角色的許可權。*
表示群組具有完整許可權。[roles] adminGroupName = *
新增角色以存取 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 筆記本執行作業。
從 Zeppelin 筆記本重新啟動 Livy 解釋器。 若要這樣做,請選取右上角登入的使用者名稱,然後選取 [解釋器],以開啟解釋器設定。
捲動至 livy2,然後選取 [ 重新啟動]。
從現有的 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 |
啟用偵錯記錄
流覽至
https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary
CLUSTERNAME 是叢集名稱的位置。流覽至 CONFIGS>進階 zeppelin-log4j-properties>log4j_properties_content。
變更
log4j.appender.dailyfile.Threshold = INFO
為log4j.appender.dailyfile.Threshold = DEBUG
。加入
log4j.logger.org.apache.zeppelin.realm=DEBUG
。儲存變更並重新啟動服務。