監控和儀器

有數種方式可以監控 Spark 應用程式:網路 UI、指標和外部儀器。

網頁介面

每個 SparkContext 都會啟動一個 網路 UI,預設在埠 4040 上,顯示有關應用程式的有用資訊。其中包括

您只要在網路瀏覽器中開啟 http://<driver-node>:4040 就能存取這個介面。如果同一個主機上執行多個 SparkContext,它們會繫結到從 4040 開始的連續埠(4041、4042 等)。

請注意,預設情況下,這些資訊只會在應用程式執行期間提供。若要在事後檢視網路 UI,請在啟動應用程式之前將 spark.eventLog.enabled 設為 true。這會將 Spark 設定為將編碼 UI 中顯示資訊的 Spark 事件記錄到持久性儲存空間。

事後檢視

只要應用程式的事件記錄存在,還是可以透過 Spark 的歷程伺服器建構應用程式的 UI。您可以執行下列動作來啟動歷程伺服器

./sbin/start-history-server.sh

這會在 http://<server-url>:18080(預設)建立一個網路介面,列出未完成和已完成的應用程式和嘗試。

使用檔案系統提供者類別(請參閱下方的 spark.history.provider)時,必須在 spark.history.fs.logDirectory 設定選項中提供基本記錄目錄,並且該目錄應包含每個目錄都代表一個應用程式事件記錄的子目錄。

spark 工作本身必須設定為記錄事件,並將其記錄到同一個共用可寫目錄。例如,如果伺服器設定的記錄目錄為 hdfs://namenode/shared/spark-logs,則用戶端選項會是

spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode/shared/spark-logs

歷程伺服器可以設定如下

環境變數

環境變數意義
SPARK_DAEMON_MEMORY 分配給歷史伺服器的記憶體(預設:1g)。
SPARK_DAEMON_JAVA_OPTS 歷史伺服器的 JVM 選項(預設:無)。
SPARK_DAEMON_CLASSPATH 歷史伺服器的類別路徑(預設:無)。
SPARK_PUBLIC_DNS 歷史伺服器的公開位址。如果未設定,連結至應用程式歷史記錄可能會使用伺服器的內部位址,導致連結中斷(預設:無)。
SPARK_HISTORY_OPTS 歷史伺服器的 spark.history.* 組態選項(預設:無)。

對滾動事件日誌檔套用壓縮

長期執行的應用程式(例如串流)可能會產生一個龐大的單一事件記錄檔,這可能會花費大量成本維護,而且每次在 Spark 歷史伺服器更新時,都需要大量資源來重播。

啟用 spark.eventLog.rolling.enabledspark.eventLog.rolling.maxFileSize 可以讓您擁有滾動事件記錄檔,而不是單一龐大的事件記錄檔,這可能會在某些情況下有所幫助,但它仍然無法幫助您減少記錄的整體大小。

Spark 歷史伺服器可以對滾動事件記錄檔套用壓縮,以減少記錄的整體大小,方法是在 Spark 歷史伺服器上設定組態 spark.history.fs.eventLog.rolling.maxFilesToRetain

詳細資訊將在下方說明,但請注意壓縮是一個有損失的作業。壓縮會捨棄一些事件,這些事件將不再顯示在使用者介面上 - 您可能需要在啟用選項之前檢查哪些事件將會被捨棄。

當壓縮發生時,歷史伺服器會列出應用程式的所有可用事件記錄檔,並將索引小於將保留的最小索引檔的事件記錄檔視為壓縮目標。例如,如果應用程式 A 有 5 個事件記錄檔,而 spark.history.fs.eventLog.rolling.maxFilesToRetain 設定為 2,則前 3 個記錄檔將被選為壓縮目標。

一旦選定目標,它就會分析它們以找出哪些事件可以排除,並將它們重新寫入一個壓縮檔,同時捨棄決定排除的事件。

壓縮會嘗試排除指向過時資料的事件。目前,以下說明要排除的事件候選

一旦重寫完成,原始日誌檔案將會透過盡力而為的方式刪除。歷史伺服器可能無法刪除原始日誌檔案,但這不會影響歷史伺服器的運作。

請注意,如果發現壓縮期間不會減少太多空間,Spark 歷史伺服器可能不會壓縮舊的事件日誌檔案。對於串流查詢,我們通常預期壓縮會執行,因為每個微批次會觸發一個或多個工作,這些工作將會很快完成,但壓縮在許多情況下不會執行批次查詢。

請也注意,這是 Spark 3.0 中引入的新功能,可能不會完全穩定。在某些情況下,壓縮可能會排除比您預期的更多的事件,導致歷史伺服器上應用程式的某些 UI 問題。請小心使用。

Spark 歷史伺服器組態選項

Spark 歷史伺服器的安全性選項在 安全性 頁面中有更詳細的說明。

