使用Apache Spark UI進行調試
本指南將帶您瀏覽可用的不同調試選項,以窺探Apache Spark應用程序的內部結構。三個重要的地方是:
火花UI
司機日誌
遺囑執行人的日誌
火花UI
一旦開始工作,Spark UI就會顯示有關應用程序中正在發生的事情的信息。要進入Spark UI,請單擊附加的集群:
流選項卡
一旦您進入Spark UI,您將看到一個Streaming選項卡,如果一個流作業正在這個集群中運行。如果此集群中沒有運行流作業,則此選項卡將不可見。你可以跳到司機日誌了解如何檢查在啟動流作業時可能發生的異常。
在這個頁麵中要查找的第一件事是檢查流應用程序是否從源接收任何輸入事件。在本例中,您可以看到作業每秒接收1000個事件。
如果您有一個接收多個輸入流的應用程序,您可以單擊輸入速度鏈接,該鏈接將顯示每個接收器接收到的事件的數量。
處理時間
當你向下滾動時,找到處理時間.這是理解流作業性能的關鍵圖表之一。作為一個一般的經驗法則,如果您能在批處理時間的80%內處理每個批處理是好的。
對於這個應用程序,批處理間隔為2秒。平均處理時間為450ms,遠遠低於批處理間隔。如果平均處理時間接近或大於批處理間隔,那麼您將擁有一個流應用程序,它將開始排隊,並很快導致積壓,從而最終導致您的流作業。
完成的批次
在頁麵的最後,您將看到所有已完成批次的列表。該頁麵顯示了最近完成的1000個批次的詳細信息。從該表中,您可以獲得每個批處理的事件的數量及其處理時間。如果您想了解關於其中一個批上發生的事情的更多信息,您可以單擊批鏈接以進入批詳細信息頁麵。
批處理詳細信息頁麵
此頁麵有您想了解的關於批處理的所有詳細信息。兩件關鍵的事情是:
輸入:有關於批處理輸入的詳細信息。在本例中,它有關於Apache Kafka主題、分區和Spark結構化流為該批處理讀取的偏移量的詳細信息。對於TextFileStream,您將看到為此批處理讀取的文件名列表。這是開始調試從文本文件讀取的流式應用程序的最佳方法。
處理:您可以單擊指向作業ID的鏈接,其中包含關於此批處理期間所完成處理的所有詳細信息。
工作詳細信息頁麵
工作細節頁麵顯示了DAG可視化。這對於理解每個批處理的操作順序和依賴關係非常有用。在這種情況下,你可以看到批量從Kafka直接流讀取輸入,然後是平麵映射操作,然後是映射操作。然後使用生成的流使用updateStateByKey更新全局狀態。(灰色的方框表示跳過的階段。Spark足夠聰明,可以跳過一些不需要重新計算的階段。如果數據是檢查點或緩存的,那麼Spark將跳過這些階段的重新計算。在這種情況下,這些階段對應於對前一批的依賴,因為updateStateBykey
.因為Spark結構化流在內部檢查流,它從檢查點讀取,而不是依賴於之前的批,它們顯示為灰色的階段。)
在頁麵底部,您還將找到為該批處理執行的作業列表。您可以單擊描述中的鏈接,進一步深入到任務級別的執行。
任務詳細信息頁麵
這是您可以從Spark應用程序的Spark UI中進行的最細粒度級別的調試。此頁麵包含此批處理中執行的所有任務。如果您正在調查流應用程序的性能問題,那麼這個頁麵將提供諸如執行的任務數量、它們在哪裏執行(在哪些執行程序上執行)和洗牌信息等信息
提示
確保任務在集群中的多個執行器(節點)上執行,以便在處理時具有足夠的並行性。如果您隻有一個接收器,有時可能隻有一個執行程序在執行所有的工作,盡管您的集群中有多個執行程序。
線程轉儲
線程轉儲顯示JVM線程狀態的快照。
線程轉儲在調試特定的掛起或緩慢運行的任務時非常有用。使用實例在Spark界麵中查看指定任務的線程轉儲。
單擊工作選項卡。
在工作表中,找到與要查看的線程轉儲對應的目標作業,並單擊描述列。
在工作的階段表中,找到與要查看的線程轉儲相對應的目標階段,並單擊描述列。
在舞台的任務列表中,找到與要查看的線程轉儲對應的目標任務,並注意其任務ID而且遺囑執行人ID值。
單擊執行人選項卡。
在執行人表中,查找包含遺囑執行人ID對象對應的遺囑執行人ID您先前注意到的值。在該行中,單擊線程轉儲列。
在執行程序的線程轉儲表中,單擊線程的名字列(TID緊隨其後的是任務ID您先前注意到的值。(如果任務已經完成運行,您將找不到匹配的線程)。顯示任務的線程轉儲。
線程轉儲對於調試驅動程序似乎掛起(例如,沒有顯示Spark進度條)或查詢沒有進展(例如,Spark進度條卡在100%)的問題也很有用。在Spark UI中查看驅動程序的線程轉儲。
單擊執行人選項卡。
在執行人表,司機行,單擊中的鏈接線程轉儲列。將顯示驅動程序的線程轉儲。