監控和儀器
有數種方式可以監控 Spark 應用程式:網路 UI、指標和外部儀器。
網頁介面
每個 SparkContext 都會啟動一個 網路 UI,預設在埠 4040 上,顯示有關應用程式的有用資訊。其中包括
- 排程器階段和任務清單
- RDD 大小和記憶體用量摘要
- 環境資訊。
- 關於正在執行的執行器的資訊
您只要在網路瀏覽器中開啟 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.enabled
和 spark.eventLog.rolling.maxFileSize
可以讓您擁有滾動事件記錄檔,而不是單一龐大的事件記錄檔,這可能會在某些情況下有所幫助,但它仍然無法幫助您減少記錄的整體大小。
Spark 歷史伺服器可以對滾動事件記錄檔套用壓縮,以減少記錄的整體大小,方法是在 Spark 歷史伺服器上設定組態 spark.history.fs.eventLog.rolling.maxFilesToRetain
。
詳細資訊將在下方說明,但請注意壓縮是一個有損失的作業。壓縮會捨棄一些事件,這些事件將不再顯示在使用者介面上 - 您可能需要在啟用選項之前檢查哪些事件將會被捨棄。
當壓縮發生時,歷史伺服器會列出應用程式的所有可用事件記錄檔,並將索引小於將保留的最小索引檔的事件記錄檔視為壓縮目標。例如,如果應用程式 A 有 5 個事件記錄檔,而 spark.history.fs.eventLog.rolling.maxFilesToRetain
設定為 2,則前 3 個記錄檔將被選為壓縮目標。
一旦選定目標,它就會分析它們以找出哪些事件可以排除,並將它們重新寫入一個壓縮檔,同時捨棄決定排除的事件。
壓縮會嘗試排除指向過時資料的事件。目前,以下說明要排除的事件候選
- 已完成的作業事件,以及相關的階段/工作事件
- 已終止的執行器事件
- 已完成的 SQL 執行事件,以及相關的作業/階段/工作事件
一旦重寫完成,原始日誌檔案將會透過盡力而為的方式刪除。歷史伺服器可能無法刪除原始日誌檔案,但這不會影響歷史伺服器的運作。
請注意,如果發現壓縮期間不會減少太多空間,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 中,表格都可以按其標頭進行排序,這使得識別慢速任務、資料傾斜等變得容易。
注意
-
歷史伺服器顯示已完成和未完成的 Spark 工作。如果應用程式在失敗後進行多次嘗試,將顯示失敗的嘗試,以及任何正在進行的未完成嘗試或最後成功的嘗試。
-
未完成的應用程式只會間歇性地更新。更新之間的時間由檢查已變更檔案的間隔定義 (
spark.history.fs.update.interval
)。在較大的叢集中,更新間隔可能會設定為較大的值。檢視正在執行的應用程式的實際方法是檢視其自己的網路 UI。 -
未註冊為已完成即退出的應用程式將列為未完成,即使它們不再執行。如果應用程式發生故障,可能會發生這種情況。
-
表示 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 保證
- 端點絕不會從一個版本中移除
- 個別欄位絕不會從任何給定的端點中移除
- 可能會新增新的端點
- 可能會新增新的欄位到現有的端點
- 將來可能會新增新版本的 API 作為一個獨立的端點(例如,
api/v2
)。新版本不需要向後相容。 - 可能會移除 API 版本,但僅限於與新 API 版本共存至少一個次要版本之後。
請注意,即使在檢查正在執行的應用程式的 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 組件。在每個執行個體中,你可以設定一組接收器,用於報告度量。目前支援下列執行個體
master
:Spark 獨立主控端程序。applications
:主控端中的組件,用於報告各種應用程式。worker
:Spark 獨立工作程序。executor
:Spark 執行器。driver
:Spark 驅動程式程序(建立 SparkContext 的程序)。shuffleService
:Spark 洗牌服務。applicationMaster
:在 YARN 上執行時的 Spark 應用程式主控端。mesos_cluster
:在 Mesos 上執行時,Spark 集群排程器。
每個執行個體可以報告給零個或多個 接收器。接收器包含在 org.apache.spark.metrics.sink
套件中
ConsoleSink
:將度量資訊記錄到主控台。CSVSink
:定期將度量資料匯出到 CSV 檔案。JmxSink
:註冊度量以在 JMX 主控台中檢視。MetricsServlet
:在現有的 Spark UI 中新增一個 servlet,以 JSON 資料形式提供度量資料。PrometheusServlet
:在現有的 Spark UI 中新增一個 servlet,以 Prometheus 格式提供度量資料(實驗性質)。GraphiteSink
:將度量傳送至 Graphite 節點。Slf4jSink
:將度量以記錄條目的形式傳送至 slf4j。StatsdSink
:將度量傳送至 StatsD 節點。
Spark 也支援 Ganglia 接收器,但由於授權限制,未包含在預設建置中
GangliaSink
:將度量傳送至 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
字尾辨識。直方圖、儀表和計時器會在清單中註解,清單中的其他元素都是量規類型指標。絕大多數指標會在父元件執行個體組態後立即啟用,有些指標還需要透過其他組態參數啟用,詳細資料會在清單中報告。
元件執行個體 = 驅動程式
這是具備最多儀器化指標的元件
- 命名空間=BlockManager
- disk.diskSpaceUsed_MB
- memory.maxMem_MB
- memory.maxOffHeapMem_MB
- memory.maxOnHeapMem_MB
- memory.memUsed_MB
- memory.offHeapMemUsed_MB
- memory.onHeapMemUsed_MB
- memory.remainingMem_MB
- memory.remainingOffHeapMem_MB
- memory.remainingOnHeapMem_MB
- 命名空間=HiveExternalCatalog
- 注意:這些指標有條件限制於組態參數:
spark.metrics.staticSources.enabled
(預設為 true) - fileCacheHits.count
- filesDiscovered.count
- hiveClientCalls.count
- parallelListingJobCount.count
- partitionsFetched.count
- 注意:這些指標有條件限制於組態參數:
- namespace=CodeGenerator
- 注意:這些指標有條件限制於組態參數:
spark.metrics.staticSources.enabled
(預設為 true) - 編譯時間 (直方圖)
- 已產生類別大小 (直方圖)
- 已產生方法大小 (直方圖)
- 原始碼大小 (直方圖)
- 注意:這些指標有條件限制於組態參數:
- namespace=DAGScheduler
- job.activeJobs
- job.allJobs
- 訊息處理時間 (計時器)
- stage.failedStages
- stage.runningStages
- stage.waitingStages
- namespace=LiveListenerBus
- listenerProcessingTime.org.apache.spark.HeartbeatReceiver (計時器)
- listenerProcessingTime.org.apache.spark.scheduler.EventLoggingListener (計時器)
- listenerProcessingTime.org.apache.spark.status.AppStatusListener (計時器)
- numEventsPosted.count
- queue.appStatus.listenerProcessingTime (計時器)
- queue.appStatus.numDroppedEvents.count
- queue.appStatus.size
- queue.eventLog.listenerProcessingTime (計時器)
- queue.eventLog.numDroppedEvents.count
- queue.eventLog.size
- queue.executorManagement.listenerProcessingTime (計時器)
- namespace=appStatus (所有類型為計數器的指標)
- 注意:在 Spark 3.0 中引入。有條件的組態參數:
spark.metrics.appStatusSource.enabled
(預設為 false) - stages.failedStages.count
- stages.skippedStages.count
- stages.completedStages.count
- tasks.blackListedExecutors.count // 已過時,請改用 excludedExecutors
- tasks.excludedExecutors.count
- tasks.completedTasks.count
- tasks.failedTasks.count
- tasks.killedTasks.count
- tasks.skippedTasks.count
- tasks.unblackListedExecutors.count // 已過時,請改用 unexcludedExecutors
- tasks.unexcludedExecutors.count
- jobs.succeededJobs
- jobs.failedJobs
- jobDuration
- 注意:在 Spark 3.0 中引入。有條件的組態參數:
- namespace=AccumulatorSource
- 注意:使用者可組態的來源,用於將累加器附加到指標系統
- DoubleAccumulatorSource
- LongAccumulatorSource
- namespace=spark.streaming
- 注意:這只適用於 Spark 結構化串流。有條件的組態參數:
spark.sql.streaming.metricsEnabled=true
(預設為 false) - eventTime-watermark
- inputRate-total
- latency
- processingRate-total
- states-rowsTotal
- states-usedBytes
- 注意:這只適用於 Spark 結構化串流。有條件的組態參數:
- namespace=JVMCPU
- jvmCpuTime
- namespace=executor
- 注意:這些指標僅在本地模式的驅動程式中可用。
- 可以在執行器組件實例對應的條目中找到此命名空間中所有可用指標的完整清單。
- namespace=ExecutorMetrics
- 注意:這些指標有條件的組態參數:
spark.metrics.executorMetricsSource.enabled
(預設為 true) - 此來源包含與記憶體相關的指標。可以在執行器組件實例對應的條目中找到此命名空間中所有可用指標的完整清單。
- 注意:這些指標有條件的組態參數:
- 命名空間=ExecutorAllocationManager
- 注意:僅在使用動態分配時才會發出這些指標。有條件的設定參數
spark.dynamicAllocation.enabled
(預設為 false) - executors.numberExecutorsToAdd
- executors.numberExecutorsPendingToRemove
- executors.numberAllExecutors
- executors.numberTargetExecutors
- executors.numberMaxNeededExecutors
- executors.numberDecommissioningExecutors
- executors.numberExecutorsGracefullyDecommissioned.count
- executors.numberExecutorsDecommissionUnfinished.count
- executors.numberExecutorsExitedUnexpectedly.count
- executors.numberExecutorsKilledByDriver.count
- 注意:僅在使用動態分配時才會發出這些指標。有條件的設定參數
- 命名空間=plugin.<外掛程式類別名稱>
- 選擇性命名空間。此命名空間中的指標由使用者提供的程式碼定義,並使用 Spark 外掛程式 API 設定。請參閱下方的「進階儀器」了解如何將自訂外掛程式載入 Spark。
元件執行個體 = 執行器
這些指標由 Spark 執行器公開。
- 命名空間=executor(指標類型為計數器或量規)
- 備註
spark.executor.metrics.fileSystemSchemes
(預設:file,hdfs
)決定公開的檔案系統指標。
- bytesRead.count
- bytesWritten.count
- cpuTime.count
- deserializeCpuTime.count
- deserializeTime.count
- diskBytesSpilled.count
- filesystem.file.largeRead_ops
- filesystem.file.read_bytes
- filesystem.file.read_ops
- filesystem.file.write_bytes
- filesystem.file.write_ops
- filesystem.hdfs.largeRead_ops
- filesystem.hdfs.read_bytes
- filesystem.hdfs.read_ops
- filesystem.hdfs.write_bytes
- filesystem.hdfs.write_ops
- jvmGCTime.count
- memoryBytesSpilled.count
- recordsRead.count
- recordsWritten.count
- resultSerializationTime.count
- resultSize.count
- runTime.count
- shuffleBytesWritten.count
- shuffleFetchWaitTime.count
- shuffleLocalBlocksFetched.count
- shuffleLocalBytesRead.count
- shuffleRecordsRead.count
- shuffleRecordsWritten.count
- shuffleRemoteBlocksFetched.count
- shuffleRemoteBytesRead.count
- shuffleRemoteBytesReadToDisk.count
- shuffleTotalBytesRead.count
- shuffleWriteTime.count
- succeededTasks.count
- threadpool.activeTasks
- threadpool.completeTasks
- threadpool.currentPool_size
- threadpool.maxPool_size
- threadpool.startedTasks
- 備註
- namespace=ExecutorMetrics
- 備註
- 這些指標有條件的設定參數:
spark.metrics.executorMetricsSource.enabled
(預設值為 true) - ExecutorMetrics 會在定期排程執行器和驅動程式的心跳處理程序中更新,如下所示:
spark.executor.heartbeatInterval
(預設值為 10 秒) - 執行器記憶體指標提供一個可選的較快輪詢機制,可以使用設定檔參數
spark.executor.metrics.pollingInterval
設定輪詢間隔(以毫秒為單位)來啟用
- 這些指標有條件的設定參數:
- JVMHeapMemory
- JVMOffHeapMemory
- OnHeapExecutionMemory
- OnHeapStorageMemory
- OnHeapUnifiedMemory
- OffHeapExecutionMemory
- OffHeapStorageMemory
- OffHeapUnifiedMemory
- DirectPoolMemory
- MappedPoolMemory
- MinorGCCount
- MinorGCTime
- MajorGCCount
- MajorGCTime
- “ProcessTree*” 指標計數器
- ProcessTreeJVMVMemory
- ProcessTreeJVMRSSMemory
- ProcessTreePythonVMemory
- ProcessTreePythonRSSMemory
- ProcessTreeOtherVMemory
- ProcessTreeOtherRSSMemory
- 注意:“ProcessTree” 指標僅在特定條件下收集。這些條件是下述條件的邏輯 AND:
/proc
檔案系統存在,spark.executor.processTreeMetrics.enabled=true
。當這些條件未滿足時,“ProcessTree” 指標會回報 0。
- 備註
- namespace=JVMCPU
- jvmCpuTime
- namespace=NettyBlockTransfer
- shuffle-client.usedDirectMemory
- shuffle-client.usedHeapMemory
- shuffle-server.usedDirectMemory
- shuffle-server.usedHeapMemory
- 命名空間=HiveExternalCatalog
- 注意:這些指標有條件限制於組態參數:
spark.metrics.staticSources.enabled
(預設為 true) - fileCacheHits.count
- filesDiscovered.count
- hiveClientCalls.count
- parallelListingJobCount.count
- partitionsFetched.count
- 注意:這些指標有條件限制於組態參數:
- namespace=CodeGenerator
- 注意:這些指標有條件限制於組態參數:
spark.metrics.staticSources.enabled
(預設為 true) - 編譯時間 (直方圖)
- 已產生類別大小 (直方圖)
- 已產生方法大小 (直方圖)
- 原始碼大小 (直方圖)
- 注意:這些指標有條件限制於組態參數:
- 命名空間=plugin.<外掛程式類別名稱>
- 選擇性命名空間。此命名空間中的指標由使用者提供的程式碼定義,並使用 Spark 外掛程式 API 設定。請參閱下方的「進階儀器」了解如何將自訂外掛程式載入 Spark。
來源 = JVM 來源
注意事項
- 透過設定相關的
metrics.properties
檔案項目或設定檔參數來啟用此來源:spark.metrics.conf.*.source.jvm.class=org.apache.spark.metrics.source.JvmSource
- 這些指標有條件取決於設定檔參數:
spark.metrics.staticSources.enabled
(預設為 true) - 此來源可供驅動程式和執行器執行個體使用,也可供其他執行個體使用。
- 此來源提供有關 JVM 指標的資訊,使用 Dropwizard/Codahale 指標集,用於 JVM 編制,特別是指標集 BufferPoolMetricSet、GarbageCollectorMetricSet 和 MemoryUsageGaugeSet。
元件執行個體 = applicationMaster
注意:適用於在 YARN 上執行
- numContainersPendingAllocate
- numExecutorsFailed
- numExecutorsRunning
- numLocalityAwareTasks
- numReleasedContainers
元件執行個體 = mesos_cluster
注意:適用於在 mesos 上執行
- waitingDrivers
- launchedDrivers
- retryDrivers
元件執行個體 = master
注意:適用於在 Spark 獨立執行時作為主控程式執行
- workers
- aliveWorkers
- apps
- waitingApps
元件執行個體 = ApplicationSource
注意:適用於在 Spark 獨立執行時作為主控程式執行
- status
- runtime_ms
- cores
元件執行個體 = worker
注意:適用於在 Spark 獨立執行時作為工作執行
- executors
- coresUsed
- memUsed_MB
- coresFree
- memFree_MB
元件執行個體 = shuffleService
注意:適用於混排服務
- blockTransferRate (meter) - 傳輸區塊的速率
- blockTransferMessageRate (meter) - 區塊傳輸訊息的速率,例如,如果啟用批次擷取,這表示批次數,而非區塊數
- blockTransferRateBytes (meter)
- blockTransferAvgTime_1min (量規 - 1 分鐘移動平均值)
- numActiveConnections.count
- numRegisteredConnections.count
- numCaughtExceptions.count
- openBlockRequestLatencyMillis (直方圖)
- registerExecutorRequestLatencyMillis (直方圖)
- registeredExecutorsSize
- shuffle-server.usedDirectMemory
-
shuffle-server.usedHeapMemory
- 注意:當伺服器端設定
spark.shuffle.push.server.mergedShuffleFileManagerImpl
設定為org.apache.spark.network.shuffle.MergedShuffleFileManager
時,以下指標適用於基於推播的混排 - blockBytesWritten - 寫入檔案的推播區塊資料大小(以位元組為單位)
- blockAppendCollisions - 在混排服務中發生衝突的混排推播區塊數,因為正在寫入另一個區塊,以進行相同的縮減分割
- lateBlockPushes - 在特定混排合併完成後,在混排服務中接收到的混排推播區塊數
- deferredBlocks - 目前緩衝在記憶體中的遞延區塊部分數
- deferredBlockBytes - 目前緩衝在記憶體中的遞延區塊部分大小
- staleBlockPushes - 過時混排區塊推播要求數
- ignoredBlockBytes - 傳輸到 ESS 但被忽略的推播區塊資料大小。當推播區塊資料被視為已忽略時,原因如下:1. 在混排完成後收到;2. 推播要求是重複區塊;3. ESS 無法寫入區塊。
進階儀器
可以使用多種外部工具來協助分析 Spark 工作的效能
- 叢集範圍監控工具,例如 Ganglia,可以深入了解整體叢集使用率和資源瓶頸。例如,Ganglia 儀表板可以快速顯示特定工作負載是否受限於磁碟、網路或 CPU。
- 作業系統分析工具,例如 dstat、iostat 和 iotop,可以在個別節點上提供精細的分析。
- JVM 工具,例如
jstack
(提供堆疊追蹤)、jmap
(建立堆疊傾印)、jstat
(報告時間序列統計資料)和jconsole
(用於視覺化探索各種 JVM 屬性),對於熟悉 JVM 內部的人員很有用。
Spark 也提供一個外掛程式 API,以便可以將自訂儀器編碼加入 Spark 應用程式。有兩個設定檔金鑰可供載入外掛程式至 Spark
spark.plugins
spark.plugins.defaultList
這兩個金鑰都會採用以逗號分隔的類別名稱清單,這些類別名稱會實作 org.apache.spark.api.plugin.SparkPlugin
介面。這兩個名稱的存在,是為了讓其中一個清單可以放置在 Spark 預設設定檔中,讓使用者可以輕鬆從命令列加入其他外掛程式,而不會覆寫設定檔的清單。重複的外掛程式會被忽略。