屬性名稱 預設值 意義 自版本
spark.history.provider org.apache.spark.deploy.history.FsHistoryProvider 實作應用程式歷史後端的類別名稱。目前只有一個實作,由 Spark 提供,用於尋找儲存在檔案系統中的應用程式日誌。 1.1.0
spark.history.fs.logDirectory file:/tmp/spark-events 對於檔案系統歷史提供者,載入應用程式事件日誌的目錄 URL。這可以是本地的 file:// 路徑、HDFS 路徑 hdfs://namenode/shared/spark-logs 或 Hadoop API 支援的替代檔案系統的路徑。 1.1.0
spark.history.fs.update.interval 10s 檔案系統歷史提供者檢查日誌目錄中是否有新的或更新的日誌的週期。較短的間隔可以更快地偵測到新的應用程式,但會讓伺服器重新讀取更新的應用程式,進而增加負載。一旦更新完成,已完成和未完成的應用程式清單將會反映變更。 1.4.0
spark.history.retainedApplications 50 在快取中保留 UI 資料的應用程式數量。如果超過這個上限,最舊的應用程式將會從快取中移除。如果應用程式不在快取中,則必須從磁碟載入,才能從 UI 存取它。 1.0.0
spark.history.ui.maxApplications Int.MaxValue 在歷史摘要頁面上顯示的應用程式數量。即使應用程式 UI 沒有顯示在歷史摘要頁面上,仍然可以透過直接存取其 URL 來使用它們。 2.0.1
spark.history.ui.port 18080 歷史伺服器網路介面繫結的埠。 1.0.0
spark.history.kerberos.enabled false 指出歷史伺服器是否應使用 Kerberos 登入。如果歷史伺服器正在安全 Hadoop 群集上存取 HDFS 檔案,則需要這樣做。 1.0.1
spark.history.kerberos.principal (無) spark.history.kerberos.enabled=true 時,指定歷史伺服器的 Kerberos 主體名稱。 1.0.1
spark.history.kerberos.keytab (無) spark.history.kerberos.enabled=true 時,指定歷史伺服器的 Kerberos keytab 檔案位置。 1.0.1
spark.history.fs.cleaner.enabled false 指定歷史伺服器是否應定期從儲存中清除事件記錄。 1.4.0
spark.history.fs.cleaner.interval 1d spark.history.fs.cleaner.enabled=true 時,指定檔案系統工作記錄清除器檢查要刪除的檔案的頻率。如果符合以下兩個條件之一,則會刪除檔案。首先,如果檔案早於 spark.history.fs.cleaner.maxAge,則會刪除檔案。如果檔案數目超過 spark.history.fs.cleaner.maxNum,則也會刪除檔案,Spark 會嘗試根據應用程式的最舊嘗試時間順序清除已完成的嘗試。 1.4.0
spark.history.fs.cleaner.maxAge 7d spark.history.fs.cleaner.enabled=true 時,當檔案系統記錄清除器執行時,將刪除早於此時間的工作記錄檔案。 1.4.0
spark.history.fs.cleaner.maxNum Int.MaxValue spark.history.fs.cleaner.enabled=true 時,指定事件記錄目錄中的最大檔案數目。Spark 會嘗試清除已完成的嘗試記錄,以將記錄目錄維持在此限制以下。這應該小於基礎檔案系統限制,例如 HDFS 中的 `dfs.namenode.fs-limits.max-directory-items`。 3.0.0
spark.history.fs.endEventReparseChunkSize 1m 在記錄檔結尾解析多少位元組來尋找結尾事件。這用於透過略過事件記錄檔中不必要的部份來加速產生應用程式清單。可以透過將此組態設定為 0 來停用。 2.4.0
spark.history.fs.inProgressOptimization.enabled true 啟用最佳化處理進行中的記錄。此選項可能會讓無法重新命名其事件記錄的已完成應用程式列為進行中。 2.4.0
spark.history.fs.driverlog.cleaner.enabled spark.history.fs.cleaner.enabled 指定歷史伺服器是否應定期從儲存中清除驅動程式記錄。 3.0.0
spark.history.fs.driverlog.cleaner.interval spark.history.fs.cleaner.interval spark.history.fs.driverlog.cleaner.enabled=true 時,指定檔案系統驅動程式記錄清除器檢查要刪除的檔案的頻率。只有當檔案早於 spark.history.fs.driverlog.cleaner.maxAge 時才會刪除檔案 3.0.0
spark.history.fs.driverlog.cleaner.maxAge spark.history.fs.cleaner.maxAge spark.history.fs.driverlog.cleaner.enabled=true 時,當驅動程式記錄清除器執行時,將刪除早於此時間的驅動程式記錄檔案。 3.0.0
spark.history.fs.numReplayThreads 可用核心數的 25% 記錄伺服器將用來處理事件記錄的執行緒數目。 2.0.0
spark.history.store.maxDiskUsage 10g 儲存快取應用程式記錄資訊的本機目錄的最大磁碟使用量。 2.3.0
spark.history.store.path (無) 用於快取應用程式歷程資料的本機目錄。如果已設定,歷程伺服器會將應用程式資料儲存在磁碟上,而不是將其保留在記憶體中。寫入磁碟的資料會在歷程伺服器重新啟動時重新使用。 2.3.0
spark.history.store.serializer JSON 用於將記憶體中的 UI 物件寫入/讀取至/從基於磁碟的 KV 儲存的序列化器;JSON 或 PROTOBUF。JSON 序列化器是 Spark 3.4.0 之前的唯一選擇,因此它是預設值。與 JSON 序列化器相比,PROTOBUF 序列化器快速且緊湊。 3.4.0
spark.history.custom.executor.log.url (無) 指定自訂 Spark 執行器記錄 URL,以支援外部記錄服務,而不是在歷程伺服器中使用叢集管理員的應用程式記錄 URL。Spark 會透過模式支援一些路徑變數,這些模式可能因叢集管理員而異。請查看叢集管理員的文件,以查看支援哪些模式(如果有)。此組態對執行中的應用程式沒有影響,它只會影響歷程伺服器。

目前,只有 YARN 模式支援此組態

3.0.0
spark.history.custom.executor.log.url.applyIncompleteApplication true 指定是否也要將自訂 Spark 執行器記錄 URL 套用至未完成的應用程式。如果應將執行中應用程式的執行器記錄提供為原始記錄 URL,請將此設定為 `false`。請注意,未完成的應用程式可能包括未正常關閉的應用程式。即使將此設定為 `true`,此組態對執行中的應用程式也沒有影響,它只會影響歷程伺服器。 3.0.0
spark.history.fs.eventLog.rolling.maxFilesToRetain Int.MaxValue 將保留為未壓縮的最大事件記錄檔數目。預設情況下,將保留所有事件記錄檔。由於技術原因,最低值為 1。
請閱讀「套用舊事件記錄檔的壓縮」部分以取得更多詳細資訊。
3.0.0
spark.history.store.hybridStore.enabled false 在剖析事件記錄時,是否將 HybridStore 用作儲存。HybridStore 會先將資料寫入記憶體中儲存,並有一個背景執行緒在寫入至記憶體中儲存完成後將資料傾印至磁碟儲存。 3.1.0
spark.history.store.hybridStore.maxMemoryUsage 2g 可使用於建立 HybridStore 的最大記憶體空間。HybridStore 與堆疊記憶體共同使用,因此如果啟用 HybridStore,應透過 SHS 的記憶體選項增加堆疊記憶體。 3.1.0
spark.history.store.hybridStore.diskBackend ROCKSDB 指定用於混合儲存的磁碟儲存;LEVELDB 或 ROCKSDB。 3.3.0
spark.history.fs.update.batchSize Int.MaxValue 指定更新新事件記錄檔的批次大小。這會控制每個掃描程序在合理時間內完成,並防止初始掃描執行時間過長,且在大型環境中阻擋新的事件記錄檔及時掃描。 3.4.0

請注意,在所有這些 UI 中,表格都可以按其標頭進行排序,這使得識別慢速任務、資料傾斜等變得容易。

注意

  1. 歷史伺服器顯示已完成和未完成的 Spark 工作。如果應用程式在失敗後進行多次嘗試,將顯示失敗的嘗試,以及任何正在進行的未完成嘗試或最後成功的嘗試。

  2. 未完成的應用程式只會間歇性地更新。更新之間的時間由檢查已變更檔案的間隔定義 (spark.history.fs.update.interval)。在較大的叢集中,更新間隔可能會設定為較大的值。檢視正在執行的應用程式的實際方法是檢視其自己的網路 UI。

  3. 未註冊為已完成即退出的應用程式將列為未完成,即使它們不再執行。如果應用程式發生故障,可能會發生這種情況。

  4. 表示 Spark 工作已完成的一種方法是明確停止 Spark Context (sc.stop()),或在 Python 中使用 with SparkContext() as sc: 建構來處理 Spark Context 設定和終止。

REST API

除了在 UI 中檢視指標外,也可以 JSON 格式取得這些指標。這讓開發人員可以輕鬆地為 Spark 建立新的視覺化和監控工具。JSON 可用於正在執行的應用程式和歷史伺服器。端點掛載在 /api/v1。例如,對於歷史伺服器,它們通常可以在 http://<server-url>:18080/api/v1 存取,而對於正在執行的應用程式,則可以在 https://127.0.0.1:4040/api/v1 存取。

在 API 中,應用程式由其應用程式 ID 參照,[app-id]。在 YARN 上執行時,每個應用程式可能有多次嘗試,但僅有叢集模式中的應用程式有嘗試 ID,而沒有用戶端模式中的應用程式。YARN 叢集模式中的應用程式可以用其 [attempt-id] 識別。在以下列出的 API 中,在 YARN 叢集模式中執行時,[app-id] 實際上會是 [base-app-id]/[attempt-id],其中 [base-app-id] 是 YARN 應用程式 ID。

端點意義
/applications 所有應用程式的清單。
?status=[completed|running] 僅列出處於所選狀態的應用程式。
?minDate=[date] 最早開始日期/時間以供列出。
?maxDate=[date] 最晚開始日期/時間以供列出。
?minEndDate=[date] 最早結束日期/時間以供列出。
?maxEndDate=[date] 最晚結束日期/時間以供列出。
?limit=[limit] 限制所列出的應用程式數量。
範例
?minDate=2015-02-10
?minDate=2015-02-03T16:42:40.000GMT
?maxDate=2015-02-11T20:41:30.000GMT
?minEndDate=2015-02-12
?minEndDate=2015-02-12T09:15:10.000GMT
?maxEndDate=2015-02-14T16:30:45.000GMT
?limit=10
/applications/[app-id]/jobs 給定應用程式的所有作業清單。
?status=[running|succeeded|failed|unknown] 僅列出處於特定狀態的作業。
/applications/[app-id]/jobs/[job-id] 給定作業的詳細資料。
/applications/[app-id]/stages 給定應用程式的所有階段清單。
?status=[active|complete|pending|failed] 僅列出處於給定狀態的階段。
?details=true 列出所有包含任務資料的階段。
?taskStatus=[RUNNING|SUCCESS|FAILED|KILLED|PENDING] 僅列出具有指定任務狀態的那些任務。查詢參數 taskStatus 僅在 details=true 時才會生效。這也支援多個 taskStatus,例如 ?details=true&taskStatus=SUCCESS&taskStatus=FAILED,這將傳回所有符合任何指定任務狀態的任務。
?withSummaries=true 列出具有任務指標分佈和執行器指標分佈的階段。
?quantiles=0.0,0.25,0.5,0.75,1.0 使用給定的分位數來總結指標。查詢參數 quantiles 僅在 withSummaries=true 時才會生效。預設值為 0.0,0.25,0.5,0.75,1.0
/applications/[app-id]/stages/[stage-id] 給定階段的所有嘗試清單。
?details=true 列出給定階段的所有嘗試以及任務資料。
?taskStatus=[RUNNING|SUCCESS|FAILED|KILLED|PENDING] 僅列出具有指定任務狀態的那些任務。查詢參數 taskStatus 僅在 details=true 時才會生效。這也支援多個 taskStatus,例如 ?details=true&taskStatus=SUCCESS&taskStatus=FAILED,這將傳回所有符合任何指定任務狀態的任務。
?withSummaries=true 列出每個嘗試的任務指標分佈和執行器指標分佈。
?quantiles=0.0,0.25,0.5,0.75,1.0 使用給定的分位數來總結指標。查詢參數 quantiles 僅在 withSummaries=true 時才會生效。預設值為 0.0,0.25,0.5,0.75,1.0
範例
?details=true
?details=true&taskStatus=RUNNING
?withSummaries=true
?details=true&withSummaries=true&quantiles=0.01,0.5,0.99
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id] 給定階段嘗試的詳細資料。
?details=true 列出給定階段嘗試的所有任務資料。
?taskStatus=[RUNNING|SUCCESS|FAILED|KILLED|PENDING] 僅列出具有指定任務狀態的那些任務。查詢參數 taskStatus 僅在 details=true 時才會生效。這也支援多個 taskStatus,例如 ?details=true&taskStatus=SUCCESS&taskStatus=FAILED,這將傳回所有符合任何指定任務狀態的任務。
?withSummaries=true 列出給定階段嘗試的任務指標分佈和執行器指標分佈。
?quantiles=0.0,0.25,0.5,0.75,1.0 使用給定的分位數來總結指標。查詢參數 quantiles 僅在 withSummaries=true 時才會生效。預設值為 0.0,0.25,0.5,0.75,1.0
範例
?details=true
?details=true&taskStatus=RUNNING
?withSummaries=true
?details=true&withSummaries=true&quantiles=0.01,0.5,0.99
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskSummary 給定階段嘗試中所有任務的摘要指標。
?quantiles 使用給定的分位數總結指標。
範例:?quantiles=0.01,0.5,0.99
/applications/[app-id]/stages/[stage-id]/[stage-attempt-id]/taskList 給定階段嘗試中所有任務的清單。
?offset=[offset]&length=[len] 列出給定範圍內的任務。
?sortBy=[runtime|-runtime] 排序任務。
?status=[running|success|killed|failed|unknown] 僅列出狀態中的任務。
範例:?offset=10&length=50&sortBy=runtime&status=running
/applications/[app-id]/executors 給定應用程式中所有活動執行器的清單。
/applications/[app-id]/executors/[executor-id]/threads 在給定的活動執行器中執行之所有執行緒的堆疊追蹤。無法透過歷史記錄伺服器取得。
/applications/[app-id]/allexecutors 給定應用程式中所有(活動和已終止)執行器的清單。
/applications/[app-id]/storage/rdd 給定應用程式中儲存的 RDD 清單。
/applications/[app-id]/storage/rdd/[rdd-id] 給定 RDD 的儲存狀態詳細資料。
/applications/[base-app-id]/logs 下載給定應用程式中所有嘗試的事件記錄,作為 zip 檔案中的檔案。
/applications/[base-app-id]/[attempt-id]/logs 下載特定應用程式嘗試的事件記錄,作為 zip 檔案。
/applications/[app-id]/streaming/statistics 串流內容的統計資料。
/applications/[app-id]/streaming/receivers 所有串流接收器的清單。
/applications/[app-id]/streaming/receivers/[stream-id] 給定接收器的詳細資料。
/applications/[app-id]/streaming/batches 所有保留批次的清單。
/applications/[app-id]/streaming/batches/[batch-id] 給定批次的詳細資料。
/applications/[app-id]/streaming/batches/[batch-id]/operations 給定批次的所有輸出操作清單。
/applications/[app-id]/streaming/batches/[batch-id]/operations/[outputOp-id] 給定操作和給定批次的詳細資料。
/applications/[app-id]/sql 給定應用程式中所有查詢的清單。
?details=[true (預設) | false] 列出/隱藏 Spark 計畫節點的詳細資料。
?planDescription=[true (預設) | false] 在實體計畫大小較大的情況下,依需求啟用/停用實體 planDescription
?offset=[offset]&length=[len] 列出指定範圍內的查詢。
/applications/[app-id]/sql/[execution-id] 指定查詢的詳細資料。
?details=[true (預設) | false] 除了指定的查詢詳細資料外,還會列出/隱藏指標詳細資料。
?planDescription=[true (預設) | false] 在實體計畫大小較大的情況下,依需求啟用/停用指定查詢的實體 planDescription
/applications/[app-id]/environment 指定應用程式的環境詳細資料。
/version 取得目前的 Spark 版本。

可擷取的作業和階段數量受到獨立 Spark UI 的相同保留機制限制;"spark.ui.retainedJobs" 定義觸發作業垃圾收集的臨界值,而 spark.ui.retainedStages 定義觸發階段垃圾收集的臨界值。請注意,垃圾收集會在播放時進行:透過增加這些值並重新啟動歷史伺服器,可以擷取更多項目。

執行器工作量指標

REST API 公開 Spark 執行器收集的任務指標值,其詳細程度與任務執行相同。這些指標可供效能疑難排解和工作負載特性分析使用。以下是可用指標清單,並附上簡短說明

Spark 執行器任務指標名稱 簡短說明
executorRunTime 執行器執行此任務所花的經過時間。這包括擷取洗牌資料的時間。此值以毫秒為單位表示。
executorCpuTime 執行器執行此任務所花的 CPU 時間。這包括擷取洗牌資料的時間。此值以奈秒為單位表示。
executorDeserializeTime 花費在解除序列化此任務的時間。此值以毫秒為單位表示。
executorDeserializeCpuTime 執行器解除序列化此任務所花的 CPU 時間。此值以奈秒為單位表示。
resultSize 此任務傳回驅動程式作為 TaskResult 的位元組數。
jvmGCTime 執行此任務時,JVM 花費在垃圾收集的時間。此值以毫秒為單位表示。
resultSerializationTime 花費在序列化任務結果的時間。此值以毫秒為單位表示。
memoryBytesSpilled 此任務溢出的記憶體位元組數。
diskBytesSpilled 此任務溢出的磁碟位元組數。
peakExecutionMemory 在洗牌、聚合和聯結期間建立的內部資料結構所使用的記憶體峰值。此累加器的值應近似於此任務中建立的所有此類資料結構的峰值大小總和。對於 SQL 作業,這只會追蹤所有不安全的運算子及 ExternalSort。
inputMetrics.* 與從 org.apache.spark.rdd.HadoopRDD 或從持續性資料中讀取資料相關的指標。
    .bytesRead 已讀取的位元組總數。
    .recordsRead 已讀取的記錄總數。
outputMetrics.* 與外部寫入資料相關的指標(例如,分散式檔案系統),僅定義在有輸出的工作中。
    .bytesWritten 已寫入的位元組總數
    .recordsWritten 已寫入的記錄總數
shuffleReadMetrics.* 與混排讀取作業相關的指標。
    .recordsRead 在混排作業中讀取的記錄數
    .remoteBlocksFetched 在混排作業中擷取的遠端區塊數
    .localBlocksFetched 在混排作業中擷取的本機區塊數(與從遠端執行器讀取相反)
    .totalBlocksFetched 在混排作業中擷取的區塊數(本機和遠端)
    .remoteBytesRead 在混排作業中讀取的遠端位元組數
    .localBytesRead 從本機磁碟在混排作業中讀取的位元組數(與從遠端執行器讀取相反)
    .totalBytesRead 在混排作業中讀取的位元組數(本機和遠端)
    .remoteBytesReadToDisk 在混排作業中讀取到磁碟的遠端位元組數。大型區塊會在混排讀取作業中擷取到磁碟,而不是讀取到記憶體中,這是預設行為。
    .fetchWaitTime 工作等待遠端混排區塊的時間。這僅包含混排輸入資料的封鎖時間。例如,如果在工作尚未完成處理區塊 A 時擷取區塊 B,則不會視為封鎖在區塊 B 上。此值以毫秒為單位表示。
shuffleWriteMetrics.* 與寫入混排資料的作業相關的指標。
    .bytesWritten 在混排作業中寫入的位元組數
    .recordsWritten 在混排作業中寫入的記錄數
    .writeTime 封鎖在寫入磁碟或緩衝快取的時間。此值以奈秒為單位表示。

執行器指標

執行器層級指標會從每個執行器傳送至驅動程式,作為心跳的一部份,用來描述執行器本身的效能指標,例如 JVM 堆疊記憶體、GC 資訊。執行器指標值及其所測量的每個執行器記憶體峰值會透過 REST API 以 JSON 格式和 Prometheus 格式公開。JSON 端點公開於:/applications/[app-id]/executors,而 Prometheus 端點公開於:/metrics/executors/prometheus。Prometheus 端點有條件取決於設定參數:spark.ui.prometheus.enabled=true(預設為 false)。此外,如果 spark.eventLog.logStageExecutorMetrics 為 true,執行器記憶體指標的每個階段彙總峰值會寫入事件記錄檔。執行器記憶體指標也會透過 Spark 指標系統公開,該系統基於 Dropwizard 指標函式庫。下列是可用指標的清單,並附有簡短說明

執行器層級指標名稱 簡短說明
rddBlocks 此執行器區塊管理員中的 RDD 區塊。
memoryUsed 此執行器使用的儲存記憶體。
diskUsed 此執行器用於 RDD 儲存的磁碟空間。
totalCores 此執行器中可用的核心數。
maxTasks 此執行器中可同時執行任務的最大數目。
activeTasks 目前正在執行的任務數目。
failedTasks 在此執行器中失敗的任務數目。
completedTasks 在此執行器中已完成的任務數目。
totalTasks 此執行器中的總任務數目(正在執行、失敗和已完成)。
totalDuration JVM 花費在執行此執行器中的任務的經過時間。此值以毫秒表示。
totalGCTime JVM 花費在垃圾收集的經過時間,在此執行器中加總。此值以毫秒表示。
totalInputBytes 在此執行器中加總的總輸入位元組。
totalShuffleRead 在此執行器中加總的總 Shuffle 讀取位元組。
totalShuffleWrite 在此執行器中加總的總 Shuffle 寫入位元組。
maxMemory 可供儲存的總記憶體量(以位元組為單位)。
memoryMetrics.* 記憶體指標的目前值
    .usedOnHeapStorageMemory 目前用於堆疊記憶體儲存的已使用量(以位元組為單位)。
    .usedOffHeapStorageMemory 目前用於儲存的已用非堆記憶體,以位元組為單位。
    .totalOnHeapStorageMemory 可用於儲存的總堆上記憶體,以位元組為單位。此數量會隨著時間而有所不同,具體取決於 MemoryManager 實作。
    .totalOffHeapStorageMemory 可用於儲存的總非堆記憶體,以位元組為單位。此數量會隨著時間而有所不同,具體取決於 MemoryManager 實作。
peakMemoryMetrics.* 記憶體(和 GC)指標的峰值
    .JVMHeapMemory 用於物件配置的堆的峰值記憶體使用量。堆包含一個或多個記憶體池。已用和已提交的已回傳記憶體使用量的大小是所有堆記憶體池中這些值的總和,而已回傳記憶體使用量的初始化和最大大小表示堆記憶體的設定,可能不是所有堆記憶體池中這些值的總和。已回傳記憶體使用量中的已用記憶體數量是同時由現存物件和尚未收集的垃圾物件佔用的記憶體數量(如果有的話)。
    .JVMOffHeapMemory Java 虛擬機器使用的非堆記憶體的峰值記憶體使用量。非堆記憶體包含一個或多個記憶體池。已用和已提交的已回傳記憶體使用量的總和是所有非堆記憶體池中這些值的總和,而已回傳記憶體使用量的初始化和最大大小表示非堆記憶體的設定,可能不是所有非堆記憶體池中這些值的總和。
    .OnHeapExecutionMemory 正在使用的堆上執行記憶體的峰值,以位元組為單位。
    .OffHeapExecutionMemory 正在使用的非堆執行記憶體的峰值,以位元組為單位。
    .OnHeapStorageMemory 正在使用的堆上儲存記憶體的峰值,以位元組為單位。
    .OffHeapStorageMemory 正在使用的非堆儲存記憶體的峰值,以位元組為單位。
    .OnHeapUnifiedMemory 堆上記憶體(執行和儲存)的峰值。
    .OffHeapUnifiedMemory 非堆記憶體(執行和儲存)的峰值。
    .DirectPoolMemory JVM 用於直接緩衝池(java.lang.management.BufferPoolMXBean)的峰值記憶體
    .MappedPoolMemory JVM 用於映射緩衝池(java.lang.management.BufferPoolMXBean)的峰值記憶體
    .ProcessTreeJVMVMemory 虛擬記憶體大小,以位元組為單位。如果 spark.executor.processTreeMetrics.enabled 為 true,則啟用。
    .ProcessTreeJVMRSSMemory 常駐集大小:程序在實體記憶體中的頁面數。這只是計入文字、資料或堆疊空間的頁面。這不包括尚未依需求載入或已換出的頁面。如果 spark.executor.processTreeMetrics.enabled 為 true,則啟用。
    .ProcessTreePythonVMemory Python 的虛擬記憶體大小(以位元組為單位)。如果 spark.executor.processTreeMetrics.enabled 為 true,則會啟用。
    .ProcessTreePythonRSSMemory Python 的駐留集大小。如果 spark.executor.processTreeMetrics.enabled 為 true,則會啟用。
    .ProcessTreeOtherVMemory 其他類型程序的虛擬記憶體大小(以位元組為單位)。如果 spark.executor.processTreeMetrics.enabled 為 true,則會啟用。
    .ProcessTreeOtherRSSMemory 其他類型程序的駐留集大小。如果 spark.executor.processTreeMetrics.enabled 為 true,則會啟用。
    .MinorGCCount 總共的次要 GC 次數。例如,垃圾回收器之一為 Copy、PS Scavenge、ParNew、G1 Young Generation 等。
    .MinorGCTime 經過的總次要 GC 時間。此值以毫秒為單位表示。
    .MajorGCCount 總共的主要 GC 次數。例如,垃圾回收器之一為 MarkSweepCompact、PS MarkSweep、ConcurrentMarkSweep、G1 Old Generation 等。
    .MajorGCTime 經過的總主要 GC 時間。此值以毫秒為單位表示。

RSS 和 Vmem 的計算基於 proc(5)

API 版本政策

這些端點已經過嚴格版本化,以簡化其上開發應用程式的難度。特別是,Spark 保證

請注意,即使在檢查正在執行的應用程式的 UI 時,applications/[app-id] 部分仍然是必要的,儘管只有一個可用的應用程式。例如,若要查看正在執行的應用程式的作業清單,您必須前往 https://127.0.0.1:4040/api/v1/applications/[app-id]/jobs。這是為了在兩種模式下保持路徑的一致性。

指標

Spark 有一個可設定的度量系統,基於 Dropwizard 度量庫。這允許使用者將 Spark 度量報告給各種接收器,包括 HTTP、JMX 和 CSV 檔案。度量由嵌入在 Spark 程式碼庫中的來源產生。它們提供特定活動和 Spark 組件的儀器。度量系統透過設定檔進行設定,Spark 預期會存在於 $SPARK_HOME/conf/metrics.properties。可以透過 spark.metrics.conf 設定屬性 指定自訂檔案位置。除了使用設定檔之外,也可以使用一組前綴為 spark.metrics.conf. 的設定參數。預設情況下,用於驅動程式或執行器度量的根名稱空間是 spark.app.id 的值。然而,使用者通常希望能夠追蹤驅動程式和執行器的跨應用程式度量,這很難使用應用程式 ID(例如 spark.app.id)來執行,因為它會隨著每次呼叫應用程式而變更。對於此類使用案例,可以使用 spark.metrics.namespace 設定屬性為度量報告指定自訂名稱空間。如果,例如,使用者想要將度量名稱空間設定為應用程式的名稱,他們可以將 spark.metrics.namespace 屬性設定為類似 ${spark.app.name} 的值。然後,Spark 會適當地擴充這個值,並將其用作度量系統的根名稱空間。非驅動程式和執行器度量永遠不會加上 spark.app.id 前綴,而 spark.metrics.namespace 屬性也不會對此類度量有任何影響。

Spark 的度量會解耦成不同的執行個體,對應到 Spark 組件。在每個執行個體中,你可以設定一組接收器,用於報告度量。目前支援下列執行個體

每個執行個體可以報告給零個或多個 接收器。接收器包含在 org.apache.spark.metrics.sink 套件中

Spark 也支援 Ganglia 接收器,但由於授權限制,未包含在預設建置中

若要安裝 GangliaSink,您需要執行 Spark 的自訂建置。請注意,透過內嵌此函式庫,您將在 Spark 套件中包含 LGPL 授權的程式碼。對於 sbt 使用者,請在建置前設定 SPARK_GANGLIA_LGPL 環境變數。對於 Maven 使用者,請啟用 -Pspark-ganglia-lgpl 設定檔。除了修改叢集的 Spark 建置外,使用者應用程式還需要連結到 spark-ganglia-lgpl 人工製品。

度量組態檔案的語法和每個接收器可用的參數定義在範例組態檔案 $SPARK_HOME/conf/metrics.properties.template 中。

當使用 Spark 組態參數而非指標組態檔案時,相關參數名稱由前綴 spark.metrics.conf. 組成,後接組態詳細資料,亦即參數採用下列格式:spark.metrics.conf.[instance|*].sink.[sink_name].[parameter_name]。此範例顯示 Graphite 接收器的一系列 Spark 組態參數

"spark.metrics.conf.*.sink.graphite.class"="org.apache.spark.metrics.sink.GraphiteSink"
"spark.metrics.conf.*.sink.graphite.host"="graphiteEndPoint_hostName>"
"spark.metrics.conf.*.sink.graphite.port"=<graphite_listening_port>
"spark.metrics.conf.*.sink.graphite.period"=10
"spark.metrics.conf.*.sink.graphite.unit"=seconds
"spark.metrics.conf.*.sink.graphite.prefix"="optional_prefix"
"spark.metrics.conf.*.sink.graphite.regex"="optional_regex_to_send_matching_metrics"

Spark 指標組態的預設值如下

"*.sink.servlet.class" = "org.apache.spark.metrics.sink.MetricsServlet"
"*.sink.servlet.path" = "/metrics/json"
"master.sink.servlet.path" = "/metrics/master/json"
"applications.sink.servlet.path" = "/metrics/applications/json"

可使用指標組態檔案或組態參數 spark.metrics.conf.[component_name].source.jvm.class=[source_name] 組態其他來源。目前 JVM 來源是唯一可用的選用來源。例如,下列組態參數會啟用 JVM 來源:"spark.metrics.conf.*.source.jvm.class"="org.apache.spark.metrics.source.JvmSource"

可用指標提供者清單

Spark 使用的指標有多種類型:量規、計數器、直方圖、儀表和計時器,請參閱 Dropwizard 函式庫文件以取得詳細資料。下列元件和指標清單會報告名稱和一些關於可用指標的詳細資料,並依元件執行個體和來源命名空間分組。Spark 儀器中最常使用的指標時間為量規和計數器。計數器可透過 .count 字尾辨識。直方圖、儀表和計時器會在清單中註解,清單中的其他元素都是量規類型指標。絕大多數指標會在父元件執行個體組態後立即啟用,有些指標還需要透過其他組態參數啟用,詳細資料會在清單中報告。

元件執行個體 = 驅動程式

這是具備最多儀器化指標的元件

元件執行個體 = 執行器

這些指標由 Spark 執行器公開。

來源 = JVM 來源

注意事項

元件執行個體 = applicationMaster

注意:適用於在 YARN 上執行

元件執行個體 = mesos_cluster

注意:適用於在 mesos 上執行

元件執行個體 = master

注意:適用於在 Spark 獨立執行時作為主控程式執行

元件執行個體 = ApplicationSource

注意:適用於在 Spark 獨立執行時作為主控程式執行

元件執行個體 = worker

注意:適用於在 Spark 獨立執行時作為工作執行

元件執行個體 = shuffleService

注意:適用於混排服務

進階儀器

可以使用多種外部工具來協助分析 Spark 工作的效能

Spark 也提供一個外掛程式 API,以便可以將自訂儀器編碼加入 Spark 應用程式。有兩個設定檔金鑰可供載入外掛程式至 Spark

這兩個金鑰都會採用以逗號分隔的類別名稱清單,這些類別名稱會實作 org.apache.spark.api.plugin.SparkPlugin 介面。這兩個名稱的存在,是為了讓其中一個清單可以放置在 Spark 預設設定檔中,讓使用者可以輕鬆從命令列加入其他外掛程式,而不會覆寫設定檔的清單。重複的外掛程式會被忽略。